diff --git a/.gitignore b/.gitignore index d2bfad92..3a23070a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ logs/ metadata_configs/ outputs/ project_folder/ - +!tests/unit/data *\~ *.DS_Store diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c820b9a3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda" +} diff --git a/README.md b/README.md index 2cbb9d99..c999411d 100644 --- a/README.md +++ b/README.md @@ -97,16 +97,16 @@ Let's start with the data format expected by sequifier. The basic data format th The two columns "sequenceId" and "itemPosition" have to be present, and then there must be at least one feature column. There can also be many feature columns, and these can be categorical or real valued. -Data of this input format can be transformed into the format that is used for model training and inference using `sequifier preprocess`, which takes this form: +Data of this input format can be transformed into the format that is used for model training and inference using `sequifier preprocess`. Preprocessing defines the physical `stored_context_width` and `max_target_offset`; training and inference choose the model-facing `context_length` from that stored capacity: -|sequenceId|subsequenceId|startItemPosition|columnName|[Subsequence Length]|[Subsequence Length - 1]|...|0| -|----------|-------------|-----------------|----------|--------------------|------------------------| - |-| -|0|0|0|column1|"high"|"high"|...|"low"| -|0|0|0|column2|12.3|10.2|...|14.9| -|...|...|...|...|...|...|...|...| -|1|0|15|column1|"medium"|"high"|...|"medium"| -|1|0|15|column2|20.6|18.5|...|21.6| -|...|...|...|...|...|...|...|...| +|sequenceId|subsequenceId|startItemPosition|leftPadLength|inputCol|[Window Length - 1]|[Window Length - 2]|...|0| +|----------|-------------|-----------------|-------------|--------|-------------------|-------------------| - |-| +|0|0|0|0|column1|"high"|"high"|...|"low"| +|0|0|0|0|column2|12.3|10.2|...|14.9| +|...|...|...|...|...|...|...|...|...| +|1|0|15|0|column1|"medium"|"high"|...|"medium"| +|1|0|15|0|column2|20.6|18.5|...|21.6| +|...|...|...|...|...|...|...|...|...| On inference, the output is returned in the library input format, introduced first. @@ -199,7 +199,7 @@ Please cite with: title = {sequifier - causal transformer models for multivariate sequence modelling}, year = {2025}, publisher = {GitHub}, - version = {v1.2.0.0}, + version = {v1.9.9.9}, url = {[https://github.com/0xideas/sequifier](https://github.com/0xideas/sequifier)} } diff --git a/docs/source/conf.py b/docs/source/conf.py index 91f64673..3d5bd0d0 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -15,7 +15,7 @@ project = 'sequifier' copyright = '2025, Leon Luithlen' author = 'Leon Luithlen' -release = 'v1.2.0.0' +release = 'v1.9.9.9' html_baseurl = 'https://www.sequifier.com/' # -- General configuration --------------------------------------------------- diff --git a/documentation/configs/hyperparameter-search.md b/documentation/configs/hyperparameter-search.md index bc890ed1..ab453dbe 100644 --- a/documentation/configs/hyperparameter-search.md +++ b/documentation/configs/hyperparameter-search.md @@ -59,7 +59,7 @@ Sequifier allows you to search not just for model parameters, but for the best * | --- | --- | --- | --- | | `input_columns` | `list[list[str]]` | **Yes** | A list of input sets. E.g., `[['col1'], ['col1', 'col2']]`. | | `target_columns` | `list[str]` | **Yes** | The target column(s) to predict. Fixed across all runs. | -| `seq_length` | `list[int]` | **Yes** | List of sequence lengths to test (e.g., `[24, 48]`). | +| `context_length` | `list[int]` | **Yes** | List of sequence lengths to test (e.g., `[24, 48]`). | | `target_column_types` | `dict` | **Yes** | Map of target columns to `categorical` or `real`. | | `column_types` | `list[dict]` | *Conditional* | Required if `input_columns` varies. List of type maps corresponding to the input sets. | @@ -134,8 +134,9 @@ Most fields here are lists for sampling, but some are scalar values fixed for al | `scheduler` | `list[dict]` | No | `[{'name': 'StepLR'...}]`| List of scheduler configs. `scheduler.step()` is only called if \< total\_steps, so correct configuration is essential. | | `scheduler_step_on` | `str` | No | `epoch` | When to step the scheduler: `epoch` or `batch`. | | `save_latest_interval_minutes`| `float`| No | `null` | Time interval to overwrite a "latest" checkpoint. | -| `save_batch_interval_minutes` | `float` | No | `null` | Time interval to save a unique, batch-specific checkpoint. | -| `save_batch_interval_minutes_val_loss` | `bool` | No | `true` | Whether to calculate validation loss at the moment of the batch interval save. | +| `save_interval_minutes` | `float` | No | `null` | Time interval to save a unique, batch-specific checkpoint. | +| `save_interval_batches` | `int` | No | `null` | Batch interval to save a unique, batch-specific checkpoint. | +| `save_interval_val_loss` | `bool` | No | `true` | Whether to calculate validation loss at the moment of the batch interval save. | | `calculate_validation_loss_on_initialization` | `bool` | No | `false` | Determines if a validation pass runs before epoch 1 begins. | | `log_interval` | `int` | No | `10` | Logging frequency (batches). | | `class_share_log_columns`| `list[str]`| No | `[]` | Columns for which to log the predicted class distribution in validation. | @@ -186,7 +187,7 @@ All other parameters are considered **Independent**. Sequifier will test every v * **Model:** `num_layers`, `dim_feedforward`, `activation_fn`, `normalization`, `norm_first`, `positional_encoding`, `attention_type`, `rope_theta`. * **Training:** `batch_size`, `dropout`, `accumulation_steps`, `optimizer`. - * **Data:** `seq_length`. + * **Data:** `context_length`. ### 3\. Special Case: `n_kv_heads` diff --git a/documentation/configs/infer.md b/documentation/configs/infer.md index 0ec62861..b4c63f53 100644 --- a/documentation/configs/infer.md +++ b/documentation/configs/infer.md @@ -40,7 +40,7 @@ These fields tell the inference engine which columns to extract from the new dat | Field | Type | Mandatory | Default | Description | | :--- | :--- | :--- | :--- | :--- | | `model_type` | `str` | **Yes** | - | `generative` (predict next value) or `embedding` (extract vector representation). | -| `seq_length` | `int` | **Yes** | - | The context window size. Must match training. | +| `context_length` | `int` | **Yes** | - | The model context window size. It must match the trained model view and fit inside the stored metadata capacity. | | `prediction_length` | `int` | No | `1` | Number of steps to predict *simultaneously*. **Must be 1** if `autoregression: true`. | | `inference_batch_size`| `int` | **Yes** | - | Number of sequences to process at once. | | `autoregression` | `bool` | No | `false` | If `true`, feeds predictions back into the model to predict further into the future. | diff --git a/documentation/configs/preprocess.md b/documentation/configs/preprocess.md index 9b42f592..283af613 100644 --- a/documentation/configs/preprocess.md +++ b/documentation/configs/preprocess.md @@ -36,17 +36,20 @@ The configuration is defined in a YAML file (e.g., `preprocess.yaml`). Below are | Field | Type | Mandatory | Default | Description | | :--- | :--- | :--- | :--- | :--- | | `selected_columns` | `list[str]` | No | `null` | A specific list of columns to process. If `null`, all columns (except metadata) are processed. | +| `column_types` | `dict[str, str]` | No | `null` | Optional output dtype map for processed columns, such as `Float32`, `Float64`, `Int32`, or `Int64`. If set, every processed column must be included. Parquet uses one unified sequence dtype; `pt` writes each variable to its configured tensor dtype. | | `max_rows` | `int` | No | `null` | Limits processing to the first N rows. Useful for rapid debugging. | | `metadata_config_path` | `Optional[str]` | No | `null` | use a preexisting metadata config path for tokenizing discrete columns and standardising real-valued columns | +| `mask_column` | `Optional[str]` | No | `null` | Optional input column used as a row-level mask. If set, `metadata_config_path` must also be set. | | `use_precomputed_maps`| `list[str]` | No | `null` | If not `null`, enforces the use of precomputed maps for the variables in the list. | ### 3\. Sequence Logic & Splitting | Field | Type | Mandatory | Default | Description | | :--- | :--- | :--- | :--- | :--- | -| `seq_length` | `int` | **Yes** | - | The length of the context window (history) fed into the model. | +| `stored_context_width` | `int` | **Yes** | - | The physical serialized window width written to preprocessed data. | +| `max_target_offset` | `int` | No | `1` | Number of future items retained after the model input window. Use `0` for BERT-style same-width inputs and targets; use `1` for causal next-item training. | | `split_ratios` | `list[float]`| **Yes** | - | Proportions for data splits (e.g., `[0.8, 0.1, 0.1]` for train/val/test). Must sum to 1.0. | -| `stride_by_split` | `list[int]` | No | `[seq_length]*N` | The step size used to slide the window for each split. Corresponds to `split_ratios`. | +| `stride_by_split` | `list[int]` | No | `[stored_context_width]*N` | The step size used to slide the window for each split. Corresponds to `split_ratios`. | | `subsequence_start_mode`| `str` | No | `distribute` | Strategy for selecting start indices (`distribute` or `exact`). | ### 4\. Performance & System @@ -71,10 +74,10 @@ The configuration is defined in a YAML file (e.g., `preprocess.yaml`). Below are This controls data augmentation and redundancy. - * **Stride = `seq_length` (Non-overlapping):** The model sees every data point exactly once as a target. Training is faster, but the model might miss patterns that cross the window boundary. + * **Stride = `context_length` (Non-overlapping):** The model sees every data point exactly once as a target. Training is faster, but the model might miss patterns that cross the window boundary. * **Stride = 1 (Maximum Overlap):** Maximizes data volume. The model sees every possible sequence. This yields the highest accuracy but significantly increases the size of the preprocessed data and training time. * **Hybrid Approach:** It is common practice to set a large stride for the training and validation splits (index 0) to reduce the size on disk of the dataset, and a stride=1 for the test split to evaluate the model on each point in the test set. This supposes that the test split value is low. - * *Example:* `stride_by_split: [24, 24, 1]` (assuming `seq_length: 48`). + * *Example:* `stride_by_split: [24, 24, 1]` (assuming `stored_context_width: 49`). ### 3\. `subsequence_start_mode`: `distribute` vs `exact` @@ -116,7 +119,7 @@ After running `preprocess`, the following are generated: ## 5\. Advanced: Custom ID Mapping -By default, Sequifier automatically generates integer IDs for categorical columns starting from index 2 (indices 0 and 1 are reserved for system use, such as "unknown" values). +By default, Sequifier automatically generates integer IDs for categorical columns starting from index 2 (indices 0 and 1 are reserved for system use, such as "[unknown]" values). If you need to enforce specific integer mappings (e.g., to maintain consistency across different training runs or datasets), you can provide **precomputed ID maps**. diff --git a/documentation/configs/train.md b/documentation/configs/train.md index 1e929b0b..a663ed46 100644 --- a/documentation/configs/train.md +++ b/documentation/configs/train.md @@ -30,7 +30,7 @@ The configuration is defined in a YAML file (e.g., `train.yaml`). The file is st | `target_columns` | `list[str]`| **Yes** | - | The specific column(s) the model should learn to predict. | | `target_column_types`| `dict` | **Yes** | - | Map of target columns to their type: `'categorical'` or `'real'`. The key order in target_column_types must exactly match the list order in target_columns | | `input_columns` | `list[str]`| No | All | Subset of columns to use as input features. Defaults to all available in metadata. | -| `seq_length` | `int` | **Yes** | - | Must match the `seq_length` used in preprocessing. | +| `context_length` | `int` | **Yes** | - | Model input context length. It must fit inside the metadata `stored_context_width` with the stored `max_target_offset`. | ### 3\. Model Architecture (`model_spec`) @@ -72,8 +72,9 @@ These fields determine the size and complexity of the Transformer. | `class_weights` | `dict` | No | `null` | Weights for specific classes (useful for imbalanced datasets). | | `save_interval_epochs` | `int` | **Yes** | - | Save a checkpoint every N epochs. | | `save_latest_interval_minutes`| `float`| No | Time interval to overwrite a "latest" checkpoint. | -| `save_batch_interval_minutes` | `float` | No | Time interval to save a unique, batch-specific checkpoint. | -| `save_batch_interval_minutes_val_loss` | `bool` | No | Whether to calculate validation loss at the moment of the batch interval save. Defaults to true. | +| `save_interval_minutes` | `float` | No | Time interval to save a unique, batch-specific checkpoint. | +| `save_interval_batches` | `int` | No | Batch interval to save a unique, batch-specific checkpoint. | +| `save_interval_val_loss` | `bool` | No | Whether to calculate validation loss at the moment of the batch interval save. Defaults to true. | | `calculate_validation_loss_on_initialization` | `bool` | No | Determines if a validation pass runs before epoch 1 begins. Defaults to true. | | `early_stopping_epochs`| `int` | No | `null` | Stop training if validation loss doesn't improve for N epochs. | | `log_interval` | `int` | No | `10` | Print training logs every N batches. | diff --git a/documentation/consolidated-docs.md b/documentation/consolidated-docs.md index 0b776e6a..35e0e293 100644 --- a/documentation/consolidated-docs.md +++ b/documentation/consolidated-docs.md @@ -97,16 +97,16 @@ Let's start with the data format expected by sequifier. The basic data format th The two columns "sequenceId" and "itemPosition" have to be present, and then there must be at least one feature column. There can also be many feature columns, and these can be categorical or real valued. -Data of this input format can be transformed into the format that is used for model training and inference using `sequifier preprocess`, which takes this form: +Data of this input format can be transformed into the format that is used for model training and inference using `sequifier preprocess`. Preprocessing defines the physical `stored_context_width` and `max_target_offset`; training and inference choose the model-facing `context_length` from that stored capacity: -|sequenceId|subsequenceId|startItemPosition|columnName|[Subsequence Length]|[Subsequence Length - 1]|...|0| -|----------|-------------|-----------------|----------|--------------------|------------------------| - |-| -|0|0|0|column1|"high"|"high"|...|"low"| -|0|0|0|column2|12.3|10.2|...|14.9| -|...|...|...|...|...|...|...|...| -|1|0|15|column1|"medium"|"high"|...|"medium"| -|1|0|15|column2|20.6|18.5|...|21.6| -|...|...|...|...|...|...|...|...| +|sequenceId|subsequenceId|startItemPosition|leftPadLength|inputCol|[Window Length - 1]|[Window Length - 2]|...|0| +|----------|-------------|-----------------|-------------|--------|-------------------|-------------------| - |-| +|0|0|0|0|column1|"high"|"high"|...|"low"| +|0|0|0|0|column2|12.3|10.2|...|14.9| +|...|...|...|...|...|...|...|...|...| +|1|0|15|0|column1|"medium"|"high"|...|"medium"| +|1|0|15|0|column2|20.6|18.5|...|21.6| +|...|...|...|...|...|...|...|...|...| On inference, the output is returned in the library input format, introduced first. @@ -199,7 +199,7 @@ Please cite with: title = {sequifier - causal transformer models for multivariate sequence modelling}, year = {2025}, publisher = {GitHub}, - version = {v1.2.0.0}, + version = {v1.9.9.9}, url = {[https://github.com/0xideas/sequifier](https://github.com/0xideas/sequifier)} } @@ -244,17 +244,20 @@ The configuration is defined in a YAML file (e.g., `preprocess.yaml`). Below are | Field | Type | Mandatory | Default | Description | | :--- | :--- | :--- | :--- | :--- | | `selected_columns` | `list[str]` | No | `null` | A specific list of columns to process. If `null`, all columns (except metadata) are processed. | +| `column_types` | `dict[str, str]` | No | `null` | Optional output dtype map for processed columns, such as `Float32`, `Float64`, `Int32`, or `Int64`. If set, every processed column must be included. Parquet uses one unified sequence dtype; `pt` writes each variable to its configured tensor dtype. | | `max_rows` | `int` | No | `null` | Limits processing to the first N rows. Useful for rapid debugging. | | `metadata_config_path` | `Optional[str]` | No | `null` | use a preexisting metadata config path for tokenizing discrete columns and standardising real-valued columns | +| `mask_column` | `Optional[str]` | No | `null` | Optional input column used as a row-level mask. If set, `metadata_config_path` must also be set. | | `use_precomputed_maps`| `list[str]` | No | `null` | If not `null`, enforces the use of precomputed maps for the variables in the list. | ### 3\. Sequence Logic & Splitting | Field | Type | Mandatory | Default | Description | | :--- | :--- | :--- | :--- | :--- | -| `seq_length` | `int` | **Yes** | - | The length of the context window (history) fed into the model. | +| `stored_context_width` | `int` | **Yes** | - | The physical serialized window width written to preprocessed data. | +| `max_target_offset` | `int` | No | `1` | Number of future items retained after the model input window. Use `0` for BERT-style same-width inputs and targets; use `1` for causal next-item training. | | `split_ratios` | `list[float]`| **Yes** | - | Proportions for data splits (e.g., `[0.8, 0.1, 0.1]` for train/val/test). Must sum to 1.0. | -| `stride_by_split` | `list[int]` | No | `[seq_length]*N` | The step size used to slide the window for each split. Corresponds to `split_ratios`. | +| `stride_by_split` | `list[int]` | No | `[stored_context_width]*N` | The step size used to slide the window for each split. Corresponds to `split_ratios`. | | `subsequence_start_mode`| `str` | No | `distribute` | Strategy for selecting start indices (`distribute` or `exact`). | ### 4\. Performance & System @@ -279,10 +282,10 @@ The configuration is defined in a YAML file (e.g., `preprocess.yaml`). Below are This controls data augmentation and redundancy. - * **Stride = `seq_length` (Non-overlapping):** The model sees every data point exactly once as a target. Training is faster, but the model might miss patterns that cross the window boundary. + * **Stride = `context_length` (Non-overlapping):** The model sees every data point exactly once as a target. Training is faster, but the model might miss patterns that cross the window boundary. * **Stride = 1 (Maximum Overlap):** Maximizes data volume. The model sees every possible sequence. This yields the highest accuracy but significantly increases the size of the preprocessed data and training time. * **Hybrid Approach:** It is common practice to set a large stride for the training and validation splits (index 0) to reduce the size on disk of the dataset, and a stride=1 for the test split to evaluate the model on each point in the test set. This supposes that the test split value is low. - * *Example:* `stride_by_split: [24, 24, 1]` (assuming `seq_length: 48`). + * *Example:* `stride_by_split: [24, 24, 1]` (assuming `stored_context_width: 49`). ### 3\. `subsequence_start_mode`: `distribute` vs `exact` @@ -324,7 +327,7 @@ After running `preprocess`, the following are generated: ## 5\. Advanced: Custom ID Mapping -By default, Sequifier automatically generates integer IDs for categorical columns starting from index 2 (indices 0 and 1 are reserved for system use, such as "unknown" values). +By default, Sequifier automatically generates integer IDs for categorical columns starting from index 2 (indices 0 and 1 are reserved for system use, such as "[unknown]" values). If you need to enforce specific integer mappings (e.g., to maintain consistency across different training runs or datasets), you can provide **precomputed ID maps**. @@ -377,7 +380,7 @@ The configuration is defined in a YAML file (e.g., `train.yaml`). The file is st | `target_columns` | `list[str]`| **Yes** | - | The specific column(s) the model should learn to predict. | | `target_column_types`| `dict` | **Yes** | - | Map of target columns to their type: `'categorical'` or `'real'`. The key order in target_column_types must exactly match the list order in target_columns | | `input_columns` | `list[str]`| No | All | Subset of columns to use as input features. Defaults to all available in metadata. | -| `seq_length` | `int` | **Yes** | - | Must match the `seq_length` used in preprocessing. | +| `context_length` | `int` | **Yes** | - | Model input context length. It must fit inside the metadata `stored_context_width` with the stored `max_target_offset`. | ### 3\. Model Architecture (`model_spec`) @@ -419,8 +422,9 @@ These fields determine the size and complexity of the Transformer. | `class_weights` | `dict` | No | `null` | Weights for specific classes (useful for imbalanced datasets). | | `save_interval_epochs` | `int` | **Yes** | - | Save a checkpoint every N epochs. | | `save_latest_interval_minutes`| `float`| No | Time interval to overwrite a "latest" checkpoint. | -| `save_batch_interval_minutes` | `float` | No | Time interval to save a unique, batch-specific checkpoint. | -| `save_batch_interval_minutes_val_loss` | `bool` | No | Whether to calculate validation loss at the moment of the batch interval save. Defaults to true. | +| `save_interval_minutes` | `float` | No | Time interval to save a unique, batch-specific checkpoint. | +| `save_interval_batches` | `int` | No | Batch interval to save a unique, batch-specific checkpoint. | +| `save_interval_val_loss` | `bool` | No | Whether to calculate validation loss at the moment of the batch interval save. Defaults to true. | | `calculate_validation_loss_on_initialization` | `bool` | No | Determines if a validation pass runs before epoch 1 begins. Defaults to true. | | `early_stopping_epochs`| `int` | No | `null` | Stop training if validation loss doesn't improve for N epochs. | | `log_interval` | `int` | No | `10` | Print training logs every N batches. | @@ -602,7 +606,7 @@ These fields tell the inference engine which columns to extract from the new dat | Field | Type | Mandatory | Default | Description | | :--- | :--- | :--- | :--- | :--- | | `model_type` | `str` | **Yes** | - | `generative` (predict next value) or `embedding` (extract vector representation). | -| `seq_length` | `int` | **Yes** | - | The context window size. Must match training. | +| `context_length` | `int` | **Yes** | - | The model context window size. It must match the trained model view and fit inside the stored metadata capacity. | | `prediction_length` | `int` | No | `1` | Number of steps to predict *simultaneously*. **Must be 1** if `autoregression: true`. | | `inference_batch_size`| `int` | **Yes** | - | Number of sequences to process at once. | | `autoregression` | `bool` | No | `false` | If `true`, feeds predictions back into the model to predict further into the future. | @@ -786,7 +790,7 @@ Sequifier allows you to search not just for model parameters, but for the best * | --- | --- | --- | --- | | `input_columns` | `list[list[str]]` | **Yes** | A list of input sets. E.g., `[['col1'], ['col1', 'col2']]`. | | `target_columns` | `list[str]` | **Yes** | The target column(s) to predict. Fixed across all runs. | -| `seq_length` | `list[int]` | **Yes** | List of sequence lengths to test (e.g., `[24, 48]`). | +| `context_length` | `list[int]` | **Yes** | List of sequence lengths to test (e.g., `[24, 48]`). | | `target_column_types` | `dict` | **Yes** | Map of target columns to `categorical` or `real`. | | `column_types` | `list[dict]` | *Conditional* | Required if `input_columns` varies. List of type maps corresponding to the input sets. | @@ -861,8 +865,9 @@ Most fields here are lists for sampling, but some are scalar values fixed for al | `scheduler` | `list[dict]` | No | `[{'name': 'StepLR'...}]`| List of scheduler configs. `scheduler.step()` is only called if \< total\_steps, so correct configuration is essential. | | `scheduler_step_on` | `str` | No | `epoch` | When to step the scheduler: `epoch` or `batch`. | | `save_latest_interval_minutes`| `float`| No | `null` | Time interval to overwrite a "latest" checkpoint. | -| `save_batch_interval_minutes` | `float` | No | `null` | Time interval to save a unique, batch-specific checkpoint. | -| `save_batch_interval_minutes_val_loss` | `bool` | No | `true` | Whether to calculate validation loss at the moment of the batch interval save. | +| `save_interval_minutes` | `float` | No | `null` | Time interval to save a unique, batch-specific checkpoint. | +| `save_interval_batches` | `int` | No | `null` | Batch interval to save a unique, batch-specific checkpoint. | +| `save_interval_val_loss` | `bool` | No | `true` | Whether to calculate validation loss at the moment of the batch interval save. | | `calculate_validation_loss_on_initialization` | `bool` | No | `false` | Determines if a validation pass runs before epoch 1 begins. | | `log_interval` | `int` | No | `10` | Logging frequency (batches). | | `class_share_log_columns`| `list[str]`| No | `[]` | Columns for which to log the predicted class distribution in validation. | @@ -913,7 +918,7 @@ All other parameters are considered **Independent**. Sequifier will test every v * **Model:** `num_layers`, `dim_feedforward`, `activation_fn`, `normalization`, `norm_first`, `positional_encoding`, `attention_type`, `rope_theta`. * **Training:** `batch_size`, `dropout`, `accumulation_steps`, `optimizer`. - * **Data:** `seq_length`. + * **Data:** `context_length`. ### 3\. Special Case: `n_kv_heads` diff --git a/documentation/demos/self-contained-example.ipynb b/documentation/demos/self-contained-example.ipynb index 27cc4893..80c2a59b 100644 --- a/documentation/demos/self-contained-example.ipynb +++ b/documentation/demos/self-contained-example.ipynb @@ -173,7 +173,7 @@ " \"write_format\": \"parquet\",\n", " \"selected_columns\": [\"targetToken\"],\n", " \"split_ratios\": [0.8, 0.1, 0.1], # Train, Val, Test\n", - " \"seq_length\": 10, # Lookback window\n", + " \"context_length\": 10, # Lookback window\n", " \"stride_by_split\": [1, 1, 1], # Dense sampling\n", " \"max_rows\": None,\n", " \"seed\": 42,\n", @@ -199,7 +199,7 @@ " \"input_columns\": [\"targetToken\"],\n", " \"target_columns\": [\"targetToken\"],\n", " \"target_column_types\": {\"targetToken\": \"categorical\"},\n", - " \"seq_length\": 10,\n", + " \"context_length\": 10,\n", " \"inference_batch_size\": 10,\n", " \"export_generative_model\": True,\n", " \"export_embedding_model\": False,\n", @@ -257,7 +257,7 @@ " \"output_probabilities\": False,\n", " \"map_to_id\": True, # Map integer classes back to original values (e.g., \"1\", \"2\")\n", " \"device\": \"cuda\" if torch.cuda.is_available() else \"cpu\",\n", - " \"seq_length\": 10,\n", + " \"context_length\": 10,\n", " \"inference_batch_size\": 10,\n", " \"autoregression\": True,\n", " \"autoregression_total_steps\": 5, # Predict 5 steps into the future\n", diff --git a/hooks/consolidate_docs.py b/hooks/consolidate_docs.py index 324b8426..8426f6f5 100644 --- a/hooks/consolidate_docs.py +++ b/hooks/consolidate_docs.py @@ -2,7 +2,6 @@ import sys from pathlib import Path -# 1. Define the exact order of files to read FILES_TO_READ = [ "README.md", "documentation/configs/preprocess.md", @@ -19,7 +18,6 @@ def main(): consolidated_content = [] - # 2. Read contents for filepath in FILES_TO_READ: path = Path(filepath) if not path.is_file(): @@ -28,23 +26,19 @@ def main(): consolidated_content.append(path.read_text(encoding="utf-8")) - # 3. Join with newlines to preserve markdown structure between files final_content = "\n\n".join(consolidated_content) output_path = Path(OUTPUT_FILE) - # 4. Check current content to avoid failing the hook if nothing changed current_content = "" if output_path.is_file(): current_content = output_path.read_text(encoding="utf-8") - # 5. Write and exit with status code 1 if an update was needed if current_content != final_content: - # Ensure the output directory exists output_path.parent.mkdir(parents=True, exist_ok=True) output_path.write_text(final_content, encoding="utf-8") print(f"Hook updated {OUTPUT_FILE}") - sys.exit(1) # pre-commit requires a non-zero exit code when a file is modified + sys.exit(1) if __name__ == "__main__": diff --git a/hooks/correct_docs_version.py b/hooks/correct_docs_version.py index 655e3328..2edd6763 100755 --- a/hooks/correct_docs_version.py +++ b/hooks/correct_docs_version.py @@ -1,24 +1,15 @@ #!/usr/bin/env python -""" -Compares the project version in: -1. pyproject.toml (project.version or tool.poetry.version) -2. docs/source/conf.py (release = "...") -3. README.md (BibTeX citation version = {...}) - -Exits with a non-zero status code if they do not ALL match exactly. -""" +"""Require pyproject, docs conf, and README citation versions to match.""" import re import sys from pathlib import Path -# --- Configuration --- ROOT_DIR = Path(__file__).parent.parent PYPROJECT_PATH = ROOT_DIR / "pyproject.toml" CONF_PATH = ROOT_DIR / "docs/source/conf.py" README_PATH = ROOT_DIR / "README.md" -# --------------------- try: try: @@ -31,17 +22,15 @@ def get_toml_version() -> str | None: - """Fetches version from pyproject.toml.""" + """Read pyproject version.""" if not PYPROJECT_PATH.exists(): return None try: data = tomllib.loads(PYPROJECT_PATH.read_text(encoding="utf-8")) - # Check standard PEP 621 val = None if "project" in data and "version" in data["project"]: val = data["project"]["version"] - # Check Poetry elif ( "tool" in data and "poetry" in data["tool"] @@ -55,12 +44,11 @@ def get_toml_version() -> str | None: def get_conf_version() -> str | None: - """Fetches release from docs/source/conf.py.""" + """Read docs release version.""" if not CONF_PATH.exists(): return None try: content = CONF_PATH.read_text(encoding="utf-8") - # Regex for: release = "..." or release = '...' match = re.search(r"^release\s*=\s*['\"]([^'\"]+)['\"]", content, re.MULTILINE) return match.group(1).strip() if match else None except Exception: @@ -68,13 +56,11 @@ def get_conf_version() -> str | None: def get_readme_version() -> str | None: - """Fetches version from README.md BibTeX citation.""" + """Read README BibTeX version.""" if not README_PATH.exists(): return None try: content = README_PATH.read_text(encoding="utf-8") - # Regex for BibTeX: version = {1.0.0} or version = "1.0.0" - # Captures the content inside the first { } or " " encountered after 'version =' match = re.search(r"version\s*=\s*[{\"]([^}\"]+)[}\"]", content) return match.group(1).strip() if match else None except Exception: @@ -88,12 +74,10 @@ def main(): v_conf = get_conf_version() v_readme = get_readme_version() - # 1. Print detected versions for transparency print(f" pyproject.toml: '{v_toml}'") print(f" docs/conf.py: '{v_conf}'") print(f" README.md: '{v_readme}'") - # 2. Check for missing versions if v_toml is None or v_conf is None or v_readme is None: print( "\n❌ Error: Could not extract version from one or more files.", @@ -101,7 +85,6 @@ def main(): ) sys.exit(1) - # 3. Check for exact equality if v_toml == v_conf == v_readme: print("\n✅ All versions match.") sys.exit(0) diff --git a/hooks/validate_docs_deps.py b/hooks/validate_docs_deps.py index 46c434ed..44866309 100755 --- a/hooks/validate_docs_deps.py +++ b/hooks/validate_docs_deps.py @@ -2,30 +2,20 @@ import sys from pathlib import Path -# --- Configuration --- PYPROJECT_PATH = Path("./pyproject.toml") WORKFLOW_PATH = Path("./.github/workflows/docs.yml") def normalize_dep(dep_string): - """ - Removes whitespace, quotes, and trailing commas for consistent comparison. - Example: ' "polars>= 1.0" ' -> 'polars>=1.0' - """ - # Remove single and double quotes + """Normalize dependency strings for comparison.""" s = dep_string.replace('"', "").replace("'", "") - # Remove all whitespace s = "".join(s.split()) - # Remove trailing commas if present s = s.rstrip(",") return s def parse_pyproject_toml(file_path): - """ - Extracts dependencies from the [project] dependencies list. - We use a simple state parser to avoid requiring 'tomli' on Python < 3.11. - """ + """Parse project dependency strings without tomli.""" deps = set() if not file_path.exists(): print(f"Error: {file_path} not found.") @@ -39,18 +29,15 @@ def parse_pyproject_toml(file_path): for line in lines: stripped = line.strip() - # Detect start of dependencies block if stripped.startswith("dependencies = ["): in_dependencies = True continue - # Detect end of block if in_dependencies and stripped.startswith("]"): in_dependencies = False break if in_dependencies: - # Ignore empty lines or comments inside the block if not stripped or stripped.startswith("#"): continue @@ -62,10 +49,7 @@ def parse_pyproject_toml(file_path): def parse_workflow_yml(file_path): - """ - Extracts dependencies specifically from the 'pip install \' block - in the Install dependencies step. - """ + """Parse docs workflow pip-install dependency strings.""" deps = set() if not file_path.exists(): print(f"Error: {file_path} not found.") @@ -79,20 +63,16 @@ def parse_workflow_yml(file_path): for line in lines: stripped = line.strip() - # Logic to find the specific pip install block that uses line continuation - # We look for 'pip install \' but exclude 'pip install -r' lines if "pip install \\" in line and "-r " not in line: in_pip_block = True continue if in_pip_block: - # If the line contains a quoted string, it's a dependency if '"' in line or "'" in line: normalized = normalize_dep(stripped.rstrip("\\")) if normalized: deps.add(normalized) - # If the line does not end with a backslash, the multiline command is over if not line.rstrip().endswith("\\"): in_pip_block = False @@ -105,10 +85,8 @@ def main(): toml_deps = parse_pyproject_toml(PYPROJECT_PATH) yml_deps = parse_workflow_yml(WORKFLOW_PATH) - # 1. Check for items in TOML but missing in YAML missing_in_yml = toml_deps - yml_deps - # 2. Check for items in YAML but missing in TOML missing_in_toml = yml_deps - toml_deps if not missing_in_yml and not missing_in_toml: diff --git a/pyproject.toml b/pyproject.toml index 7a561108..70f90047 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "sequifier" -version = "v1.2.0.0" +version = "v1.9.9.9" authors = [ { name = "Leon Luithlen", email = "leontimnaluithlen@gmail.com" }, ] diff --git a/pyrightconfig.json b/pyrightconfig.json index c2481558..2413032c 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -1,4 +1,5 @@ { "reportMissingImports": false, - "reportMissingModuleSource": false -} \ No newline at end of file + "reportMissingModuleSource": false, + "useLibraryCodeForTypes": true +} diff --git a/src/sequifier/config/hyperparameter_search_config.py b/src/sequifier/config/hyperparameter_search_config.py index 0659abf6..122b48f8 100644 --- a/src/sequifier/config/hyperparameter_search_config.py +++ b/src/sequifier/config/hyperparameter_search_config.py @@ -8,23 +8,28 @@ from loguru import logger from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from sequifier.config.probabilities import ProbabilityDistribution from sequifier.config.train_config import ( + BERTSpecModel, DotDict, ModelSpecModel, + ReplacementDistribution, TrainingSpecModel, TrainModel, ) -from sequifier.helpers import normalize_path, try_catch_excess_keys +from sequifier.helpers import ( + ModelWindowView, + StoredWindowLayout, + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, + try_catch_excess_keys, +) +from sequifier.special_tokens import validate_special_token_ids class FloatDistribution(BaseModel): - """Pydantic model representing a floating-point hyperparameter distribution for Optuna. - - Attributes: - low (float): The lower bound of the distribution. - high (float): The upper bound of the distribution. - log (bool): If True, sample from the distribution in the log domain. Defaults to False. - """ + """Optuna float range with optional step/log sampling.""" low: float high: float @@ -42,14 +47,7 @@ def validate_step_and_log(self): class IntDistribution(BaseModel): - """Pydantic model representing an integer hyperparameter distribution for Optuna. - - Attributes: - low (int): The lower bound of the distribution. - high (int): The upper bound of the distribution. - step (int): The spacing between valid integer values. Defaults to 1. - log (bool): If True, sample from the distribution in the log domain. Defaults to False. - """ + """Optuna integer range with step/log sampling.""" low: int high: int @@ -70,26 +68,66 @@ def validate_step_and_log(self): OptunaInt = Union[list[int], IntDistribution] +def sample_param( + trial: Any, + name: str, + space: Union[list, FloatDistribution, IntDistribution], +): + if isinstance(space, list): + return trial.suggest_categorical(name, space) + if isinstance(space, FloatDistribution): + return trial.suggest_float( + name, space.low, space.high, step=space.step, log=space.log + ) + if isinstance(space, IntDistribution): + return trial.suggest_int( + name, space.low, space.high, step=space.step, log=space.log + ) + raise TypeError(f"Unsupported hyperparameter search space for {name}: {space}") + + +class BERTSpecHyperparameterSampling(BaseModel): + """Search space for BERT objective masking parameters.""" + + model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") + + masking_probability: OptunaFloat + replacement_distribution: list[ReplacementDistribution] + span_masking: list[ProbabilityDistribution] + + def sample_trial(self, trial: Any) -> BERTSpecModel: + masking_probability = sample_param( + trial, "bert_masking_probability", self.masking_probability + ) + replacement_distribution_index = trial.suggest_categorical( + "bert_replacement_distribution_index", + list(range(len(self.replacement_distribution))), + ) + span_masking_index = trial.suggest_categorical( + "bert_span_masking_index", list(range(len(self.span_masking))) + ) + + replacement_distribution = self.replacement_distribution[ + replacement_distribution_index + ].model_copy(deep=True) # type: ignore + span_masking = self.span_masking[span_masking_index].model_copy(deep=True) # type: ignore + + logger.info( + f"{masking_probability = } - {replacement_distribution = } - {span_masking = }" + ) + + return BERTSpecModel( + masking_probability=masking_probability, + replacement_distribution=replacement_distribution, + span_masking=span_masking, + ) + + @beartype def load_hyperparameter_search_config( config_path: str, skip_metadata: bool ) -> "HyperparameterSearchConfig": - """Load a hyperparameter search configuration from a YAML file. - - This function reads a YAML configuration file, processes it to include - data-driven configurations if needed, and returns a HyperparameterSearchConfig - object. - - Args: - config_path: The path to the hyperparameter search configuration file. - skip_metadata: A boolean flag indicating whether the configuration is - for unprocessed data. If False, it will load and integrate - data-driven configurations. - - Returns: - An instance of the HyperparameterSearchConfig class, populated with the - configuration from the file. - """ + """Load hyperparameter-search YAML plus optional metadata-derived fields.""" with open(config_path, "r") as f: config_values = yaml.safe_load(f) @@ -101,6 +139,11 @@ def load_hyperparameter_search_config( ) as f: metadata_config = json.loads(f.read()) + validate_special_token_ids( + metadata_config["special_token_ids"], + source=f"metadata config '{metadata_config_path}'", + ) + config_values["column_types"] = config_values.get( "column_types", [metadata_config["column_types"]] ) @@ -132,6 +175,16 @@ def load_hyperparameter_search_config( config_values["n_classes"] = config_values.get( "n_classes", metadata_config["n_classes"] ) + + storage_layout = stored_window_layout_from_metadata(metadata_config) + if storage_layout.version != 2: + raise ValueError( + "Hyperparameter search requires metadata stored_window_layout_version=2, " + f"got {storage_layout.version}." + ) + + config_values["storage_layout"] = storage_layout + config_values["training_data_path"] = normalize_path( config_values.get("training_data_path", metadata_config["split_paths"][0]), config_values["project_root"], @@ -152,38 +205,7 @@ def load_hyperparameter_search_config( class TrainingSpecHyperparameterSampling(BaseModel): - """Pydantic model for training specification hyperparameter sampling. - - Attributes: - device: The device to train on (e.g., 'cuda', 'cpu'). - epochs: A list of possible numbers of epochs to train for. - log_interval: The interval in batches for logging. - class_share_log_columns: Columns for which to log class share. - early_stopping_epochs: Number of epochs for early stopping. - save_interval_epochs: Interval in epochs for saving model checkpoints. - save_latest_interval_minutes: the time interval in which a checkpoint is written to the "latest" checkpoint path - save_batch_interval_minutes: the time interval in which a checkpoint is written to a unique checkpoint path - save_batch_interval_minutes_val_loss: calculate val loss at the moment of batch interval saving - calculate_validation_loss_on_initialization: calculate val loss on weight initialization - batch_size: A list of possible batch sizes. - learning_rate: A list of possible learning rates. - criterion: A dictionary mapping target columns to loss functions. - class_weights: Optional dictionary mapping columns to class weights. - accumulation_steps: A list of possible gradient accumulation steps. - dropout: A list of possible dropout rates. - loss_weights: Optional dictionary mapping columns to loss weights. - optimizer: A list of possible optimizer configurations. - scheduler: A list of possible scheduler configurations. - continue_training: Flag to continue training from a checkpoint. - layer_type_dtypes: Dictionary mapping layer types (linear, embedding, norm) to dtypes (bfloat16, float8_e4m3fn). - layer_autocast: Whether to use autocast - sampling_strategy: data sampling in distributed training: 'exact', 'oversampling' or 'undersampling' - data_parallelism: 'DDP' or 'FSDP' - fsdp_cpu_offload: fsdp cpu offload - torch_compile: compile entire model ('outer') or transformer layers ('inner') with torch.compile, alternatively 'none' - float32_matmul_precision: precision level of float32 computations. One of 'highest', 'high' and 'medium' - - """ + """Training-spec search space with paired LR/scheduler candidates.""" model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") @@ -194,12 +216,15 @@ class TrainingSpecHyperparameterSampling(BaseModel): early_stopping_epochs: Optional[int] = None save_interval_epochs: int save_latest_interval_minutes: Optional[float] = None - save_batch_interval_minutes: Optional[float] = None - save_batch_interval_minutes_val_loss: bool = True + save_interval_minutes: Optional[float] = None + save_interval_val_loss: bool = True + save_interval_batches: Optional[int] = None calculate_validation_loss_on_initialization: bool = False + training_objective: list[str] = Field(default_factory=lambda: ["causal"]) batch_size: OptunaInt learning_rate: list[float] # Kept as list to preserve coupling with epochs + bert_spec: Optional[BERTSpecHyperparameterSampling] = None criterion: dict[str, str] class_weights: Optional[dict[str, list[float]]] = None accumulation_steps: OptunaInt @@ -232,17 +257,7 @@ class TrainingSpecHyperparameterSampling(BaseModel): float32_matmul_precision: str = "highest" def __init__(self, **kwargs): - """Initialize the TrainingSpecHyperparameterSampling instance. - - This method initializes the Pydantic BaseModel and then processes the - optimizer and scheduler configurations from the provided keyword - arguments, converting them into DotDict objects. - - Args: - **kwargs: Keyword arguments that correspond to the attributes of this - class. The 'optimizer' and 'scheduler' arguments are expected - to be lists of dictionaries. - """ + """Normalize optimizer/scheduler dicts after Pydantic validation.""" super().__init__( **{k: v for k, v in kwargs.items() if k not in ["optimizer", "scheduler"]} ) @@ -259,6 +274,30 @@ def __init__(self, **kwargs): DotDict(scheduler_config) for scheduler_config in kwargs["scheduler"] ] + @field_validator("training_objective", mode="before") + @classmethod + def normalize_training_objective(cls, v): + if isinstance(v, str): + return [v] + return v + + @field_validator("training_objective") + @classmethod + def validate_training_objective(cls, v): + allowed = {"causal", "bert"} + invalid = set(v).difference(allowed) + if invalid: + raise ValueError(f"Only 'causal' and 'bert' are allowed, found {invalid}") + return v + + @model_validator(mode="after") + def validate_bert_spec(self): + if "bert" in self.training_objective and self.bert_spec is None: + raise ValueError( + "If 'bert' is in training_objective, bert_spec must be configured." + ) + return self + @field_validator("layer_type_dtypes") @classmethod def validate_layer_type_dtypes(cls, v): @@ -319,18 +358,7 @@ def validate_scheduler_config(cls, v, info_dict): return v def sample_trial(self, trial: Any) -> TrainingSpecModel: - """Samples training hyperparameters using an Optuna trial. - - This method leverages the provided Optuna trial to suggest values for - hyperparameters like batch size, dropout, and learning rate based on the - defined search spaces (categorical lists or distributions). - - Args: - trial (Any): The Optuna trial object used for suggesting hyperparameters. - - Returns: - TrainingSpecModel: A populated training specification model with the sampled hyperparameters. - """ + """Sample training hyperparameters for one Optuna trial.""" lr_sched_index = trial.suggest_categorical( "lr_sched_index", list(range(len(self.learning_rate))) ) @@ -343,29 +371,27 @@ def sample_trial(self, trial: Any) -> TrainingSpecModel: ) optimizer = self.optimizer[opt_index] - def sample_param( - name: str, space: Union[list, FloatDistribution, IntDistribution] - ): - if isinstance(space, list): - return trial.suggest_categorical(name, space) - elif isinstance(space, FloatDistribution): - return trial.suggest_float( - name, space.low, space.high, step=space.step, log=space.log - ) - elif isinstance(space, IntDistribution): - return trial.suggest_int( - name, space.low, space.high, step=space.step, log=space.log - ) + training_objective = trial.suggest_categorical( + "training_objective", self.training_objective + ) + bert_spec = ( + self.bert_spec.sample_trial(trial) + if training_objective == "bert" and self.bert_spec is not None + else None + ) - batch_size = sample_param("batch_size", self.batch_size) - dropout = sample_param("dropout", self.dropout) - accumulation_steps = sample_param("accumulation_steps", self.accumulation_steps) + batch_size = sample_param(trial, "batch_size", self.batch_size) + dropout = sample_param(trial, "dropout", self.dropout) + accumulation_steps = sample_param( + trial, "accumulation_steps", self.accumulation_steps + ) logger.info( - f"{learning_rate = } - {batch_size = } - {dropout = } - {optimizer = }" + f"{training_objective = } - {learning_rate = } - {batch_size = } - {dropout = } - {optimizer = }" ) return TrainingSpecModel( + training_objective=training_objective, device=self.device, epochs=epochs, log_interval=self.log_interval, @@ -373,13 +399,15 @@ def sample_param( early_stopping_epochs=self.early_stopping_epochs, save_interval_epochs=self.save_interval_epochs, save_latest_interval_minutes=self.save_latest_interval_minutes, - save_batch_interval_minutes=self.save_batch_interval_minutes, - save_batch_interval_minutes_val_loss=self.save_batch_interval_minutes_val_loss, + save_interval_minutes=self.save_interval_minutes, + save_interval_batches=self.save_interval_batches, + save_interval_val_loss=self.save_interval_val_loss, calculate_validation_loss_on_initialization=self.calculate_validation_loss_on_initialization, batch_size=batch_size, learning_rate=learning_rate, criterion=self.criterion, class_weights=self.class_weights, + bert_spec=bert_spec, accumulation_steps=accumulation_steps, dropout=dropout, loss_weights=self.loss_weights, @@ -406,17 +434,7 @@ def sample_param( class ModelSpecHyperparameterSampling(BaseModel): - """Pydantic model for model specification hyperparameter sampling. - - Attributes: - initial_embedding_dim: A list of possible sizes for the initial input embedding. - feature_embedding_dims: A list of possible dictionaries defining embedding dimensions for each input column. - joint_embedding_dim: A list of possible sizes for the joint embedding layer projection. - dim_model: A list of possible numbers of expected features in the input (d_model). - n_head: A list of possible numbers of heads in the multi-head attention models. - dim_feedforward: A list of possible dimensions of the feedforward network model. - num_layers: A list of possible numbers of layers in the transformer model. - """ + """Model-architecture search space with paired width choices.""" initial_embedding_dim: list[int] joint_embedding_dim: list[Optional[int]] @@ -471,19 +489,7 @@ def validate_model_spec(cls, v, info): return v def sample_trial(self, trial: Any) -> ModelSpecModel: - """Samples model architecture hyperparameters using an Optuna trial. - - This method uses the Optuna trial to suggest structural parameters such as - the number of layers, feedforward dimensions, and attention heads. It ensures - that dependent dimensions (like `n_head` and `dim_model`) stay correctly paired - and that invalid key-value head combinations are filtered out. - - Args: - trial (Any): The Optuna trial object used for suggesting hyperparameters. - - Returns: - ModelSpecModel: A populated model specification model with the sampled architecture parameters. - """ + """Sample architecture hyperparameters for one Optuna trial.""" dim_model_idx = trial.suggest_categorical( "dim_model_idx", list(range(len(self.dim_model))) ) @@ -498,23 +504,9 @@ def sample_trial(self, trial: Any) -> ModelSpecModel: else self.feature_embedding_dims[dim_model_idx] ) - def sample_param( - name: str, space: Union[list, FloatDistribution, IntDistribution] - ): - if isinstance(space, list): - return trial.suggest_categorical(name, space) - elif isinstance(space, FloatDistribution): - return trial.suggest_float( - name, space.low, space.high, step=space.step, log=space.log - ) - elif isinstance(space, IntDistribution): - return trial.suggest_int( - name, space.low, space.high, step=space.step, log=space.log - ) - - dim_feedforward = sample_param("dim_feedforward", self.dim_feedforward) - num_layers = sample_param("num_layers", self.num_layers) - rope_theta = sample_param("rope_theta", self.rope_theta) + dim_feedforward = sample_param(trial, "dim_feedforward", self.dim_feedforward) + num_layers = sample_param(trial, "num_layers", self.num_layers) + rope_theta = sample_param(trial, "rope_theta", self.rope_theta) activation_fn = trial.suggest_categorical("activation_fn", self.activation_fn) normalization = trial.suggest_categorical("normalization", self.normalization) @@ -564,43 +556,13 @@ def sample_param( class HyperparameterSearchConfig(BaseModel): - """Pydantic model for hyperparameter search configuration. - - Attributes: - project_root: The path to the sequifier project directory. - metadata_config_path: The path to the data-driven configuration file. - hp_search_name: The name for the hyperparameter search. - search_strategy: The search strategy, either "sample" or "grid". - n_samples: The number of samples to draw for the search. - model_config_write_path: The path to write the model configurations to. - training_data_path: The path to the training data. - validation_data_path: The path to the validation data. - read_format: The file format of the input data. - input_columns: A list of lists of columns to be used for training. - column_types: A list of dictionaries mapping columns to their types. - categorical_columns: A list of lists of categorical columns. - real_columns: A list of lists of real-valued columns. - target_columns: The list of target columns for model training. - target_column_types: A dictionary mapping target columns to their types. - id_maps: A dictionary mapping categorical values to their indexed representation. - seq_length: A list of possible sequence lengths. - n_classes: The number of classes for each categorical column. - inference_batch_size: The batch size for inference. - export_onnx: If True, exports the model in ONNX format. - export_pt: If True, exports the model using torch.save. - export_with_dropout: If True, exports the model with dropout enabled. - model_hyperparameter_sampling: The sampling configuration for model hyperparameters. - training_hyperparameter_sampling: The sampling configuration for training hyperparameters. - evaluation_inference_config: The inference config to infer on for hyperparameter search optimization - evaluation_script: The script that outputs the evaluation metrics, typically from the inference output - evaluation_metrics: The evaluation metrics to optimize during hyperparameter search - evaluation_metric_directions: The direction to optimize evaluation_metrics in. Only 'minimize' and 'maximize' are allowed - """ + """Top-level Optuna search config.""" project_root: str metadata_config_path: str hp_search_name: str search_strategy: str = "bayesian" + seed: Optional[int] = None n_trials: Optional[int] = Field(None, alias="n_samples") prune_trials: Optional[bool] = True model_config_write_path: str @@ -616,7 +578,8 @@ class HyperparameterSearchConfig(BaseModel): target_column_types: dict[str, str] id_maps: dict[str, dict[str | int, int]] - seq_length: list[int] + context_length: list[int] + storage_layout: StoredWindowLayout n_classes: dict[str, int] inference_batch_size: int @@ -636,6 +599,27 @@ class HyperparameterSearchConfig(BaseModel): override_input: bool = False + @model_validator(mode="after") + def validate_sequence_layout(self): + for cl in self.context_length: + if ( + cl + self.storage_layout.max_target_offset + > self.storage_layout.stored_context_width + ): + raise ValueError( + f"Window capacity mismatch: context_length ({cl}) + max_target_offset " + f"({self.storage_layout.max_target_offset}) > stored_context_width ({self.storage_layout.stored_context_width}). " + "Model inputs cannot exceed the preprocessed sequence length." + ) + if self.training_hyperparameter_sampling.training_objective == "causal": + if self.storage_layout.max_target_offset < 1: + raise ValueError( + "The hyperparameter search space includes the 'causal' objective, " + "but the preprocessed dataset has max_target_offset=0. " + "Causal modeling requires max_target_offset >= 1." + ) + return self + @model_validator(mode="after") def validate_prune_trials(self): if self.prune_trials and self.training_hyperparameter_sampling.distributed: @@ -720,28 +704,29 @@ def validate_search_strategy(cls, v: str) -> str: return v def sample_trial(self, trial: Any, run_index: int) -> TrainModel: - """Generates a complete training configuration using an Optuna trial. - - This method orchestrates the sampling of both model and training specifications, - as well as data sequence parameters, combining them into a final configuration - ready for model execution. - - Args: - trial (Any): The Optuna trial object used for suggesting hyperparameters. - run_index (int): The current run/trial index, used to assign a unique name to the model. - - Returns: - TrainModel: A fully populated configuration instance for the current trial. - """ + """Sample a concrete TrainModel for one trial/run index.""" model_spec = self.model_hyperparameter_sampling.sample_trial(trial) - training_spec = self.training_hyperparameter_sampling.sample_trial(trial) input_columns_index = trial.suggest_categorical( "input_columns_index", list(range(len(self.input_columns))) ) - seq_length = trial.suggest_categorical("seq_length", self.seq_length) + context_length = trial.suggest_categorical( + "context_length", self.context_length + ) + training_spec = self.training_hyperparameter_sampling.sample_trial(trial) + if training_spec.training_objective == "bert": + model_spec = model_spec.model_copy( + update={"prediction_length": context_length} + ) + + window_view = ModelWindowView( + context_length=context_length, + objective=training_spec.training_objective, + target_offset=0 if training_spec.training_objective == "bert" else 1, + ) + resolve_window_view(self.storage_layout, window_view) - logger.info(f"{input_columns_index = } - {seq_length = }") + logger.info(f"{input_columns_index = } - {context_length = }") return TrainModel( project_root=self.project_root, @@ -757,7 +742,8 @@ def sample_trial(self, trial: Any, run_index: int) -> TrainModel: target_columns=self.target_columns, target_column_types=self.target_column_types, id_maps=self.id_maps, - seq_length=seq_length, + storage_layout=self.storage_layout, + window_view=window_view, n_classes=self.n_classes, inference_batch_size=self.inference_batch_size, seed=101, diff --git a/src/sequifier/config/infer_config.py b/src/sequifier/config/infer_config.py index 8377fb9e..14b5f35b 100644 --- a/src/sequifier/config/infer_config.py +++ b/src/sequifier/config/infer_config.py @@ -5,26 +5,31 @@ import numpy as np import yaml from beartype import beartype -from pydantic import BaseModel, ConfigDict, Field, ValidationInfo, field_validator - -from sequifier.helpers import normalize_path, try_catch_excess_keys +from pydantic import ( + BaseModel, + ConfigDict, + Field, + ValidationInfo, + field_validator, + model_validator, +) + +from sequifier.helpers import ( + ModelWindowView, + StoredWindowLayout, + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, + try_catch_excess_keys, +) +from sequifier.special_tokens import validate_special_token_ids @beartype def load_inferer_config( config_path: str, args_config: dict, skip_metadata: bool ) -> "InfererModel": - """ - Load inferer configuration from a YAML file and update it with args_config. - - Args: - config_path: Path to the YAML configuration file. - args_config: Dictionary containing additional configuration arguments. - skip_metadata: Flag indicating whether to process the configuration or not. - - Returns: - InfererModel instance with loaded configuration. - """ + """Load inference YAML plus CLI overrides and optional metadata fields.""" with open(config_path, "r") as f: config_values = yaml.safe_load(f) config_values.update(args_config) @@ -39,6 +44,38 @@ def load_inferer_config( ) as f: metadata_config = json.load(f) + validate_special_token_ids( + metadata_config["special_token_ids"], + source=f"metadata config '{metadata_config_path}'", + ) + storage_layout = stored_window_layout_from_metadata(metadata_config) + if storage_layout.version != 2: + raise ValueError( + "Inference requires metadata stored_window_layout_version=2, " + f"got {storage_layout.version}." + ) + training_objective = config_values["training_objective"] + target_offset = ( + 0 + if training_objective == "bert" + else int(config_values.pop("target_offset", 1)) + ) + window_view = ModelWindowView( + context_length=int(config_values.pop("context_length")), + objective=training_objective, + target_offset=target_offset, + ) + resolve_window_view(storage_layout, window_view) + config_values["storage_layout"] = storage_layout + config_values["window_view"] = window_view + for key in ( + "target_offset", + "stored_context_width", + "max_target_offset", + "stored_window_layout_version", + ): + config_values.pop(key, None) + config_values["column_types"] = config_values.get( "column_types", metadata_config["column_types"] ) @@ -76,34 +113,7 @@ def load_inferer_config( class InfererModel(BaseModel): - """Pydantic model for inference configuration. - - Attributes: - project_root: The path to the sequifier project directory. - metadata_config_path: The path to the data-driven configuration file. - model_path: The path to the trained model file(s). - model_type: The type of model, either 'embedding' or 'generative'. - data_path: The path to the data to be used for inference. - training_config_path: The path to the training configuration file. - read_format: The file format of the input data (e.g., 'csv', 'parquet'). - write_format: The file format for the inference output. - input_columns: The list of input columns used for inference. - categorical_columns: A list of columns that are categorical. - real_columns: A list of columns that are real-valued. - target_columns: The list of target columns for inference. - column_types: A dictionary mapping each column to its numeric type ('int64' or 'float64'). - target_column_types: A dictionary mapping target columns to their types ('categorical' or 'real'). - output_probabilities: If True, outputs the probability distributions for categorical target columns. - map_to_id: If True, maps categorical output values back to their original IDs. - seed: The random seed for reproducibility. - device: The device to run inference on (e.g., 'cuda', 'cpu', 'mps'). - seq_length: The sequence length of the model's input. - inference_batch_size: The batch size for inference. - sample_from_distribution_columns: A list of columns from which to sample from the distribution. - infer_with_dropout: If True, applies dropout during inference. - autoregression: If True, performs autoregressive inference. - autoregression_total_steps: The number of total steps for autoregressive inference. - """ + """Top-level inference config.""" model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") @@ -111,6 +121,7 @@ class InfererModel(BaseModel): metadata_config_path: str model_path: Union[str, list[str]] model_type: str + training_objective: str data_path: str training_config_path: str = Field(default="configs/train.yaml") read_format: str = Field(default="parquet") @@ -128,8 +139,9 @@ class InfererModel(BaseModel): map_to_id: bool = Field(default=True) seed: int device: str - seq_length: int - prediction_length: int = Field(default=1) + storage_layout: StoredWindowLayout + window_view: ModelWindowView + prediction_length: Optional[int] = None inference_batch_size: int sample_from_distribution_columns: Optional[list[str]] = Field(default=None) @@ -137,6 +149,36 @@ class InfererModel(BaseModel): autoregression: bool = Field(default=False) autoregression_total_steps: Optional[int] = Field(default=None) + @model_validator(mode="after") + def normalize_prediction_length(self): + if self.window_view.objective != self.training_objective: + raise ValueError( + "window_view objective must match training_objective " + f"({self.window_view.objective} != {self.training_objective})." + ) + if self.prediction_length is None: + self.prediction_length = ( + self.window_view.context_length + if self.training_objective == "bert" + else 1 + ) + if self.training_objective == "bert": + if self.prediction_length != self.window_view.context_length: + raise ValueError( + "For BERT inference, prediction_length must be equal to context_length " + f"(got prediction_length={self.prediction_length}, context_length={self.window_view.context_length})." + ) + else: + resolve_window_view(self.storage_layout, self.window_view) + return self + + @field_validator("training_objective") + @classmethod + def validate_training_objective(cls, v): + if v not in ["causal", "bert"]: + raise ValueError(f"Only 'causal' and 'bert' are allowed, found {v}") + return v + @field_validator("model_type") @classmethod def validate_model_type(cls, v: str) -> str: @@ -197,7 +239,11 @@ def validate_autoregression_total_steps( def validate_autoregression(cls, v: bool, info: ValidationInfo): if v and info.data.get("model_type") == "embedding": raise ValueError("Autoregression is not possible for embedding models") - if v and info.data.get("prediction_length") > 1: + if ( + v + and info.data.get("prediction_length") is not None + and info.data.get("prediction_length") > 1 + ): raise ValueError( "Autoregressive inference is not possible for models with prediction_length > 1" ) @@ -209,6 +255,15 @@ def validate_autoregression(cls, v: bool, info: ValidationInfo): "Autoregressive inference with non-identical 'input_columns' and 'target_columns' is possible but should not be performed" ) + if ( + v + and info.data.get("training_objective") is not None + and info.data.get("training_objective") == "bert" + ): + raise ValueError( + "Autoregressive inference is not possible with BERT-style models." + ) + return v @field_validator("data_path") diff --git a/src/sequifier/config/preprocess_config.py b/src/sequifier/config/preprocess_config.py index 94f72009..73d9a42c 100644 --- a/src/sequifier/config/preprocess_config.py +++ b/src/sequifier/config/preprocess_config.py @@ -5,25 +5,23 @@ import numpy as np import yaml from beartype import beartype -from pydantic import BaseModel, ConfigDict, ValidationInfo, field_validator +from pydantic import ( + BaseModel, + ConfigDict, + Field, + ValidationInfo, + field_validator, + model_validator, +) -from sequifier.helpers import try_catch_excess_keys +from sequifier.helpers import canonicalize_polars_dtype_name, try_catch_excess_keys @beartype def load_preprocessor_config( config_path: str, args_config: dict ) -> "PreprocessorModel": - """ - Load preprocessor configuration from a YAML file and update it with args_config. - - Args: - config_path: Path to the YAML configuration file. - args_config: Dictionary containing additional configuration arguments. - - Returns: - PreprocessorModel instance with loaded configuration. - """ + """Load preprocessing YAML plus CLI overrides.""" with open(config_path, "r") as f: config_values = yaml.safe_load(f) @@ -35,28 +33,7 @@ def load_preprocessor_config( class PreprocessorModel(BaseModel): - """ - Pydantic model for preprocessor configuration. - - Attributes: - project_root: The path to the sequifier project directory. - data_path: The path to the input data file. - read_format: The file type of the input data. Can be 'csv' or 'parquet'. - write_format: The file type for the preprocessed output data. - merge_output: If True, combines all preprocessed data into a single file. - selected_columns: A list of columns to be included in the preprocessing. If None, all columns are used. - split_ratios: A list of floats that define the relative sizes of data splits (e.g., for train, validation, test). - The sum of proportions must be 1.0. - seq_length: The sequence length for the model inputs. - stride_by_split: A list of step sizes for creating subsequences within each data split. - max_rows: The maximum number of input rows to process. If None, all rows are processed. - seed: A random seed for reproducibility. - n_cores: The number of CPU cores to use for parallel processing. If None, it uses the available CPU cores. - batches_per_file: The number of batches to process per file. - process_by_file: A flag to indicate if processing should be done file by file. - continue_preprocessing: Continue preprocessing job that was interrupted while writing to temp folder. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - """ + """Top-level preprocessing config.""" model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") @@ -65,10 +42,14 @@ class PreprocessorModel(BaseModel): read_format: str = "csv" write_format: str = "parquet" merge_output: bool = True + allow_sequence_splitting: bool = False selected_columns: Optional[list[str]] = None + column_types: Optional[dict[str, str]] = None split_ratios: list[float] - seq_length: int + split_method: str = Field(default="within_sequence") + stored_context_width: int = Field(gt=0) + max_target_offset: int = Field(default=1, ge=0) stride_by_split: Optional[list[int]] = None max_rows: Optional[int] = None seed: int @@ -79,6 +60,7 @@ class PreprocessorModel(BaseModel): subsequence_start_mode: str = "distribute" use_precomputed_maps: Optional[list[str]] = None metadata_config_path: Optional[str] = None + mask_column: Optional[str] = None @field_validator("data_path") @classmethod @@ -130,6 +112,15 @@ def validate_proportions_sum(cls, v: list[float]) -> list[float]: raise ValueError(f"All split_ratios must be positive: {v}") return v + @field_validator("split_method") + @classmethod + def validate_split_method(cls, v: str) -> str: + if v not in ["within_sequence", "between_sequence"]: + raise ValueError( + "split_method must be one of 'within_sequence', 'between_sequence'" + ) + return v + @field_validator("stride_by_split") @classmethod def validate_step_sizes( @@ -158,6 +149,30 @@ def validate_batches_per_file(cls, v: int) -> int: raise ValueError("batches_per_file must be a positive integer") return v + @field_validator("column_types") + @classmethod + def validate_column_types( + cls, v: Optional[dict[str, str]], info: ValidationInfo + ) -> Optional[dict[str, str]]: + if v is None: + return None + + normalized = { + column: canonicalize_polars_dtype_name(dtype) for column, dtype in v.items() + } + selected_columns = info.data.get("selected_columns") + if selected_columns is not None: + missing_columns = [ + column for column in selected_columns if column not in normalized + ] + if missing_columns: + raise ValueError( + "column_types must include every selected column. " + f"Missing: {missing_columns}" + ) + + return normalized + @field_validator("continue_preprocessing") @classmethod def validate_continue_preprocessing(cls, v: bool, info: ValidationInfo) -> bool: @@ -176,8 +191,22 @@ def validate_subsequence_start_mode(cls, v: str) -> str: ) return v + @model_validator(mode="after") + def validate_mask_column_requires_metadata(self) -> "PreprocessorModel": + if self.mask_column is not None and self.metadata_config_path is None: + raise ValueError("metadata_config_path must be set when mask_column is set") + if self.mask_column in ("sequenceId", "itemPosition"): + raise ValueError("mask_column cannot be sequenceId or itemPosition") + if self.max_target_offset >= self.stored_context_width: + raise ValueError( + "max_target_offset must be smaller than stored_context_width" + ) + return self + def __init__(self, **kwargs): - default_stride_for_split = [kwargs["seq_length"]] * len(kwargs["split_ratios"]) + default_stride_for_split = [kwargs["stored_context_width"]] * len( + kwargs["split_ratios"] + ) kwargs["stride_by_split"] = kwargs.get( "stride_by_split", default_stride_for_split ) diff --git a/src/sequifier/config/probabilities.py b/src/sequifier/config/probabilities.py new file mode 100644 index 00000000..ddb92ae1 --- /dev/null +++ b/src/sequifier/config/probabilities.py @@ -0,0 +1,110 @@ +import math +from abc import ABC, abstractmethod +from typing import Annotated, Literal, Optional, Union + +import torch +from pydantic import BaseModel, Field + + +class ProbabilityDistributionBaseClass(ABC): + """ + Abstract base class for all probability distributions. + """ + + @abstractmethod + def sample( + self, + shape: tuple[int, ...], + device: torch.device, + generator: Optional[torch.Generator] = None, + ) -> torch.Tensor: + pass + + +class GeometricDistribution(BaseModel, ProbabilityDistributionBaseClass): + type: Literal["GeometricDistribution"] = "GeometricDistribution" + p: float = Field(..., gt=0.0, le=1.0) + + def sample( + self, + shape: tuple[int, ...], + device: torch.device, + generator: Optional[torch.Generator] = None, + ) -> torch.Tensor: + if self.p == 1.0: + return torch.ones(shape, device=device, dtype=torch.long) + + uniform = torch.rand(shape, device=device, generator=generator) + return ( + torch.floor(torch.log1p(-uniform) / math.log1p(-self.p)).to(torch.long) + 1 + ) + + +class NormalDistributionDiscretizedFloor(BaseModel, ProbabilityDistributionBaseClass): + type: Literal["NormalDistributionDiscretizedFloor"] = ( + "NormalDistributionDiscretizedFloor" + ) + mean: float + standard_deviation: float = Field(..., gt=0.0) + + def sample( + self, + shape: tuple[int, ...], + device: torch.device, + generator: Optional[torch.Generator] = None, + ) -> torch.Tensor: + val = ( + torch.randn(shape, device=device, generator=generator) + * self.standard_deviation + + self.mean + ) + return torch.clamp(torch.round(val), min=0).long() + 1 + + +class LogNormalDistributionDiscretizedFloor( + BaseModel, ProbabilityDistributionBaseClass +): + type: Literal["LogNormalDistributionDiscretizedFloor",] = ( + "LogNormalDistributionDiscretizedFloor" + ) + mean: float + standard_deviation: float = Field(..., gt=0.0) + + def sample( + self, + shape: tuple[int, ...], + device: torch.device, + generator: Optional[torch.Generator] = None, + ) -> torch.Tensor: + normal = ( + torch.randn(shape, device=device, generator=generator) + * self.standard_deviation + + self.mean + ) + val = torch.exp(normal) + return torch.round(val).long() + 1 + + +class PoissonDistributionFloor(BaseModel, ProbabilityDistributionBaseClass): + type: Literal["PoissonDistributionFloor"] = "PoissonDistributionFloor" + rate: float = Field(..., gt=0.0) + + def sample( + self, + shape: tuple[int, ...], + device: torch.device, + generator: Optional[torch.Generator] = None, + ) -> torch.Tensor: + rate = torch.full(shape, self.rate, device=device) + return torch.poisson(rate, generator=generator).long() + 1 + + +ProbabilityDistribution = Annotated[ + Union[ + GeometricDistribution, + NormalDistributionDiscretizedFloor, + LogNormalDistributionDiscretizedFloor, + PoissonDistributionFloor, + ], + Field(discriminator="type"), +] diff --git a/src/sequifier/config/train_config.py b/src/sequifier/config/train_config.py index b37b1f76..da28e1a8 100644 --- a/src/sequifier/config/train_config.py +++ b/src/sequifier/config/train_config.py @@ -1,5 +1,6 @@ import copy import json +import math import os import warnings from typing import Any, Optional, Union @@ -10,29 +11,55 @@ import yaml from beartype import beartype from loguru import logger -from pydantic import BaseModel, ConfigDict, Field, field_validator +from pydantic import ( + BaseModel, + ConfigDict, + Field, + field_serializer, + field_validator, + model_validator, +) import sequifier -from sequifier.helpers import normalize_path, try_catch_excess_keys +from sequifier.config.probabilities import ProbabilityDistribution +from sequifier.helpers import ( + ModelWindowView, + StoredWindowLayout, + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, + try_catch_excess_keys, +) +from sequifier.special_tokens import SPECIAL_TOKEN_IDS, validate_special_token_ids AnyType = str | int | float +def _validate_class_share_log_columns(config_values: dict[str, Any]) -> None: + training_spec = config_values.get("training_spec", {}) + + for col in training_spec.get("class_share_log_columns", []): + if col not in config_values["target_columns"]: + raise ValueError(f"Class-share column {col!r} must be a target column.") + if config_values["target_column_types"].get(col) != "categorical": + raise ValueError( + f"Class-share column {col!r} must be a categorical target column." + ) + if col not in config_values["n_classes"]: + raise ValueError( + f"Class-share column {col!r} has no configured class count." + ) + if col not in config_values["id_maps"]: + raise ValueError( + f"Class-share column {col!r} has no index map for logging." + ) + + @beartype def load_train_config( config_path: str, args_config: dict[str, Any], skip_metadata: bool ) -> "TrainModel": - """ - Load training configuration from a YAML file and update it with args_config. - - Args: - config_path: Path to the YAML configuration file. - args_config: Dictionary containing additional configuration arguments. - skip_metadata: Flag indicating whether to process the configuration or not. - - Returns: - TrainModel instance with loaded configuration. - """ + """Load train YAML plus CLI overrides and optional metadata-derived fields.""" with open(config_path, "r") as f: config_values = yaml.safe_load(f) @@ -48,6 +75,42 @@ def load_train_config( ) as f: metadata_config = json.loads(f.read()) + storage_layout = stored_window_layout_from_metadata(metadata_config) + if storage_layout.version != 2: + raise ValueError( + "Training requires metadata stored_window_layout_version=2, " + f"got {storage_layout.version}." + ) + training_objective = config_values["training_spec"]["training_objective"] + target_offset = ( + 0 + if training_objective == "bert" + else int(config_values.pop("target_offset", 1)) + ) + window_view = ModelWindowView( + context_length=int(config_values.pop("context_length")), + objective=training_objective, + target_offset=target_offset, + ) + resolve_window_view(storage_layout, window_view) + config_values["storage_layout"] = storage_layout + config_values["window_view"] = window_view + for key in ( + "stored_context_width", + "max_target_offset", + "stored_window_layout_version", + ): + config_values.pop(key, None) + for key in ( + "target_offset", + "stored_context_width", + "max_target_offset", + "stored_window_layout_version", + ): + config_values.pop(key, None) + for key in ("target_offset", "stored_context_width", "max_target_offset"): + config_values.get("training_spec", {}).pop(key, None) + split_paths = metadata_config["split_paths"] config_values["column_types"] = config_values.get( @@ -88,6 +151,15 @@ def load_train_config( ) config_values["id_maps"] = metadata_config["id_maps"] + config_values["special_token_ids"] = validate_special_token_ids( + metadata_config.get( + "special_token_ids", + SPECIAL_TOKEN_IDS.ids_by_label, + ), + source=f"metadata config '{metadata_config_path}'", + ) + + _validate_class_share_log_columns(config_values) return try_catch_excess_keys(config_path, TrainModel, config_values) @@ -109,46 +181,33 @@ def __setstate__(self, state): self.update(state) +class ReplacementDistribution(BaseModel): + masked: float = Field(..., ge=0.0, le=1.0) + random: float = Field(..., ge=0.0, le=1.0) + identical: float = Field(..., ge=0.0, le=1.0) + + @model_validator(mode="after") + def validate_sum(self): + total = self.masked + self.random + self.identical + if not math.isclose(total, 1.0, abs_tol=1e-5): + raise ValueError( + f"Replacement distribution probabilities must sum to 1.0, got {total}" + ) + return self + + +class BERTSpecModel(BaseModel): + masking_probability: float = Field(..., gt=0.0, le=1.0) + replacement_distribution: ReplacementDistribution + span_masking: ProbabilityDistribution + + class TrainingSpecModel(BaseModel): - """Pydantic model for training specifications. - - Attributes: - device: The torch.device to train the model on (e.g., 'cuda', 'cpu', 'mps'). - device_max_concat_length: Maximum sequence length for concatenation on device. - epochs: The total number of epochs to train for. - log_interval: The interval in batches for logging. - class_share_log_columns: A list of column names for which to log the class share of predictions. - early_stopping_epochs: Number of epochs to wait for validation loss improvement before stopping. - save_interval_epochs: The interval in epochs for checkpointing the model. - save_latest_interval_minutes: the time interval in which a checkpoint is written to the "latest" checkpoint path - save_batch_interval_minutes: the time interval in which a checkpoint is written to a unique checkpoint path - save_batch_interval_minutes_val_loss: calculate val loss at the moment of batch interval saving - calculate_validation_loss_on_initialization: calculate val loss on weight initialization - batch_size: The training batch size. - learning_rate: The learning rate. - criterion: A dictionary mapping each target column to a loss function. - class_weights: A dictionary mapping categorical target columns to a list of class weights. - accumulation_steps: The number of gradient accumulation steps. - dropout: The dropout value for the transformer model. - loss_weights: A dictionary mapping columns to specific loss weights. - optimizer: The optimizer configuration. - scheduler: The learning rate scheduler configuration. - scheduler_step_on: The time of the .step() call on the scheduler, either 'epoch' or 'batch' - continue_training: If True, continue training from the latest checkpoint. - distributed: If True, enables distributed training. - load_full_data_to_ram: If True, loads the entire dataset into RAM. - world_size: The number of processes for distributed training. - num_workers: The number of worker threads for data loading. - backend: The distributed training backend (e.g., 'nccl'). - layer_type_dtypes: Dictionary mapping layer types (linear, embedding, norm) to dtypes (bfloat16, float8_e4m3fn). - layer_autocast: Whether to use autocast - sampling_strategy: how to equalize data between GPUs - torch_compile: compile entire model ('outer') or transformer layers ('inner') with torch.compile, alternatively 'none' - float32_matmul_precision: precision level of float32 computations. One of 'highest', 'high' and 'medium' - """ + """Training loop, optimization, precision, and distribution settings.""" model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") + training_objective: str device: str device_max_concat_length: int = 12 epochs: int @@ -157,8 +216,9 @@ class TrainingSpecModel(BaseModel): early_stopping_epochs: Optional[int] = None save_interval_epochs: int save_latest_interval_minutes: Optional[float] = None - save_batch_interval_minutes: Optional[float] = None - save_batch_interval_minutes_val_loss: bool = True + save_interval_minutes: Optional[float] = None + save_interval_batches: Optional[int] = None + save_interval_val_loss: bool = True calculate_validation_loss_on_initialization: bool = True batch_size: int learning_rate: float @@ -174,6 +234,8 @@ class TrainingSpecModel(BaseModel): ) ) scheduler_step_on: str = "epoch" + bert_spec: Optional[BERTSpecModel] = None + continue_training: bool = True enforce_determinism: bool = False distributed: bool = False @@ -200,6 +262,10 @@ def __init__(self, **kwargs): self.validate_scheduler_config(kwargs["scheduler"], kwargs) self.scheduler = DotDict(kwargs["scheduler"]) + @field_serializer("optimizer", "scheduler") + def serialize_dotdict(self, value: DotDict) -> dict[str, Any]: + return dict(value) + @field_validator("layer_type_dtypes") @classmethod def validate_layer_type_dtypes(cls, v): @@ -291,6 +357,25 @@ def validate_scheduler_step_on(cls, v): ) return v + @field_validator("training_objective") + @classmethod + def validate_training_objective(cls, v): + if v not in ["causal", "bert"]: + raise ValueError(f"Only 'causal' and 'bert' are allowed, found {v}") + return v + + @model_validator(mode="after") + def validate_bert_spec_matches_objective(self): + if self.bert_spec is not None and self.training_objective != "bert": + raise ValueError( + "The BERT hyperparameters should only be configured if the training objective is 'bert'" + ) + if self.bert_spec is None and self.training_objective == "bert": + raise ValueError( + "If the training_objective is 'bert', the BERT hyperparameters must be set" + ) + return self + @field_validator("sampling_strategy") @classmethod def validate_sampling_strategy(cls, v): @@ -311,16 +396,7 @@ def validate_data_parallelism(cls, v): class ModelSpecModel(BaseModel): - """Pydantic model for model specifications. - - Attributes: - initial_embedding_dim: The size of the input embedding. Must be equal to dim_model if joint_embedding_dim is None. - feature_embedding_dims: The embedding dimensions for each input column. Must sum to initial_embedding_dim. - joint_embedding_dim: Joint embedding layer after initial embedding. Must be equal to dim_model if specified. - n_head: The number of heads in the multi-head attention models. - dim_feedforward: The dimension of the feedforward network model. - num_layers: The number of layers in the transformer model. - """ + """Transformer architecture settings.""" model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") @@ -443,34 +519,7 @@ def validate_n_kv_heads(cls, v, info): class TrainModel(BaseModel): - """Pydantic model for training configuration. - - Attributes: - project_root: The path to the sequifier project directory. - metadata_config_path: The path to the data-driven configuration file. - model_name: The name of the model being trained. - training_data_path: The path to the training data. - validation_data_path: The path to the validation data. - read_format: The file format of the input data (e.g., 'csv', 'parquet'). - input_columns: The list of input columns to be used for training. - column_types: A dictionary mapping each column to its numeric type ('int64' or 'float64'). - categorical_columns: A list of columns that are categorical. - real_columns: A list of columns that are real-valued. - target_columns: The list of target columns for model training. - target_column_types: A dictionary mapping target columns to their types ('categorical' or 'real'). - id_maps: For each categorical column, a map from distinct values to their indexed representation. - seq_length: The sequence length of the model's input. - n_classes: The number of classes for each categorical column. - inference_batch_size: The batch size to be used for inference after model export. - seed: The random seed for numpy and PyTorch. - export_generative_model: If True, exports the generative model. - export_embedding_model: If True, exports the embedding model. - export_onnx: If True, exports the model in ONNX format. - export_pt: If True, exports the model using torch.save. - export_with_dropout: If True, exports the model with dropout enabled. - model_spec: The specification of the transformer model architecture. - training_spec: The specification of the training run configuration. - """ + """Top-level training config.""" model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") @@ -488,8 +537,12 @@ class TrainModel(BaseModel): target_columns: list[str] target_column_types: dict[str, str] id_maps: dict[str, dict[str | int, int]] + special_token_ids: dict[str, int] = Field( + default_factory=lambda: SPECIAL_TOKEN_IDS.ids_by_label + ) - seq_length: int + storage_layout: StoredWindowLayout + window_view: ModelWindowView n_classes: dict[str, int] inference_batch_size: int seed: int @@ -503,6 +556,29 @@ class TrainModel(BaseModel): model_spec: ModelSpecModel training_spec: TrainingSpecModel + @field_validator("special_token_ids") + @classmethod + def validate_special_token_ids_match_runtime(cls, v): + return validate_special_token_ids(v, source="TrainModel") + + @model_validator(mode="after") + def validate_bert_prediction_length_matches_context_length(self): + if self.window_view.objective != self.training_spec.training_objective: + raise ValueError( + "window_view objective must match training_spec.training_objective " + f"({self.window_view.objective} != {self.training_spec.training_objective})." + ) + resolve_window_view(self.storage_layout, self.window_view) + if ( + self.training_spec.training_objective == "bert" + and self.model_spec.prediction_length != self.window_view.context_length + ): + raise ValueError( + "For BERT training, model_spec.prediction_length must be equal to context_length " + f"(got prediction_length={self.model_spec.prediction_length}, context_length={self.window_view.context_length})." + ) + return self + @field_validator("model_name") @classmethod def validate_model_name(cls, v): @@ -560,17 +636,36 @@ def validate_training_spec(cls, v, info): raise ValueError("save_latest_interval_minutes must be larger than 0") if ( - v.save_batch_interval_minutes is not None + v.save_interval_minutes is not None and not os.getenv("SEQUIFIER_TESTING", "0") == "1" - and v.save_batch_interval_minutes == 0 + and v.save_interval_minutes == 0 ): - raise ValueError("save_batch_interval_minutes must be larger than 0") + raise ValueError("save_interval_minutes must be larger than 0") + + if ( + v.save_interval_batches is not None + and not os.getenv("SEQUIFIER_TESTING", "0") == "1" + and v.save_interval_batches == 0 + ): + raise ValueError("save_interval_batches must be larger than 0") if v.torch_compile not in ["outer", "inner", "none"]: raise ValueError( f'torch_compile {v.torch_compile} invalid, must be one of ["outer", "inner", "none"]' ) + if v.data_parallelism == "FSDP": + if v.layer_type_dtypes is not None: + raise ValueError( + "FSDP does not support manual layer pre-casting. Please set " + "'layer_type_dtypes' to null when using FSDP, and rely on " + "'layer_autocast' (MixedPrecisionPolicy) instead." + ) + if v.fsdp_cpu_offload is None: + raise ValueError( + "If data_parallelism == 'FSDP', fsdp_cpu_offload cannot be None" + ) + if v.data_parallelism == "FSDP" and v.torch_compile == "outer": raise ValueError( "If data_parallelism is set to 'FSDP' then torch_compile must be one of 'none' and 'inner'" @@ -613,6 +708,17 @@ def validate_training_spec(cls, v, info): "If 'distributed' is True, data_parallelism cannot be 'None'" ) + export_generative_model = info.data.get("export_generative_model") + export_embedding_model = info.data.get("export_embedding_model") + if ( + not export_generative_model + and not export_embedding_model + and os.getenv("SEQUIFIER_PREVENT_EXPORT") is None + ): + raise ValueError( + "At least one of 'export_generative_model' and 'export_embedding_model' must be true. If you want to override this, set the env variable 'SEQUIFIER_PREVENT_EXPORT' to any value" + ) + return v @field_validator("column_types") diff --git a/src/sequifier/distributed/env.py b/src/sequifier/distributed/env.py index 51a853f2..89e24ecd 100644 --- a/src/sequifier/distributed/env.py +++ b/src/sequifier/distributed/env.py @@ -10,13 +10,7 @@ def setup_distributed_env( rank: int, local_rank: int, world_size: int, backend: str = "nccl" ): - """Sets up the distributed training environment. - - Args: - rank: The rank of the current process. - world_size: The total number of processes. - backend: The distributed backend to use. - """ + """Initialize torch.distributed with env defaults.""" os.environ["MASTER_ADDR"] = os.getenv("MASTER_ADDR", "localhost") os.environ["MASTER_PORT"] = os.getenv("MASTER_PORT", "12355") diff --git a/src/sequifier/helpers.py b/src/sequifier/helpers.py index f2097548..c70b60f8 100644 --- a/src/sequifier/helpers.py +++ b/src/sequifier/helpers.py @@ -1,10 +1,13 @@ import glob +import hashlib +import math import os import random import re import sys +from dataclasses import dataclass from datetime import datetime -from typing import Any, Optional, Union +from typing import Any, Dict, Optional, Union import numpy as np import polars as pl @@ -14,9 +17,11 @@ from pydantic import ValidationError from torch import Tensor +from sequifier.special_tokens import SPECIAL_TOKEN_IDS + PANDAS_TO_TORCH_TYPES = { - "Float64": torch.float32, - "float64": torch.float32, + "Float64": torch.float64, + "float64": torch.float64, "Float32": torch.float32, "float32": torch.float32, "Float16": torch.float16, @@ -29,17 +34,192 @@ "int16": torch.int16, "Int8": torch.int8, "int8": torch.int8, - "UInt64": torch.int64, - "uint64": torch.int64, - "UInt32": torch.int64, - "uint32": torch.int64, - "UInt16": torch.int32, - "uint16": torch.int32, - "UInt8": torch.int16, - "uint8": torch.int16, + "UInt64": torch.uint64, + "uint64": torch.uint64, + "UInt32": torch.uint32, + "uint32": torch.uint32, + "UInt16": torch.uint16, + "uint16": torch.uint16, + "UInt8": torch.uint8, + "uint8": torch.uint8, +} + +POLARS_NUMERIC_DTYPES = { + "Float64": pl.Float64, + "Float32": pl.Float32, + "Float16": pl.Float16, + "Int64": pl.Int64, + "Int32": pl.Int32, + "Int16": pl.Int16, + "Int8": pl.Int8, + "UInt64": pl.UInt64, + "UInt32": pl.UInt32, + "UInt16": pl.UInt16, + "UInt8": pl.UInt8, +} + +POLARS_NUMERIC_DTYPE_ALIASES = { + alias: canonical + for canonical in POLARS_NUMERIC_DTYPES + for alias in (canonical, canonical.lower()) } +@beartype +def canonicalize_polars_dtype_name(dtype_name: str) -> str: + dtype_name = dtype_name.strip() + if dtype_name not in POLARS_NUMERIC_DTYPE_ALIASES: + raise ValueError( + f"Unsupported column type '{dtype_name}'. " + f"Supported types are: {sorted(POLARS_NUMERIC_DTYPES)}" + ) + return POLARS_NUMERIC_DTYPE_ALIASES[dtype_name] + + +@beartype +def polars_dtype_from_name(dtype_name: str) -> Any: + return POLARS_NUMERIC_DTYPES[canonicalize_polars_dtype_name(dtype_name)] + + +@beartype +def assign_sequence_to_split( + sequence_id: int, split_ratios: list[float], seed: int +) -> int: + """Deterministically assign one sequenceId to a split index.""" + digest = hashlib.sha256(f"{seed}:{sequence_id}".encode("utf-8")).digest() + hash_value = int.from_bytes(digest[:8], byteorder="big", signed=False) / 2**64 + split_index = int( + np.searchsorted(np.cumsum(split_ratios), hash_value, side="right") + ) + return min(split_index, len(split_ratios) - 1) + + +@beartype +def is_float_dtype_name(dtype_name: str) -> bool: + return canonicalize_polars_dtype_name(dtype_name).startswith("Float") + + +@beartype +def is_integer_dtype_name(dtype_name: str) -> bool: + canonical = canonicalize_polars_dtype_name(dtype_name) + return canonical.startswith("Int") or canonical.startswith("UInt") + + +@dataclass(frozen=True) +class StoredWindowLayout: + stored_context_width: int + max_target_offset: int + version: int + + def __post_init__(self) -> None: + if self.stored_context_width < 1: + raise ValueError("stored_context_width must be a positive integer") + if self.max_target_offset < 0: + raise ValueError("max_target_offset must be non-negative") + if self.max_target_offset >= self.stored_context_width: + raise ValueError( + "max_target_offset must be smaller than stored_context_width" + ) + + +@dataclass(frozen=True) +class ModelWindowView: + context_length: int + objective: str + target_offset: int + + def __post_init__(self) -> None: + if self.context_length < 1: + raise ValueError("context_length must be a positive integer") + if self.objective not in {"causal", "bert"}: + raise ValueError( + f"Only 'causal' and 'bert' are allowed, found {self.objective}" + ) + if self.target_offset < 0: + raise ValueError("target_offset must be non-negative") + if self.objective == "bert" and self.target_offset != 0: + raise ValueError("BERT views require target_offset=0") + if self.objective == "causal" and self.target_offset < 1: + raise ValueError("Causal views require target_offset >= 1") + + +@dataclass(frozen=True) +class ResolvedWindowView: + storage: StoredWindowLayout + view: ModelWindowView + required_width: int + input_slice: slice + target_slice: slice + + def build_masks(self, left_pad_lengths: Tensor) -> dict[str, Tensor]: + """Build explicit input-attention and target-validity masks for this view.""" + return { + "attention_valid_mask": build_valid_mask( + left_pad_lengths, self.storage.stored_context_width, self.input_slice + ), + "target_valid_mask": build_valid_mask( + left_pad_lengths, self.storage.stored_context_width, self.target_slice + ), + } + + +@beartype +def _right_aligned_slice(width: int, length: int, offset: int) -> slice: + start = width - (length + offset) + stop = width - offset + return slice(start, stop) + + +@beartype +def resolve_window_view( + storage: StoredWindowLayout, view: ModelWindowView +) -> ResolvedWindowView: + if view.target_offset > storage.max_target_offset: + raise ValueError( + f"Model target_offset={view.target_offset} exceeds stored " + f"max_target_offset={storage.max_target_offset}." + ) + + input_offset = storage.max_target_offset + target_offset = storage.max_target_offset - view.target_offset + required_width = view.context_length + max(input_offset, target_offset) + if required_width > storage.stored_context_width: + raise ValueError( + f"Model view requires width {required_width}, but storage only has " + f"stored_context_width={storage.stored_context_width}." + ) + + return ResolvedWindowView( + storage=storage, + view=view, + required_width=required_width, + input_slice=_right_aligned_slice( + storage.stored_context_width, view.context_length, input_offset + ), + target_slice=_right_aligned_slice( + storage.stored_context_width, view.context_length, target_offset + ), + ) + + +@beartype +def validate_stored_window_width(tensor: Tensor, stored_context_width: int) -> None: + if tensor.shape[1] != stored_context_width: + raise ValueError( + f"Stored window width {tensor.shape[1]} does not match " + f"metadata stored_context_width={stored_context_width}." + ) + + +@beartype +def stored_window_layout_from_metadata(metadata: dict) -> StoredWindowLayout: + return StoredWindowLayout( + stored_context_width=int(metadata["stored_context_width"]), + max_target_offset=int(metadata["max_target_offset"]), + version=int(metadata["stored_window_layout_version"]), + ) + + # Check an environment variable to see if we are in a testing context IS_TESTING = os.environ.get("SEQUIFIER_TESTING", "0") == "1" @@ -77,39 +257,7 @@ def construct_index_maps( target_columns_index_map: list[str], map_to_id: Optional[bool], ) -> dict[str, dict[int, Union[str, int]]]: - """Constructs reverse index maps (int index to original ID). - - This function creates reverse mappings from the integer indices back to - the original string or integer identifiers. It only performs this - operation if `map_to_id` is True and `id_maps` is provided. - - A special mapping for index 0 is added: - - If original IDs are strings, 0 maps to "unknown". - - If original IDs are strings, 1 maps to "other". - - If original IDs are integers, 0 maps to (minimum original ID) - 2. - - If original IDs are integers, 1 maps to (minimum original ID) - 1. - - Args: - id_maps: A nested dictionary mapping column names to their - respective ID-to-index maps (e.g., - `{'col_name': {'original_id': 1, ...}}`). Expected to be - provided if `map_to_id` is True. - target_columns_index_map: A list of column names for which to - construct the reverse maps. - map_to_id: A boolean flag. If True, the reverse maps are - constructed. If False or None, an empty dictionary is returned. - - Returns: - A dictionary where keys are column names from - `target_columns_index_map` and values are the reverse maps - (index-to-original-ID). Returns an empty dict if `map_to_id` - is not True. - - Raises: - AssertionError: If `map_to_id` is True but `id_maps` is None. - AssertionError: If the values of a map are not consistently - string or integer (excluding the added '0' key). - """ + """Build index-to-ID maps, including reserved token labels.""" index_map = {} if map_to_id is not None and map_to_id: if id_maps is None: @@ -117,15 +265,11 @@ def construct_index_maps( for target_column in target_columns_index_map: map_ = {v: k for k, v in id_maps[target_column].items()} val = next(iter(map_.values())) - if isinstance(val, str): - map_[0] = "unknown" - map_[1] = "other" - else: - if not isinstance(val, int): - raise TypeError(f"Expected integer ID in map, got {type(val)}") - min_id = int(min(map_.values())) - map_[0] = min_id - 2 # type: ignore - map_[1] = min_id - 1 + if not isinstance(val, (str, int)): + raise TypeError( + f"Expected string or integer ID in map, got {type(val)}" + ) + map_.update(SPECIAL_TOKEN_IDS.labels_by_id) index_map[target_column] = map_ return index_map @@ -134,21 +278,7 @@ def construct_index_maps( def read_data( path: str, read_format: str, columns: Optional[list[str]] = None ) -> pl.DataFrame: - """Reads data from a CSV or Parquet file into a Polars DataFrame. - - Args: - path: The file path to read from. - read_format: The format of the file. Supported formats are - "csv" and "parquet". - columns: An optional list of column names to read. This argument - is only used when `read_format` is "parquet". - - Returns: - A Polars DataFrame containing the data from the file. - - Raises: - ValueError: If `read_format` is not "csv" or "parquet". - """ + """Read CSV/Parquet into Polars.""" if read_format == "csv": return pl.read_csv(path, separator=",") if read_format == "parquet": @@ -158,32 +288,7 @@ def read_data( @beartype def write_data(data: pl.DataFrame, path: str, write_format: str, **kwargs) -> None: - """Writes a Polars (or Pandas) DataFrame to a CSV or Parquet file. - - This function detects the type of the input DataFrame. - - For Polars DataFrames, it uses `.write_csv()` or `.write_parquet()`. - - For other DataFrame types (presumably Pandas), it uses `.to_csv()` - or `.to_parquet()`. - - Note: The type hint specifies `pl.DataFrame`, but the implementation - includes a fallback path that suggests compatibility with Pandas - DataFrames. - - Args: - data: The Polars (or Pandas) DataFrame to write. - path: The destination file path. - write_format: The format to write. Supported formats are - "csv" and "parquet". - **kwargs: Additional keyword arguments passed to the underlying - write function (e.g., `write_csv` for Polars, `to_csv` for - Pandas). - - Returns: - None. - - Raises: - ValueError: If `write_format` is not "csv" or "parquet". - """ + """Write Polars/Pandas data as CSV or Parquet.""" if isinstance(data, pl.DataFrame): if write_format == "csv": data.write_csv(path, **kwargs) @@ -207,27 +312,7 @@ def write_data(data: pl.DataFrame, path: str, write_format: str, **kwargs) -> No def subset_to_input_columns( data: Union[pl.DataFrame, pl.LazyFrame], input_columns: list[str] ) -> Union[pl.DataFrame, pl.LazyFrame]: - """Filters a DataFrame to rows where 'inputCol' is in a list of column_names. - - This function supports both Polars (DataFrame, LazyFrame) and Pandas - DataFrames, dispatching to the appropriate filtering method. - - - For Polars objects, it uses `data.filter(pl.col("inputCol").is_in(...))`. - - For other objects (presumably Pandas), it builds a numpy boolean - mask and filters using `data.loc[...]`. - - Note: The type hint only specifies Polars objects, but the - implementation includes a fallback path for Pandas-like objects. - - Args: - data: The Polars (DataFrame, LazyFrame) or Pandas DataFrame to - filter. It must contain a column named "inputCol". - input_columns: A list of values. Rows will be kept if their - value in "inputCol" is present in this list. - - Returns: - A filtered DataFrame or LazyFrame of the same type as the input. - """ + """Keep long-format rows whose inputCol is selected.""" if isinstance(data, (pl.DataFrame, pl.LazyFrame)): return data.filter(pl.col("inputCol").is_in(input_columns)) @@ -243,48 +328,19 @@ def numpy_to_pytorch( data: pl.DataFrame, column_types: dict[str, torch.dtype], all_columns: list[str], - seq_length: int, -) -> dict[str, Tensor]: - """Converts a long-format Polars DataFrame to a dict of sequence tensors. - - This function assumes the input DataFrame `data` is in a long format - where each row represents a sequence for a specific feature. It expects - a column named "inputCol" that contains the feature name (e.g., - 'price', 'volume') and other columns representing time steps (e.g., - "0", "1", ..., "L"). - - It generates two tensors for each column in `all_columns`: - 1. An "input" tensor (from time steps L down to 1). - 2. A "target" tensor (from time steps L-1 down to 0). - - Example: - For `seq_length = 3` and `all_columns = ['price']`, it will create: - - 'price': Tensor from columns ["3", "2", "1"] - - 'price_target': Tensor from columns ["2", "1", "0"] - - Args: - data: The long-format Polars DataFrame. Must contain "inputCol" - and columns named as strings of integers for time steps. - column_types: A dictionary mapping feature names (from "inputCol") - to their desired `torch.dtype`. - all_columns: A list of all feature names (from "inputCol") to - be processed and converted into tensors. - seq_length: The total sequence length (L). This determines the - column names for time steps (e.g., "0" to "L"). - - Returns: - A dictionary mapping feature names to their corresponding PyTorch - tensors. Target tensors are stored with a `_target` suffix - (e.g., `{'price': , 'price_target': }`). - """ - input_seq_cols = [str(c) for c in range(seq_length, 0, -1)] - target_seq_cols = [str(c) for c in range(seq_length - 1, -1, -1)] - - # We will create a unified dictionary + resolved_view: ResolvedWindowView, +) -> tuple[dict[str, Tensor], dict[str, Tensor]]: + """Convert long-format Polars windows to tensors plus masks.""" + input_seq_cols = columns_from_slice( + resolved_view.input_slice, resolved_view.storage.stored_context_width + ) + target_seq_cols = columns_from_slice( + resolved_view.target_slice, resolved_view.storage.stored_context_width + ) + unified_tensors = {} for col_name in all_columns: - # Create the input sequence tensor (e.g., from t=1 to t=L) input_tensor = torch.tensor( data.filter(pl.col("inputCol") == col_name) .select(input_seq_cols) @@ -293,8 +349,6 @@ def numpy_to_pytorch( ) unified_tensors[col_name] = input_tensor - # Create the target sequence tensor (e.g., from t=0 to t=L-1) - # We'll store it with a "_target" suffix to distinguish it target_tensor = torch.tensor( data.filter(pl.col("inputCol") == col_name) .select(target_seq_cols) @@ -303,29 +357,61 @@ def numpy_to_pytorch( ) unified_tensors[f"{col_name}_target"] = target_tensor - return unified_tensors + left_pad_lengths = get_left_pad_lengths_from_preprocessed_data(data) + metadata = resolved_view.build_masks(left_pad_lengths) + + return unified_tensors, metadata @beartype -def normalize_path(path: str, project_root: str) -> str: - """Normalizes a path to be relative to a project path, then joins them. +def build_valid_mask( + left_pad_lengths: Tensor, + full_length: int, + view_slice: slice, +) -> Tensor: + """Boolean mask from left-padding metadata.""" + + full_positions = torch.arange( + full_length, device=left_pad_lengths.device, dtype=left_pad_lengths.dtype + ) + full_valid = full_positions[None, :] >= left_pad_lengths[:, None] + + return full_valid[:, view_slice] + + +@beartype +def columns_from_slice(view_slice: slice, stored_context_width: int) -> list[str]: + if view_slice.start is None or view_slice.stop is None: + raise ValueError("Resolved window slices must have concrete bounds") + return [ + str(stored_context_width - 1 - i) + for i in range(view_slice.start, view_slice.stop) + ] - This function ensures that a given `path` is correctly expressed as - an absolute path rooted at `project_root`. It does this by first - removing the `project_root` prefix from `path` (if it exists) - and then joining the result back to `project_root`. - This is useful for handling paths that might be provided as either - relative (e.g., "data/file.txt") or absolute - (e.g., "/abs/path/to/project/data/file.txt"). +@beartype +def get_left_pad_lengths_from_preprocessed_data(data: pl.DataFrame) -> Tensor: + """One leftPadLength per long-format subsequence.""" + if "leftPadLength" not in data.columns: + raise ValueError( + "Dataset layout v1 does not contain explicit padding metadata. " + "Please re-run preprocessing." + ) + assert {"sequenceId", "subsequenceId"}.issubset(data.columns) + + lengths = ( + data.group_by(["sequenceId", "subsequenceId"], maintain_order=True) + .agg(pl.col("leftPadLength").first().alias("leftPadLength")) + .sort(["sequenceId", "subsequenceId"]) + .get_column("leftPadLength") + ) + + return torch.tensor(lengths.to_numpy(), dtype=torch.int64) - Args: - path: The path to normalize. - project_root: The absolute path to the project's root directory. - Returns: - A normalized, absolute path. - """ +@beartype +def normalize_path(path: str, project_root: str) -> str: + """Return path rooted under project_root.""" project_root_normalized = (project_root + os.sep).replace(os.sep + os.sep, os.sep) path2 = os.path.join(project_root, path.replace(project_root_normalized, "")) return path2 @@ -333,18 +419,9 @@ def normalize_path(path: str, project_root: str) -> str: @beartype def configure_logger(project_root: str, model_name: str, rank: Optional[int] = 0): - """Configures Loguru to replicate the legacy LogFile behavior. - - Legacy Behavior Mapping: - 1. Console: Only Rank 0 prints high-level info. - 2. File 2 (Detailed): Captures ALL logs (equivalent to old level 2). - 3. File 3 (Summary): Captures only HIGH importance logs (equivalent to old level 3). - 4. Formatting: Files contain raw messages only (no timestamp prefix). - """ - # Clear default handler + """Configure console plus rank-scoped debug/info log files.""" logger.remove() - # 1. Console Handler (Rank 0 only, INFO/Level 3 and up) if rank == 0 or rank is None: logger.add( sys.stderr, @@ -352,15 +429,11 @@ def configure_logger(project_root: str, model_name: str, rank: Optional[int] = 0 level="INFO", ) - # Determine paths log_dir = os.path.join(project_root, "logs") os.makedirs(log_dir, exist_ok=True) rank_str = f"rank{rank}" if rank is not None else "rank0" - # 2. File 2 (Detailed/Debug) - Equivalent to old 'level=2' - # Captures everything from DEBUG up. - # Format is just {message} to match f.write(f"{string}\n") file_2_path = os.path.join(log_dir, f"sequifier-{model_name}-{rank_str}-2.txt") logger.add( file_2_path, @@ -370,7 +443,6 @@ def configure_logger(project_root: str, model_name: str, rank: Optional[int] = 0 mode="a", ) - # 3. File 3 (Summary/Info) file_3_path = os.path.join(log_dir, f"sequifier-{model_name}-{rank_str}-3.txt") logger.add( file_3_path, @@ -385,28 +457,22 @@ def configure_logger(project_root: str, model_name: str, rank: Optional[int] = 0 @beartype def configure_determinism(seed: int, strict: bool = False) -> None: """Enforces deterministic execution for reproducibility.""" - # 1. Set standard seeds random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) - # 2. Ensure deterministic behavior in CUDA/CuDNN torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True if strict: - # 3. Enforce deterministic algorithms in PyTorch (crucial for SDPA/FlashAttention) - # This forces PyTorch to error out if a non-deterministic operation is used, - # or select the deterministic version of a kernel (e.g. for Flash Attn). torch.use_deterministic_algorithms(True, warn_only=True) - # 4. Set CuBLAS workspace (Required for deterministic algorithms with CUDA >= 10.2) os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" @beartype def get_torch_dtype(dtype_str: str) -> torch.dtype: - """Converts a string to a torch dtype, supporting bfloat16 and fp8.""" + """String-to-torch dtype mapping.""" dtype_map = { "float32": torch.float32, "float16": torch.float16, @@ -431,22 +497,7 @@ def get_torch_dtype(dtype_str: str) -> torch.dtype: def get_best_model_path( project_root: str, run_name: str, model_type: str ) -> tuple[str, int]: - """ - Searches for the exported 'best' model file for a given run and returns its path and epoch. - - Args: - project_root: The root directory of the project. - run_name: The unique identifier for the hyperparameter search run. - model_type: The extension of the exported model (e.g., 'onnx' or 'pt'). - - Returns: - A tuple containing: - - The file path to the best model (str). - - The actual epoch at which this model was saved (int). - - Raises: - FileNotFoundError: If no matching model files are found. - """ + """Return the highest-epoch exported best model path.""" search_pattern = os.path.join( project_root, "models", f"sequifier-{run_name}-best-*.{model_type}" ) @@ -458,7 +509,6 @@ def get_best_model_path( f"Could not find an exported 'best' model matching: {search_pattern}" ) - # Find the file with the highest epoch number in its name best_model_path = max( matching_models, key=lambda p: int(os.path.splitext(os.path.basename(p))[0].split("-")[-1]), @@ -470,11 +520,7 @@ def get_best_model_path( def get_last_training_batch_timedelta( model_name: str, rank: int, project_root: str = "." ) -> float: - """ - Reads the level 2 log file, finds the last two mid-epoch training logs, - and returns the timedelta between them in seconds. - """ - # Construct the path to the level 2 log file based on configure_logger() + """Return seconds between the last two mid-epoch train log entries.""" log_path = os.path.join( project_root, "logs", f"sequifier-{model_name}-rank{rank}-2.txt" ) @@ -482,8 +528,6 @@ def get_last_training_batch_timedelta( if not os.path.exists(log_path): raise FileNotFoundError(f"Log file not found: {log_path}") - # Regex to capture the timestamp of mid-epoch training batch logs - # Matches lines like: "2026-05-26 15:15:39 | INFO | [INFO] Epoch 1 | Batch 10/... | Loss: ..." train_log_pattern = re.compile( r"^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\s+\|.*?\[INFO\] Epoch.*?Batch" ) @@ -503,7 +547,205 @@ def get_last_training_batch_timedelta( "Not enough mid-epoch training logs found in the file to calculate a timedelta." ) - # Get the last two chronologically recorded batch timestamps t1, t2 = timestamps[-2], timestamps[-1] return (t2 - t1).total_seconds() + + +def _build_bert_span_mask( + valid_mask: torch.Tensor, + masking_probability: float, + span_distribution: Any, + *, + generator: Optional[torch.Generator] = None, +) -> torch.Tensor: + """Construct exact-budget, non-overlapping BERT span masks.""" + valid_mask = valid_mask.bool() + batch_size, seq_len = valid_mask.shape + device = valid_mask.device + + valid_lengths = valid_mask.sum(dim=1, dtype=torch.long) + budgets = (valid_lengths.to(torch.float32) * masking_probability).to(torch.long) + + max_spans = max(1, math.floor(seq_len * masking_probability) + 10) + sampled_lengths = span_distribution.sample( + (batch_size, max_spans), + device=device, + generator=generator, + ) + sampled_lengths = sampled_lengths.to(torch.long).clamp_min_(1) + + used_before = sampled_lengths.cumsum(dim=1) - sampled_lengths + remaining = (budgets[:, None] - used_before).clamp_min(0) + span_lengths = torch.minimum(sampled_lengths, remaining) + + n_spans = (span_lengths > 0).sum(dim=1) + total_gap_length = valid_lengths - budgets + + gap_slot = torch.arange(max_spans + 1, device=device) + active_gap_slot = gap_slot[None, :] <= n_spans[:, None] + + uniform = torch.rand( + (batch_size, max_spans + 1), + device=device, + dtype=torch.float32, + generator=generator, + ) + uniform = uniform.clamp_min(torch.finfo(uniform.dtype).tiny) + + gap_weights = torch.where( + active_gap_slot, + -torch.log(uniform), + torch.zeros_like(uniform), + ) + cumulative_weights = gap_weights.cumsum(dim=1) + weight_totals = cumulative_weights[:, -1:].clamp_min( + torch.finfo(gap_weights.dtype).tiny + ) + + gap_edges = torch.floor( + cumulative_weights + / weight_totals + * total_gap_length[:, None].to(gap_weights.dtype) + ).to(torch.long) + gap_edges = torch.where( + gap_slot[None, :] >= n_spans[:, None], + total_gap_length[:, None], + gap_edges, + ) + + gaps = torch.diff( + torch.cat( + [ + torch.zeros((batch_size, 1), dtype=torch.long, device=device), + gap_edges, + ], + dim=1, + ), + dim=1, + ) + + lengths_before = span_lengths.cumsum(dim=1) - span_lengths + gaps_through_current = gaps[:, :max_spans].cumsum(dim=1) + + span_starts = lengths_before + gaps_through_current + span_ends = span_starts + span_lengths + + compact_position = valid_mask.to(torch.long).cumsum(dim=1) - 1 + compact_position = compact_position.clamp_min(0) + + started_spans = torch.searchsorted( + span_starts.contiguous(), + compact_position.contiguous(), + right=True, + ) + ended_spans = torch.searchsorted( + span_ends.contiguous(), + compact_position.contiguous(), + right=True, + ) + + return valid_mask & (started_spans > ended_spans) + + +def apply_bert_masking( + data_batch: Dict[str, torch.Tensor], + targets_batch: Dict[str, torch.Tensor], + metadata_batch: Optional[Dict[str, torch.Tensor]], + config: Any, # TrainConfig + eval_seed: Optional[int] = None, +) -> tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], Dict[str, torch.Tensor]]: + """Apply BERT span corruption and attach prediction masks.""" + if not metadata_batch or "attention_valid_mask" not in metadata_batch: + raise ValueError("BERT masking requires metadata['attention_valid_mask']") + + valid_mask = metadata_batch["attention_valid_mask"].bool() + batch_size, seq_len = valid_mask.shape + device = valid_mask.device + + for target_name, target in targets_batch.items(): + if target.shape != valid_mask.shape: + raise ValueError( + f"BERT target {target_name!r} has shape {target.shape}; " + f"expected {valid_mask.shape}" + ) + + generator: Optional[torch.Generator] = None + if eval_seed is not None: + seeded_generator = torch.Generator(device=device) + seeded_generator.manual_seed(eval_seed) + generator = seeded_generator + + bert_spec = config.training_spec.bert_spec + if bert_spec is None: + raise ValueError("bert_spec must be configured for BERT training") + + bert_mask = _build_bert_span_mask( + valid_mask, + bert_spec.masking_probability, + bert_spec.span_masking, + generator=generator, + ) + + replacement = bert_spec.replacement_distribution + p_masked = replacement.masked + p_random = replacement.random + + replacement_probs = torch.rand( + (batch_size, seq_len), + device=device, + generator=generator, + ) + + mask_token_mask = bert_mask & (replacement_probs < p_masked) + random_token_mask = ( + bert_mask + & (replacement_probs >= p_masked) + & (replacement_probs < (p_masked + p_random)) + ) + + masked_data = dict(data_batch) + + for col, tensor in data_batch.items(): + if col in config.categorical_columns: + output = tensor.clone() + + if p_masked > 0.0: + output.masked_fill_(mask_token_mask, SPECIAL_TOKEN_IDS.mask) + + if p_random > 0.0: + random_tokens = torch.randint( + low=SPECIAL_TOKEN_IDS.user_start, + high=config.n_classes[col], + size=tensor.shape, + device=device, + dtype=tensor.dtype, + generator=generator, + ) + output[random_token_mask] = random_tokens[random_token_mask] + + masked_data[col] = output + + elif col in config.real_columns: + output = tensor.clone() + + if p_masked > 0.0: + output.masked_fill_(mask_token_mask, 0.0) + + if p_random > 0.0: + random_noise = torch.randn( + tensor.shape, + device=device, + dtype=tensor.dtype, + generator=generator, + ) + output[random_token_mask] = random_noise[random_token_mask] + + masked_data[col] = output + + detached_targets = {col: tensor.detach() for col, tensor in targets_batch.items()} + output_metadata = {key: tensor.detach() for key, tensor in metadata_batch.items()} + output_metadata["bert_mask"] = bert_mask + output_metadata["attention_valid_mask"] = valid_mask + + return masked_data, detached_targets, output_metadata diff --git a/src/sequifier/hyperparameter_search.py b/src/sequifier/hyperparameter_search.py index 7948b682..b21eea08 100644 --- a/src/sequifier/hyperparameter_search.py +++ b/src/sequifier/hyperparameter_search.py @@ -6,7 +6,7 @@ import sys import time import warnings -from typing import Union +from typing import Any, Union import optuna import torch._dynamo @@ -24,42 +24,44 @@ from sequifier.io.yaml import TrainModelDumper # noqa: E402 +def create_sampler(config: Any) -> optuna.samplers.BaseSampler: + strategy = getattr(config, "search_strategy", "bayesian") + seed = getattr(config, "seed", None) + if strategy in ["sample"]: + return optuna.samplers.RandomSampler(seed=seed) + if strategy == "grid": + if hasattr(optuna.samplers, "BruteForceSampler"): + return optuna.samplers.BruteForceSampler(seed=seed) + raise RuntimeError("Grid search requires Optuna >= 3.1 for BruteForceSampler.") + return optuna.samplers.TPESampler(seed=seed) + + def set_pdeathsig(): - """Binds child process lifecycle to the parent orchestrator via Linux prctl.""" + """Ask Linux to SIGTERM children when this parent dies.""" if sys.platform.startswith("linux"): libc = ctypes.CDLL("libc.so.6") libc.prctl(1, signal.SIGTERM) # PR_SET_PDEATHSIG = 1 def objective(trial: optuna.Trial, config) -> Union[float, tuple[float, ...]]: - """The central objective engine bridging Optuna to pure CLI execution. - - This function handles generating the YAML configuration for the specific - trial, dynamically allocating a port for distributed training, launching the - training subprocess, asynchronously polling the validation metrics, and reporting - them back to Optuna for potential pruning. - - Args: - trial (optuna.Trial): The Optuna trial object managing the current hyperparameter combination. - config (HyperparameterSearchConfig): The parsed hyperparameter search configuration. - - Returns: - float: The best validation loss achieved during the trial. - - Raises: - optuna.TrialPruned: If the trial is pruned by the Optuna orchestrator. - RuntimeError: If the training subprocess fails or is externally preempted. - """ + """Run one Optuna trial through the CLI trainer and metrics JSONL.""" run_config = config.sample_trial(trial, trial.number) run_name = run_config.model_name - # 1. YAML Generation config_path = os.path.join( config.project_root, config.model_config_write_path, f"{run_name}.yaml" ) os.makedirs(os.path.dirname(config_path), exist_ok=True) + + run_config_dict = run_config.model_dump() + run_config_dict["context_length"] = run_config_dict["window_view"]["context_length"] + run_config_dict["target_offset"] = run_config_dict["window_view"]["target_offset"] + + del run_config_dict["window_view"] + del run_config_dict["storage_layout"] + with open(config_path, "w") as f: - yaml.dump(run_config, f, Dumper=TrainModelDumper, sort_keys=False) + yaml.dump(run_config_dict, f, Dumper=TrainModelDumper, sort_keys=False) os.environ["SEQUIFIER_HYPERPARAMETER_SEARCH_RUN"] = "1" @@ -82,7 +84,7 @@ def objective(trial: optuna.Trial, config) -> Union[float, tuple[float, ...]]: best_val_loss = float("inf") def consume_metrics(last_read_pos: int, best_val_loss: float) -> tuple[int, float]: - """Helper closure to read written metrics and evaluate pruning.""" + """Read complete metric lines; report/prune single-objective trials.""" if os.path.exists(metrics_path): with open(metrics_path, "r") as f: f.seek(last_read_pos) @@ -96,7 +98,6 @@ def consume_metrics(last_read_pos: int, best_val_loss: float) -> tuple[int, floa global_step = data.get("global_step") if global_step is not None and val_loss is not None: - # 5. Cooperative Pruning Evaluation is_multi_objective = ( config.evaluation_metrics is not None and len(config.evaluation_metrics) > 1 @@ -116,11 +117,11 @@ def consume_metrics(last_read_pos: int, best_val_loss: float) -> tuple[int, floa ) timeout_val = (timedelta * 2) + 30 except (ValueError, FileNotFoundError): - timeout_val = 60.0 # Safe default fallback + timeout_val = 60.0 process.wait(timeout=timeout_val) except subprocess.TimeoutExpired: - process.kill() # Escalation + process.kill() raise optuna.TrialPruned() last_read_pos = f.tell() @@ -129,7 +130,6 @@ def consume_metrics(last_read_pos: int, best_val_loss: float) -> tuple[int, floa break return last_read_pos, best_val_loss - # 4. Asynchronous Polling & Caching Mitigation while process.poll() is None: last_read_pos, best_val_loss = consume_metrics(last_read_pos, best_val_loss) time.sleep(2) @@ -208,7 +208,8 @@ def consume_metrics(last_read_pos: int, best_val_loss: float) -> tuple[int, floa raise KeyError( f"Metric '{metric}' missing in {eval_json_path}. Found keys: {list(eval_results.keys())}" ) - metrics.append(float(eval_results[metric])) + value = eval_results[metric] + metrics.append(float("nan") if value is None else float(value)) if len(metrics) == 1: return metrics[0] @@ -220,34 +221,11 @@ def consume_metrics(last_read_pos: int, best_val_loss: float) -> tuple[int, floa @beartype def hyperparameter_search(config_path: str, skip_metadata: bool) -> None: - """Main function for initiating an Optuna-based hyperparameter search process. - - This function loads the configuration, initializes the Optuna study with a - minimization direction, and kicks off the optimization loop. Once the configured - number of trials is complete, it prints out the best trial's value and hyperparameters. - - Args: - config_path (str): Path to the hyperparameter search YAML configuration file. - skip_metadata (bool): Flag indicating whether to skip loading/processing data metadata. - - Raises: - ValueError: If `n_trials` is not defined in the configuration. - """ + """Load config, create Optuna study, and optimize trials.""" config = load_hyperparameter_search_config(config_path, skip_metadata) os.makedirs(os.path.join(config.project_root, "state", "optuna"), exist_ok=True) - strategy = getattr(config, "search_strategy", "bayesian") - if strategy in ["sample"]: - sampler = optuna.samplers.RandomSampler() - elif strategy == "grid": - if hasattr(optuna.samplers, "BruteForceSampler"): - sampler = optuna.samplers.BruteForceSampler() - else: - raise RuntimeError( - "Grid search requires Optuna >= 3.1 for BruteForceSampler." - ) - else: # "bayesian" - sampler = optuna.samplers.TPESampler() + sampler = create_sampler(config) storage_path = os.path.join( config.project_root, "state", "optuna", f"{config.hp_search_name}.db" diff --git a/src/sequifier/infer.py b/src/sequifier/infer.py index dc08ec9b..df26023b 100644 --- a/src/sequifier/infer.py +++ b/src/sequifier/infer.py @@ -19,9 +19,12 @@ construct_index_maps, normalize_path, numpy_to_pytorch, + resolve_window_view, subset_to_input_columns, + validate_stored_window_width, write_data, ) +from sequifier.special_tokens import validate_special_token_ids from sequifier.train import ( infer_with_embedding_model, infer_with_generative_model, @@ -31,21 +34,7 @@ @beartype def infer(args: Any, args_config: dict[str, Any]) -> None: - """Runs the main inference pipeline. - - This function orchestrates the inference process. It loads the main - inference configuration, retrieves necessary metadata like ID maps and - column statistics from a `metadata_config` file (if required for mapping or - normalization), and then delegates the core work to the `infer_worker` - function. - - Args: - args: Command-line arguments, typically from `argparse`. Expected - to have attributes like `config_path` and `skip_metadata`. - args_config: A dictionary of configuration overrides, often - passed from the command line, that will be merged into the - loaded configuration file. - """ + """Load inference config and dispatch the worker.""" logger.info("--- Starting Inference ---") config_path = ( args.config_path if args.config_path is not None else "configs/infer.yaml" @@ -64,6 +53,10 @@ def infer(args: Any, args_config: dict[str, Any]) -> None: normalize_path(config.metadata_config_path, config.project_root), "r" ) as f: metadata_config = json.loads(f.read()) + validate_special_token_ids( + metadata_config["special_token_ids"], + source=f"metadata config '{config.metadata_config_path}'", + ) id_maps = metadata_config["id_maps"] selected_columns_statistics = metadata_config["selected_columns_statistics"] else: @@ -79,33 +72,13 @@ def infer(args: Any, args_config: dict[str, Any]) -> None: @beartype def load_pt_dataset(data_path: str, start_pct: float, end_pct: float) -> Iterator[Any]: - """Lazily loads and yields data from .pt files in a directory. - - This function scans a directory for `.pt` files, sorts them, and then - yields the contents of a specific slice of those files defined by a - start and end percentage. This allows for processing large datasets - in chunks without loading everything into memory. - - Args: - data_path: The path to the folder containing the `.pt` files. - start_pct: The starting percentage (0.0 to 100.0) of the file list - to begin loading from. - end_pct: The ending percentage (0.0 to 100.0) of the file list - to stop loading at. - - Yields: - Iterator: An iterator where each item is the data loaded from a - single `.pt` file (e.g., using `torch.load`). - """ - # Get all .pt files in the directory (not nested) + """Yield a percentage slice of sorted top-level PT files.""" pt_files = sorted(Path(data_path).glob("*.pt")) - # Calculate slice indices total = len(pt_files) start_idx = int(total * start_pct / 100) end_idx = int(total * end_pct / 100) - # Lazily load and yield data from files in range for pt_file in pt_files[start_idx:end_idx]: yield torch.load(pt_file, weights_only=False) @@ -114,24 +87,7 @@ def load_pt_dataset(data_path: str, start_pct: float, end_pct: float) -> Iterato def load_parquet_folder_dataset( data_path: str, start_pct: float, end_pct: float ) -> Iterator[Any]: - """Lazily loads and yields data from long-format .parquet chunk files in a directory. - - This function scans a directory for `.parquet` files, sorts them, and then - yields the contents of a specific slice of those files defined by a - start and end percentage. This allows for processing large datasets - in chunks without loading everything into memory. - - Args: - data_path: The path to the folder containing the `.parquet` files. - start_pct: The starting percentage (0.0 to 100.0) of the file list - to begin loading from. - end_pct: The ending percentage (0.0 to 100.0) of the file list - to stop loading at. - - Yields: - Iterator: An iterator where each item is a Polars DataFrame loaded from a - single `.parquet` file. - """ + """Yield a percentage slice of sorted top-level Parquet files.""" parquet_files = sorted(Path(data_path).glob("*.parquet")) total = len(parquet_files) @@ -150,35 +106,12 @@ def infer_worker( selected_columns_statistics: dict[str, dict[str, float]], percentage_limits: Optional[tuple[float, float]], ): - """Core worker function that performs inference. - - This function handles the main workflow: - 1. Loads the dataset based on `config.read_format` (parquet, csv, or pt). - 2. Iterates over one or more model paths specified in the config. - 3. For each model, initializes an `Inferer` object with all necessary - configurations, mappings, and statistics. - 4. Calls the appropriate inference function (`infer_generative` or - `infer_embedding`) based on the `config.model_type`. - 5. Manages the data iterators and passes data chunks to the - inference functions. - - Args: - config: The fully resolved `InfererModel` configuration object. - args_config: A dictionary of command-line arguments, passed to the - `Inferer` for potential model loading overrides. - id_maps: A nested dictionary mapping categorical column names to - their value-to-index maps. `None` if `map_to_id` is False. - selected_columns_statistics: A nested dictionary containing 'mean' - and 'std' for real-valued columns used for normalization. - percentage_limits: A tuple (start_pct, end_pct) used only when - `config.read_format == "pt"` to slice the dataset. - """ + """Load data, instantiate models, and run the configured inference mode.""" logger.info(f"[INFO] Reading data from '{config.data_path}'...") is_folder_input = os.path.isdir( normalize_path(config.data_path, config.project_root) ) - # Step 1: Use Polars for data ingestion dataset = None if not is_folder_input: # Standalone Single-File Path Execution @@ -213,6 +146,16 @@ def infer_worker( f"Unsupported input type or read format: {config.read_format}" ) + default_prediction_length = { + "causal": 1, + "bert": config.window_view.context_length, + } + prediction_length = ( + config.prediction_length + if config.prediction_length is not None + else default_prediction_length[config.training_objective] + ) + inferer = Inferer( config.model_type, model_path, @@ -227,7 +170,7 @@ def infer_worker( config.target_column_types, config.sample_from_distribution_columns, config.infer_with_dropout, - config.prediction_length, + prediction_length, config.inference_batch_size, config.device, args_config=args_config, @@ -252,6 +195,113 @@ def infer_worker( logger.info("--- Inference Complete ---") +def calculate_item_positions( + start_positions: np.ndarray, + context_length: int, + prediction_length: int, + training_objective: str, +) -> np.ndarray: + """Return flattened absolute item positions for inference outputs.""" + if training_objective == "bert": + # Anchor positions to the start of the input sequence and tile forwards + base_positions = start_positions + position_offsets = np.arange(0, prediction_length) + else: + # Anchor positions to the future token step and tile backwards + base_positions = start_positions + context_length + position_offsets = np.arange(-prediction_length + 1, 1) + + # Repeat base anchors to match the number of predictions per sequence window + repeated_bases = np.repeat(base_positions, prediction_length) + # Tile the relative step offsets across all sequences in the batch chunk + tiled_offsets = np.tile(position_offsets, len(start_positions)) + + return repeated_bases + tiled_offsets + + +@beartype +def _flatten_valid_mask( + config: InfererModel, + metadata: dict[str, Any], + prediction_length: int, + mask_key: str = "target_valid_mask", +) -> np.ndarray: + valid_mask = metadata.get(mask_key) + if isinstance(valid_mask, torch.Tensor): + valid_mask = valid_mask.detach().cpu().numpy() # type: ignore + valid_mask = np.asarray(valid_mask, dtype=bool) + + if valid_mask.ndim != 2: + raise ValueError(f"{mask_key} must be 2D, got shape {valid_mask.shape}.") + + return valid_mask[:, -prediction_length:].reshape(-1) + + +@beartype +def _bert_reference_column(config: InfererModel, data_columns: set[str]) -> str: + preferred_columns = ( + [col for col in config.target_columns if col in config.categorical_columns] + + [col for col in config.input_columns if col in config.categorical_columns] + + [col for col in config.target_columns if col in data_columns] + + [col for col in config.input_columns if col in data_columns] + ) + for column_name in preferred_columns: + if column_name in data_columns: + return column_name + + raise ValueError("Could not find a reference column for BERT padding metadata.") + + +@beartype +def _valid_mask_from_preprocessed_data( + config: InfererModel, + data: pl.DataFrame, + prediction_length: int, + mask_key: str = "target_valid_mask", +) -> np.ndarray: + data_columns = set(data.get_column("inputCol").unique()) + column_name = _bert_reference_column(config, data_columns) + reference_rows = data.filter(pl.col("inputCol") == column_name) + + left_pad_lengths = torch.tensor( + reference_rows.get_column("leftPadLength").to_numpy(), dtype=torch.int64 + ) + resolved_view = resolve_window_view(config.storage_layout, config.window_view) + metadata = resolved_view.build_masks(left_pad_lengths) + return _flatten_valid_mask(config, metadata, prediction_length, mask_key) + + +@beartype +def _apply_valid_prediction_mask( + values: np.ndarray, + valid_prediction_mask: np.ndarray, + label: str, +) -> np.ndarray: + values = np.asarray(values) + if values.shape[0] != valid_prediction_mask.shape[0]: + raise ValueError( + f"{label} has {values.shape[0]} rows, but valid_prediction_mask has " + f"{valid_prediction_mask.shape[0]} rows." + ) + return values[valid_prediction_mask] + + +@beartype +def _apply_valid_prediction_mask_to_dict( + values: Optional[dict[str, np.ndarray]], + valid_prediction_mask: np.ndarray, + label: str, +) -> Optional[dict[str, np.ndarray]]: + if values is None: + return None + return { + key: _apply_valid_prediction_mask( + value, valid_prediction_mask, f"{label}.{key}" + ) + for key, value in values.items() + } + + @beartype def infer_embedding( config: "InfererModel", @@ -260,30 +310,11 @@ def infer_embedding( dataset: Union[list[Any], Iterator[Any]], column_types: dict[str, torch.dtype], ) -> None: - """Performs inference with an embedding model and saves the results. - - This function iterates through the provided dataset (which can be a list - of DataFrames or an iterator of tensors). For each data chunk, it - calls the appropriate function (`get_embeddings` or `get_embeddings_pt`) - to generate embeddings. It then formats these embeddings into a - Polars DataFrame, associating them with their `sequenceId`, `subsequenceId`, - and absolute `itemPosition`, and writes the resulting DataFrame to the - configured output path. - - Args: - config: The `InfererModel` configuration object. - inferer: The initialized `Inferer` instance. - model_id: A string identifier for the model, used for naming - output files. - dataset: A list containing a Polars DataFrame (for parquet/csv) or - an iterator of loaded PyTorch data (for .pt files). - column_types: A dictionary mapping column names to their - `torch.dtype`. - """ + """Write embeddings for each dataset chunk.""" for data_id, data in enumerate(dataset): prediction_length = inferer.prediction_length + valid_prediction_mask = None - # Step 1: Get embeddings and base position/ID data is_folder_input = os.path.isdir( normalize_path(config.data_path, config.project_root) ) @@ -299,6 +330,9 @@ def infer_embedding( mask = pl.arange(0, data.height, eager=True) % n_input_cols == 0 embeddings = get_embeddings(config, inferer, data, column_types) + valid_prediction_mask = _valid_mask_from_preprocessed_data( + config, data, prediction_length, mask_key="attention_valid_mask" + ) sequence_ids_for_preds = data.get_column("sequenceId").filter(mask) subsequence_ids_for_preds = data.get_column("subsequenceId").filter(mask) @@ -314,6 +348,9 @@ def infer_embedding( mask = pl.arange(0, data.height, eager=True) % n_input_cols == 0 embeddings = get_embeddings(config, inferer, data, column_types) + valid_prediction_mask = _valid_mask_from_preprocessed_data( + config, data, prediction_length, mask_key="attention_valid_mask" + ) sequence_ids_for_preds = ( data.get_column("sequenceId").filter(mask).to_numpy() @@ -331,8 +368,23 @@ def infer_embedding( sequence_ids_tensor, subsequence_ids_tensor, start_positions_tensor, + left_pad_lengths_tensor, ) = data - embeddings = get_embeddings_pt(config, inferer, sequences_dict) + for tensor in sequences_dict.values(): + validate_stored_window_width( + tensor, config.storage_layout.stored_context_width + ) + + resolved_view = resolve_window_view( + config.storage_layout, config.window_view + ) + metadata = resolved_view.build_masks(left_pad_lengths_tensor) + embeddings = get_embeddings_pt( + config, inferer, sequences_dict, metadata=metadata + ) + valid_prediction_mask = _flatten_valid_mask( + config, metadata, prediction_length, mask_key="attention_valid_mask" + ) sequence_ids_for_preds = sequence_ids_tensor.numpy() subsequence_ids_for_preds = subsequence_ids_tensor.numpy() @@ -344,7 +396,8 @@ def infer_embedding( # Step 2: Calculate absolute positions and repeat IDs # (e.g., for seq_len=50, inf_size=5, offsets are [45, 46, 47, 48, 49]) base_offsets = np.arange( - config.seq_length - prediction_length, config.seq_length + config.window_view.context_length - prediction_length, + config.window_view.context_length, ) # Tile these offsets for each sample in the batch @@ -364,6 +417,19 @@ def infer_embedding( subsequence_ids_repeated = np.repeat( subsequence_ids_for_preds, prediction_length ) + assert valid_prediction_mask is not None + embeddings = _apply_valid_prediction_mask( + embeddings, valid_prediction_mask, "embeddings" + ) + final_positions = _apply_valid_prediction_mask( + final_positions, valid_prediction_mask, "itemPosition" + ) + sequence_ids_repeated = _apply_valid_prediction_mask( + sequence_ids_repeated, valid_prediction_mask, "sequenceId" + ) + subsequence_ids_repeated = _apply_valid_prediction_mask( + subsequence_ids_repeated, valid_prediction_mask, "subsequenceId" + ) # Step 3: Build the final DataFrame embeddings_df = pl.DataFrame( @@ -418,31 +484,8 @@ def infer_generative( dataset: Union[list[Any], Iterator[Any]], column_types: dict[str, torch.dtype], ): - """Executes the generative inference pipeline and exports results to disk. - - This function processes the input dataset in chunks to accommodate large data - volumes. It handles various input formats (standalone CSV/Parquet, folder-based - Parquet, or PyTorch tensors) and routes the data to the appropriate inference - logic (standard sequence prediction or step-by-step autoregression). After - obtaining raw model outputs, it calculates aligned sequence IDs and absolute - item positions, applies necessary post-processing (such as reverse-mapping - categorical IDs and denormalizing real values), and writes the final - probabilities and predictions to the configured output directory. - - Args: - config: The inference configuration object dictating I/O paths, - autoregression settings, and output formats. - inferer: The initialized `Inferer` instance responsible for executing - the underlying model logic. - model_id: A string identifier for the current model, used to construct - the names of the generated output files and directories. - dataset: A list or iterator yielding data chunks, typically containing - either Polars DataFrames or PyTorch tensor dictionaries. - column_types: A dictionary mapping input column names to their expected - `torch.dtype`. - """ + """Write generative predictions/probabilities for each dataset chunk.""" for data_id, data in enumerate(dataset): - # Step 1: Adapt Data Subsetting (now works on Polars DF) is_folder_input = os.path.isdir( normalize_path(config.data_path, config.project_root) ) @@ -461,26 +504,26 @@ def infer_generative( # Get base IDs and positions (shape: batch_size) sequence_ids_for_preds_base = data.get_column("sequenceId").filter(mask) - item_positions_for_preds_base = ( + item_positions_base_raw = ( data.get_column("startItemPosition").filter(mask).to_numpy() - + config.seq_length ) - prediction_length = inferer.prediction_length + valid_prediction_mask = _valid_mask_from_preprocessed_data( + config, data, prediction_length + ) - # Expand IDs and positions to match model output shape (batch_size * prediction_length) + # Expand IDs to match model output shape sequence_ids_for_preds = np.repeat( sequence_ids_for_preds_base, prediction_length ) - item_positions_repeated = np.repeat( - item_positions_for_preds_base, prediction_length - ) - position_offsets = np.tile( - np.arange(-prediction_length + 1, 1), - len(item_positions_for_preds_base), + # Invoke the unified positioning engine + item_positions_for_preds = calculate_item_positions( + item_positions_base_raw, + config.window_view.context_length, + prediction_length, + config.training_objective, ) - item_positions_for_preds = item_positions_repeated + position_offsets else: if inferer.prediction_length != 1: @@ -488,10 +531,18 @@ def infer_generative( f"prediction_length must be 1 for autoregression, got {inferer.prediction_length}" ) # Unpack the new third return value - probs, preds, sequence_ids_for_preds, item_positions_for_preds = ( - get_probs_preds_autoregression( - config, inferer, data, column_types, config.seq_length - ) + ( + probs, + preds, + sequence_ids_for_preds, + item_positions_for_preds, + valid_prediction_mask, + ) = get_probs_preds_autoregression( + config, + inferer, + data, + column_types, + config.window_view.context_length, ) elif config.read_format == "parquet" and is_folder_input: # Folder-based Parquet chunk logic @@ -513,81 +564,111 @@ def infer_generative( sequence_ids_for_preds_base = ( data.get_column("sequenceId").filter(mask).to_numpy() ) - item_positions_for_preds_base = ( + item_positions_base_raw = ( data.get_column("startItemPosition").filter(mask).to_numpy() - + config.seq_length ) - prediction_length = inferer.prediction_length + valid_prediction_mask = _valid_mask_from_preprocessed_data( + config, data, prediction_length + ) + sequence_ids_for_preds = np.repeat( sequence_ids_for_preds_base, prediction_length ) - item_positions_repeated = np.repeat( - item_positions_for_preds_base, prediction_length - ) - position_offsets = np.tile( - np.arange(-prediction_length + 1, 1), - len(item_positions_for_preds_base), + + # Invoke the unified positioning engine + item_positions_for_preds = calculate_item_positions( + item_positions_base_raw, + config.window_view.context_length, + prediction_length, + config.training_objective, ) - item_positions_for_preds = item_positions_repeated + position_offsets else: if inferer.prediction_length != 1: raise ValueError( f"prediction_length must be 1 for autoregression, got {inferer.prediction_length}" ) - probs, preds, sequence_ids_for_preds, item_positions_for_preds = ( - get_probs_preds_autoregression( - config, inferer, data, column_types, config.seq_length - ) + ( + probs, + preds, + sequence_ids_for_preds, + item_positions_for_preds, + valid_prediction_mask, + ) = get_probs_preds_autoregression( + config, + inferer, + data, + column_types, + config.window_view.context_length, ) elif config.read_format == "pt": - sequences_dict, sequence_ids_tensor, _, start_positions_tensor = data + ( + sequences_dict, + sequence_ids_tensor, + _, + start_positions_tensor, + left_pad_lengths_tensor, + ) = data + for tensor in sequences_dict.values(): + validate_stored_window_width( + tensor, config.storage_layout.stored_context_width + ) total_steps = ( 1 if config.autoregression_total_steps is None else config.autoregression_total_steps ) + resolved_view = resolve_window_view( + config.storage_layout, config.window_view + ) sequences_dict = { - key: tensor[:, :-1] + key: tensor[:, resolved_view.input_slice] for key, tensor in sequences_dict.items() if key in config.input_columns } + metadata = resolved_view.build_masks(left_pad_lengths_tensor) + probs, preds = get_probs_preds_from_dict( - config, inferer, sequences_dict, total_steps + config, inferer, sequences_dict, metadata, total_steps ) prediction_length = inferer.prediction_length # Get prediction_length + valid_prediction_mask = _flatten_valid_mask( + config, metadata, prediction_length + ) if total_steps == 1: # Non-autoregressive path: Apply prediction_length logic sequence_ids_for_preds_base = sequence_ids_tensor.numpy() - item_positions_for_preds_base = ( - start_positions_tensor.numpy() + config.seq_length - ) + item_positions_base_raw = start_positions_tensor.numpy() sequence_ids_for_preds = np.repeat( sequence_ids_for_preds_base, prediction_length ) - item_positions_repeated = np.repeat( - item_positions_for_preds_base, prediction_length + # Invoke the unified positioning engine + item_positions_for_preds = calculate_item_positions( + item_positions_base_raw, + config.window_view.context_length, + prediction_length, + config.training_objective, ) - position_offsets = np.tile( - np.arange(-prediction_length + 1, 1), - len(item_positions_for_preds_base), - ) - item_positions_for_preds = item_positions_repeated + position_offsets else: sequence_ids_for_preds = np.repeat( sequence_ids_tensor.numpy(), total_steps ) + valid_prediction_mask = np.repeat(valid_prediction_mask, total_steps) item_position_boundaries = zip( - list(start_positions_tensor + config.seq_length), - list(start_positions_tensor + config.seq_length + total_steps), + list(start_positions_tensor + config.window_view.context_length), + list( + start_positions_tensor + + config.window_view.context_length + + total_steps + ), ) item_positions_for_preds = np.concatenate( [np.arange(start, end) for start, end in item_position_boundaries], @@ -609,6 +690,21 @@ def infer_generative( predictions, target_column ) + assert valid_prediction_mask is not None + + sequence_ids_for_preds = _apply_valid_prediction_mask( + sequence_ids_for_preds, valid_prediction_mask, "sequenceId" + ) + item_positions_for_preds = _apply_valid_prediction_mask( + item_positions_for_preds, valid_prediction_mask, "itemPosition" + ) + preds = _apply_valid_prediction_mask_to_dict( + preds, valid_prediction_mask, "preds" + ) + probs = _apply_valid_prediction_mask_to_dict( + probs, valid_prediction_mask, "probs" + ) + os.makedirs( os.path.join(config.project_root, "outputs", "predictions"), exist_ok=True, @@ -658,6 +754,7 @@ def infer_generative( n_input_cols = len(config.input_columns) + assert preds is not None predictions = pl.DataFrame( { "sequenceId": sequence_ids_for_preds, @@ -697,31 +794,19 @@ def get_embeddings_pt( config: Any, inferer: "Inferer", data: dict[str, torch.Tensor], + metadata: dict[str, torch.Tensor], ) -> np.ndarray: - """Generates embeddings from a batch of PyTorch tensor data. - - This function serves as a wrapper for `Inferer.infer_embedding` when - the input data is already in PyTorch tensor format (from loading `.pt` - files which contain sequences, targets, sequence_ids, subsequence_ids, - and start_positions). It converts the tensor dictionary to a NumPy array - dictionary before passing it to the inferer. - - Args: - config: The `InfererModel` configuration object (unused, but - kept for consistent function signature). - inferer: The initialized `Inferer` instance. - data: A dictionary mapping column/feature names to `torch.Tensor`s - (the sequences part loaded from the .pt file). - - Returns: - A NumPy array containing the computed embeddings for the batch. - """ + """Infer embeddings from PT tensors.""" + resolved_view = resolve_window_view(config.storage_layout, config.window_view) + for tensor in data.values(): + validate_stored_window_width(tensor, config.storage_layout.stored_context_width) X = { - key: val[:, :-1].numpy() + key: val[:, resolved_view.input_slice].numpy() for key, val in data.items() if key in config.input_columns } - embeddings = inferer.infer_embedding(X) + metadata_np = {key: val.numpy() for key, val in metadata.items()} + embeddings = inferer.infer_embedding(X, metadata=metadata_np) return embeddings @@ -730,61 +815,39 @@ def get_probs_preds_from_dict( config: Any, inferer: "Inferer", data: dict[str, torch.Tensor], + metadata: dict[str, torch.Tensor], total_steps: int = 1, ) -> tuple[Optional[dict[str, np.ndarray]], dict[str, np.ndarray]]: - """Generates predictions from PyTorch tensor data, supporting autoregression. - - This function performs generative inference on a batch of PyTorch tensor - data loaded from `.pt` files (which contain sequences, targets, - sequence_ids, subsequence_ids, and start_positions). It implements an - autoregressive loop: - 1. Runs inference on the initial data `X` (sequences). - 2. For each subsequent step: - a. Creates the next input `X_next` by shifting the previous input - `X` and appending the prediction from the last step. - b. Runs inference on `X_next`. - 3. Collects and reshapes all predictions and probabilities from all - steps into a single flat batch, ordered by original sample index, then by step. - - Args: - config: The `InfererModel` configuration object, used to check - `output_probabilities` and `input_columns`. - inferer: The initialized `Inferer` instance. - data: A dictionary mapping column/feature names to `torch.Tensor`s - (the sequences part loaded from the .pt file). - total_steps: The number of total autoregressive steps to - perform. A value of 1 means simple, non-autoregressive - inference. - - Returns: - A tuple `(probs, preds)`: - - `probs`: A dictionary mapping target columns to NumPy arrays - of probabilities, ordered by sample index then step, - or `None` if `config.output_probabilities` is False. - - `preds`: A dictionary mapping target columns to NumPy arrays - of final predictions, ordered by sample index then step. - """ + """Infer PT predictions, flattened sample-major across autoregressive steps.""" target_cols = inferer.target_columns - # 2. Initialize input and containers for storing results from all steps X = { key: tensor.numpy() for key, tensor in data.items() if key in config.input_columns } + metadata_np = {key: tensor.numpy() for key, tensor in metadata.items()} all_probs_list = {col: [] for col in target_cols} all_preds_list = {col: [] for col in target_cols} - # 3. Autoregressive loop + metadata_for_step = metadata_np for i in range(total_steps): if config.output_probabilities: - probs_for_step = inferer.infer_generative(X, return_probs=True) - preds_for_step = inferer.infer_generative(None, probs_for_step) + probs_for_step = inferer.infer_generative( + X, + metadata_for_step, + return_probs=True, + ) + preds_for_step = inferer.infer_generative( + None, metadata_for_step, probs_for_step + ) for col in target_cols: all_probs_list[col].append(probs_for_step[col]) else: - preds_for_step = inferer.infer_generative(X, return_probs=False) + preds_for_step = inferer.infer_generative( + X, metadata_for_step, return_probs=False + ) for col in target_cols: all_preds_list[col].append(preds_for_step[col]) @@ -801,6 +864,17 @@ def get_probs_preds_from_dict( X_next[col] = np.concatenate([shifted_input, new_value], axis=1) X = X_next + if ( + metadata_for_step is not None + and "attention_valid_mask" in metadata_for_step + ): + shifted_mask = metadata_for_step["attention_valid_mask"][:, 1:] + appended_valid = np.ones( + (shifted_mask.shape[0], 1), dtype=shifted_mask.dtype + ) + metadata_for_step["attention_valid_mask"] = np.concatenate( + [shifted_mask, appended_valid], axis=1 + ) final_preds = { col: np.array(preds_list).T.reshape(-1, 1).flatten() @@ -827,28 +901,20 @@ def get_embeddings( data: pl.DataFrame, column_types: dict[str, torch.dtype], ) -> np.ndarray: - """Generates embeddings from a Polars DataFrame. - - This function converts a Polars DataFrame into the NumPy array dictionary - format expected by the `Inferer`. It uses `numpy_to_pytorch` for the - main conversion, then transforms the tensors to NumPy arrays before - passing them to `inferer.infer_embedding`. - - Args: - config: The `InfererModel` configuration object. - inferer: The initialized `Inferer` instance. - data: The input Polars DataFrame chunk. - column_types: A dictionary mapping column names to `torch.dtype`. - - Returns: - A NumPy array containing the computed embeddings for the batch. - """ + """Infer embeddings from a Polars chunk.""" all_columns = sorted(list(set(config.input_columns + config.target_columns))) - X = numpy_to_pytorch(data, column_types, all_columns, config.seq_length) + resolved_view = resolve_window_view(config.storage_layout, config.window_view) + X, metadata = numpy_to_pytorch( + data, + column_types, + all_columns, + resolved_view, + ) X = {col: X_col.numpy() for col, X_col in X.items()} + metadata_np = {col: metadata_col.numpy() for col, metadata_col in metadata.items()} del data - embeddings = inferer.infer_embedding(X) + embeddings = inferer.infer_embedding(X, metadata=metadata_np) return embeddings @@ -860,86 +926,46 @@ def get_probs_preds_from_df( data: pl.DataFrame, column_types: dict[str, torch.dtype], ) -> tuple[Optional[dict[str, np.ndarray]], dict[str, np.ndarray]]: - """Generates predictions from a Polars DataFrame (non-autoregressive). - - This function converts a Polars DataFrame into the NumPy array dictionary - format expected by the `Inferer`. It's used for standard, - non-autoregressive generative inference. - It calls `inferer.infer_generative` once and returns the - probabilities (if requested) and predictions. - - Args: - config: The `InfererModel` configuration object. - inferer: The initialized `Inferer` instance. - data: The input Polars DataFrame chunk. - column_types: A dictionary mapping column names to `torch.dtype`. - - Returns: - A tuple `(probs, preds)`: - - `probs`: A dictionary mapping target columns to NumPy arrays - of probabilities, or `None` if `config.output_probabilities` - is False. - - `preds`: A dictionary mapping target columns to NumPy arrays - of final predictions. - """ + """Infer non-autoregressive predictions from a Polars chunk.""" all_columns = sorted(list(set(config.input_columns + config.target_columns))) - X = numpy_to_pytorch(data, column_types, all_columns, config.seq_length) + resolved_view = resolve_window_view(config.storage_layout, config.window_view) + X, metadata = numpy_to_pytorch( + data, + column_types, + all_columns, + resolved_view, + ) X = {col: X_col.numpy() for col, X_col in X.items()} + metadata_np = {col: metadata_col.numpy() for col, metadata_col in metadata.items()} del data if config.output_probabilities: - probs = inferer.infer_generative(X, return_probs=True) - preds = inferer.infer_generative(None, probs) + probs = inferer.infer_generative(X, metadata_np, return_probs=True) + preds = inferer.infer_generative(None, metadata_np, probs) else: probs = None - preds = inferer.infer_generative(X) + preds = inferer.infer_generative(X, metadata_np) return (probs, preds) @beartype def fill_number(number: Union[int, float], max_length: int) -> str: - """Pads a number with leading zeros to a specified string length. - - Used for creating sortable string keys (e.g., "001-001", "001-002"). - - Args: - number: The integer or float to format. - max_length: The total desired length of the output string. - - Returns: - A string representation of the number, padded with leading zeros. - """ + """Left-pad a number for sortable string keys.""" number_str = str(number) return f"{'0' * (max_length - len(number_str))}{number_str}" @beartype def verify_variable_order(data: pl.DataFrame) -> None: - """Verifies that the DataFrame is correctly sorted for autoregression. - - Checks two conditions: - 1. `sequenceId` is globally sorted in ascending order. - 2. `subsequenceId` is sorted in ascending order *within* each - `sequenceId` group. - - Args: - data: The Polars DataFrame to check. - - Raises: - AssertionError: If `sequenceId` is not globally sorted or if - `subsequenceId` is not sorted within `sequenceId` groups. - """ - # Check if the entire 'sequenceId' column is sorted. This is a global property. + """Require sequenceId order and in-sequence subsequenceId order.""" is_globally_sorted = data.select( (pl.col("sequenceId").diff().fill_null(0) >= 0).all() ).item() if not is_globally_sorted: raise ValueError("sequenceId must be in ascending order for autoregression") - # Check if 'subsequenceId' is sorted within each 'sequenceId' group. - # This results in a boolean Series, on which we can call .all() directly. is_group_sorted = ( data.select( (pl.col("subsequenceId").diff().fill_null(0) >= 0) @@ -961,29 +987,15 @@ def get_probs_preds_autoregression( inferer: "Inferer", data: pl.DataFrame, column_types: dict[str, torch.dtype], - seq_length: int, + context_length: int, ) -> tuple[ - Optional[dict[str, np.ndarray]], dict[str, np.ndarray], np.ndarray, np.ndarray + Optional[dict[str, np.ndarray]], + dict[str, np.ndarray], + np.ndarray, + np.ndarray, + np.ndarray, ]: - """Generates autoregressive predictions and aligns them with sequence IDs and positions. - - Extracts the initial sequence context from the sorted input DataFrame, maps it - to PyTorch tensors, and executes step-by-step autoregressive inference. - - Args: - config: Inference configuration object. - inferer: Initialized `Inferer` instance. - data: Input DataFrame, sorted globally by `sequenceId` and locally by `subsequenceId`. - column_types: Mapping of input column names to their `torch.dtype`. - seq_length: Length of the input sequence context. - - Returns: - A tuple containing: - - probs: Dict of probability arrays per target column (None if disabled). - - preds: Dict of final prediction arrays per target column. - - sequence_ids_for_preds: 1D array of sequence IDs matching the output shape. - - item_positions_for_preds: 1D array of absolute item positions for each step. - """ + """Infer autoregressive predictions with sequence IDs, positions, and mask.""" verify_variable_order(data) distinct_cols = len(np.unique(data["inputCol"].to_numpy())) @@ -998,22 +1010,25 @@ def get_probs_preds_autoregression( .agg(pl.col("startItemPosition").max()) .get_column("startItemPosition") .to_numpy() - + seq_length + + context_length ) - head_data = numpy_to_pytorch( + resolved_view = resolve_window_view(config.storage_layout, config.window_view) + head_data, metadata = numpy_to_pytorch( head_data_df, column_types, config.input_columns, - seq_length, + resolved_view, ) - # Run the autoregressive PyTorch inference probs, preds = get_probs_preds_from_dict( - config, inferer, head_data, total_steps=config.autoregression_total_steps + config, + inferer, + head_data, + metadata, + config.autoregression_total_steps, ) - # 4. Generate the final output arrays using the perfectly aligned bases item_positions_for_preds = np.concatenate( [ np.arange(start_pos, start_pos + config.autoregression_total_steps) @@ -1026,30 +1041,20 @@ def get_probs_preds_autoregression( aligned_sequence_ids, config.autoregression_total_steps ) - return probs, preds, sequence_ids_for_preds, item_positions_for_preds + base_mask = _flatten_valid_mask(config, metadata, 1) + valid_prediction_mask = np.repeat(base_mask, config.autoregression_total_steps) + + return ( + probs, + preds, + sequence_ids_for_preds, + item_positions_for_preds, + valid_prediction_mask, + ) class Inferer: - """A class for performing inference with a trained sequifier model. - - This class encapsulates the model (either ONNX session or PyTorch model), - normalization statistics, ID mappings, and all configuration needed - to run inference. It provides methods to handle batching, model-specific - inference calls (PyTorch vs. ONNX), and post-processing - (like inverting normalization). - - Attributes: - model_type: 'generative' or 'embedding'. - map_to_id: Whether to map integer predictions back to original IDs. - selected_columns_statistics: Dict of 'mean' and 'std' for real columns. - index_map: The inverse of `id_maps`, for mapping indices back to values. - device: The device ('cuda' or 'cpu') for inference. - target_columns: List of columns the model predicts. - target_column_types: Dict mapping target columns to 'categorical' or 'real'. - inference_model_type: 'onnx' or 'pt'. - ort_session: `onnxruntime.InferenceSession` if using ONNX. - inference_model: The loaded PyTorch model if using 'pt'. - """ + """Inference runtime for PT/ONNX sequifier models.""" @beartype def __init__( @@ -1073,27 +1078,7 @@ def __init__( args_config: dict[str, Any], training_config_path: str, ): - """Initializes the Inferer. - - Args: - model_type: The type of model to use for inference. - model_path: The path to the trained model. - project_root: The path to the sequifier project directory. - id_maps: A dictionary of id maps for categorical columns. - selected_columns_statistics: A dictionary of statistics for numerical columns. - map_to_id: Whether to map the output to the original ids. - categorical_columns: A list of categorical columns. - real_columns: A list of real columns. - selected_columns: A list of selected columns. - target_columns: A list of target columns. - target_column_types: A dictionary of target column types. - sample_from_distribution_columns: A list of columns to sample from the distribution. - infer_with_dropout: Whether to use dropout during inference. - inference_batch_size: The batch size for inference. - device: The device to use for inference. - args_config: The command-line arguments. - training_config_path: The path to the training configuration file. - """ + """Load a PT or ONNX backend and postprocessing state.""" self.model_type = model_type self.map_to_id = map_to_id self.selected_columns_statistics = selected_columns_statistics @@ -1150,19 +1135,7 @@ def __init__( def invert_normalization( self, values: np.ndarray, target_column: str ) -> np.ndarray: - """Inverts Z-score normalization for a given target column. - - Uses the 'mean' and 'std' stored in `self.selected_columns_statistics` - to transform normalized values back to their original scale. - - Args: - values: A NumPy array of normalized values. - target_column: The name of the column whose statistics should be - used for the inverse transformation. - - Returns: - A NumPy array of values in their original scale. - """ + """Invert target-column Z-score normalization.""" std = self.selected_columns_statistics[target_column]["std"] mean = self.selected_columns_statistics[target_column]["mean"] return (values * (std - 1e-9)) + mean @@ -1171,23 +1144,12 @@ def invert_normalization( def infer_embedding( self, x: dict[str, np.ndarray], + metadata: dict[str, np.ndarray], ) -> np.ndarray: - """Performs inference with an embedding model. - - This is a high-level wrapper that calls - `adjust_and_infer_embedding` to handle batching and model-specific - logic. - - Args: - x: A dictionary mapping feature names to NumPy arrays. All arrays - must have the same first dimension (batch size). - - Returns: - A 2D NumPy array of the resulting embeddings. - """ + """Return embeddings for a feature-array batch.""" assert x is not None size = x[list(x.keys())[0]].shape[0] - embedding = self.adjust_and_infer_embedding(x, size) + embedding = self.adjust_and_infer_embedding(x, size, metadata) return embedding @@ -1195,39 +1157,11 @@ def infer_embedding( def infer_generative( self, x: Optional[dict[str, np.ndarray]], + metadata: dict[str, np.ndarray], probs: Optional[dict[str, np.ndarray]] = None, return_probs: bool = False, ) -> dict[str, np.ndarray]: - """Performs generative inference, returning probabilities or predictions. - - This function orchestrates the generative inference process. - 1. If `probs` are not provided, it calls `adjust_and_infer_generative` - to get the raw model output (logits or real values) using `x`. - 2. If `return_probs` is True: - - It normalizes the logits for categorical columns to get - probabilities (using `softmax`, implemented in `normalize`). - - It returns a dictionary of probabilities (for categorical) and - raw predicted values (for real). - 3. If `return_probs` is False (default): - - It converts the model outputs (either from `x` or `probs`) into - final predictions. - - For categorical columns, it either takes the `argmax` or samples - from the distribution (`sample_with_cumsum`). - - For real columns, it returns the value as-is. - - Args: - x: A dictionary mapping feature names to NumPy arrays. Required - if `probs` is not provided. - probs: An optional dictionary of probabilities/logits. If provided, - this skips the model inference step. - return_probs: If True, returns normalized probabilities for - categorical targets. If False, returns final class - predictions (via argmax or sampling). - - Returns: - A dictionary mapping target column names to NumPy arrays. The - content of the arrays depends on `return_probs`. - """ + """Return target probabilities or decoded predictions.""" if probs is None or ( x is not None and len(set(x.keys()).difference(set(probs.keys()))) > 0 ): # type: ignore @@ -1242,7 +1176,7 @@ def infer_generative( f"Not all keys in x are in probs - {x.keys() = } != {probs.keys() = }. Full inference is executed." ) - outs = self.adjust_and_infer_generative(x, size) + outs = self.adjust_and_infer_generative(x, size, metadata) for target_column, target_outs in outs.items(): if np.any(target_outs == np.inf): @@ -1280,65 +1214,62 @@ def infer_generative( return outs @beartype - def adjust_and_infer_embedding(self, x: dict[str, np.ndarray], size: int): - """Handles batching and backend-specific calls for embedding inference. - - This function prepares the input data `x` into batches using - `prepare_inference_batches` and then calls the correct inference - backend based on `self.inference_model_type` (.pt or .onnx). - - Args: - x: The complete dictionary of input features (NumPy arrays). - size: The total number of samples in `x`, used to truncate - any padding added for batching. - - Returns: - A NumPy array of embeddings, concatenated from all batches. - """ + def adjust_and_infer_embedding( + self, + x: dict[str, np.ndarray], + size: int, + metadata: dict[str, np.ndarray], + ): + """Batch embedding inference across the active backend.""" if self.inference_model_type == "onnx": assert x is not None x_adjusted = self.prepare_inference_batches(x, pad_to_batch_size=True) + metadata_adjusted = self.prepare_inference_batches( + metadata, pad_to_batch_size=True + ) + inference_batch_embeddings = [ - self.infer_pure(x_sub)[0] for x_sub in x_adjusted + self.infer_pure(x_sub, metadata_sub)[0] + for x_sub, metadata_sub in zip(x_adjusted, metadata_adjusted) + ] + embeddings = np.concatenate(inference_batch_embeddings, axis=0)[ + : size * self.prediction_length ] - embeddings = np.concatenate(inference_batch_embeddings, axis=0)[:size] elif self.inference_model_type == "pt": x_adjusted = self.prepare_inference_batches(x, pad_to_batch_size=False) + metadata_adjusted = self.prepare_inference_batches( + metadata, pad_to_batch_size=False + ) + embeddings = infer_with_embedding_model( self.inference_model, x_adjusted, self.device, size, self.target_columns, + metadata=metadata_adjusted, ) else: assert False, "not possible" return embeddings @beartype - def adjust_and_infer_generative(self, x: dict[str, np.ndarray], size: int): - """Handles batching and backend-specific calls for generative inference. - - This function prepares the input data `x` into batches using - `prepare_inference_batches` and then calls the correct inference - backend based on `self.inference_model_type` (.pt or .onnx). - It aggregates the results from all batches. - - Args: - x: The complete dictionary of input features (NumPy arrays). - size: The total number of samples in `x`, used to truncate - any padding added for batching. - - Returns: - A dictionary mapping target column names to NumPy arrays of raw - model outputs (logits or real values). - """ + def adjust_and_infer_generative( + self, + x: dict[str, np.ndarray], + size: int, + metadata: dict[str, np.ndarray], + ): + """Batch generative inference across the active backend.""" if self.inference_model_type == "onnx": assert x is not None x_adjusted = self.prepare_inference_batches(x, pad_to_batch_size=True) + metadata_adjusted = self.prepare_inference_batches( + metadata, pad_to_batch_size=True + ) out_subs = [ - dict(zip(self.target_columns, self.infer_pure(x_sub))) - for x_sub in x_adjusted + dict(zip(self.target_columns, self.infer_pure(x_sub, metadata_sub))) + for x_sub, metadata_sub in zip(x_adjusted, metadata_adjusted) ] outs = { target_column: np.concatenate( @@ -1349,12 +1280,16 @@ def adjust_and_infer_generative(self, x: dict[str, np.ndarray], size: int): elif self.inference_model_type == "pt": assert x is not None x_adjusted = self.prepare_inference_batches(x, pad_to_batch_size=False) + metadata_adjusted = self.prepare_inference_batches( + metadata, pad_to_batch_size=False + ) outs = infer_with_generative_model( self.inference_model, x_adjusted, self.device, size * self.prediction_length, self.target_columns, + metadata=metadata_adjusted, ) else: assert False @@ -1366,23 +1301,7 @@ def adjust_and_infer_generative(self, x: dict[str, np.ndarray], size: int): def prepare_inference_batches( self, x: dict[str, np.ndarray], pad_to_batch_size: bool ) -> list[dict[str, np.ndarray]]: - """Splits input data into batches for inference. - - This function takes a large dictionary of feature arrays and splits - them into a list of smaller dictionaries (batches) of size - `self.inference_batch_size`. - - Args: - x: A dictionary of feature arrays. - pad_to_batch_size: If True (for ONNX), the last batch will be - padded up to `self.inference_batch_size` by repeating - samples. If False (for PyTorch), the last batch may be - smaller. - - Returns: - A list of dictionaries, where each dictionary is a single batch - ready for inference. - """ + """Split feature arrays into backend-sized batches.""" size = x[list(x.keys())[0]].shape[0] if size == self.inference_batch_size: return [x] @@ -1408,28 +1327,30 @@ def prepare_inference_batches( return xs @beartype - def infer_pure(self, x: dict[str, np.ndarray]) -> list[np.ndarray]: - """Performs a single inference pass using the ONNX session. - - This function assumes `x` is already a single, correctly-sized - batch. It formats the input dictionary to match the ONNX model's - input names and executes `self.ort_session.run()`. - - Args: - x: A dictionary of feature arrays for a single batch. This - batch *must* be of size `self.inference_batch_size`. - - Returns: - A list of NumPy arrays, representing the raw outputs from the - ONNX model. - """ - ort_inputs = { - session_input.name: self.expand_to_batch_size(x[col]) - for session_input, col in zip( - self.ort_session.get_inputs(), - self.categorical_columns + self.real_columns, - ) - } + def infer_pure( + self, + x: dict[str, np.ndarray], + metadata: dict[str, np.ndarray], + ) -> list[np.ndarray]: + """Run one ONNX batch and flatten sequence-major outputs.""" + metadata = metadata or {} + ort_inputs = {} + for session_input in self.ort_session.get_inputs(): + input_name = session_input.name + if input_name in metadata: + value = metadata[input_name] + elif input_name.endswith("_in") and input_name[:-3] in x: + feature_column = input_name[:-3] + value = x[feature_column] + elif input_name in x: + value = x[input_name] + else: + raise ValueError( + f"Could not map ONNX input '{input_name}' to a feature or metadata array." + ) + + ort_inputs[input_name] = self.expand_to_batch_size(value) + ort_outs = self.ort_session.run(None, ort_inputs) return [ oo.transpose(1, 0, 2).reshape(oo.shape[0] * oo.shape[1], oo.shape[2]) @@ -1438,18 +1359,7 @@ def infer_pure(self, x: dict[str, np.ndarray]) -> list[np.ndarray]: @beartype def expand_to_batch_size(self, x: np.ndarray) -> np.ndarray: - """Pads a NumPy array to match `self.inference_batch_size`. - - Repeats samples from `x` until the array's first dimension - is equal to `self.inference_batch_size`. - - Args: - x: The input NumPy array to pad. - - Returns: - A new NumPy array of size `self.inference_batch_size` in the - first dimension. - """ + """Repeat leading samples until the ONNX batch size is met.""" repetitions = self.inference_batch_size // x.shape[0] filler = self.inference_batch_size % x.shape[0] return np.concatenate(([x] * repetitions) + [x[0:filler, :]], axis=0) @@ -1457,53 +1367,41 @@ def expand_to_batch_size(self, x: np.ndarray) -> np.ndarray: @beartype def normalize(outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: - """Applies the softmax function to a dictionary of logits. - - Converts raw model logits for categorical columns into probabilities - that sum to 1. - - Args: - outs: A dictionary mapping target column names to NumPy arrays - of logits. - - Returns: - A dictionary mapping the same target column names to NumPy arrays - of probabilities. - """ - normalizer = { - target_column: np.repeat( - np.sum(np.exp(target_values), axis=1), target_values.shape[1] - ).reshape(target_values.shape) + """Softmax logits by target column.""" + shifted_values = { + target_column: target_values - np.max(target_values, axis=1, keepdims=True) for target_column, target_values in outs.items() } + exp_values = { + target_column: np.exp(target_values) + for target_column, target_values in shifted_values.items() + } probs = { - target_column: np.exp(target_values) / normalizer[target_column] - for target_column, target_values in outs.items() + target_column: target_values / np.sum(target_values, axis=1, keepdims=True) + for target_column, target_values in exp_values.items() } return probs @beartype def sample_with_cumsum(probs: np.ndarray, is_log_probs: bool = True) -> np.ndarray: - """Samples from a probability distribution using the inverse CDF method. - - Takes an array of logits, computes the cumulative probability - distribution, draws a random number `r` from [0, 1), and returns - the index of the first class `i` where `cumsum[i] > r`. - - Args: - probs: A 2D NumPy array of logits or normalized probabilities. - Shape is (batch_size, num_classes). - is_log_probs: Boolean flag indicating if the passed array are logits or - probabilities - Returns: - A 1D NumPy array of shape (batch_size,) containing the sampled - class indices. - """ + """Sample class indices from log-probabilities or probabilities.""" if is_log_probs: - cumulative_probs = np.cumsum(np.exp(probs), axis=1) + sampling_probs = np.exp(probs) else: - cumulative_probs = np.cumsum(probs, axis=1) + sampling_probs = probs + + if not np.isfinite(sampling_probs).all(): + raise ValueError("Sampling probabilities must be finite.") + if np.any(sampling_probs < 0): + raise ValueError("Sampling probabilities must be non-negative.") + + row_sums = sampling_probs.sum(axis=1) + if not np.allclose(row_sums, 1.0): + raise ValueError("Sampling probabilities must sum to 1.0 for each row.") + + cumulative_probs = np.cumsum(sampling_probs, axis=1) + cumulative_probs[:, -1] = 1.0 random_threshold = np.random.rand(cumulative_probs.shape[0], 1) random_threshold = np.repeat(random_threshold, probs.shape[1], axis=1) return (random_threshold < cumulative_probs).argmax(axis=1) diff --git a/src/sequifier/io/batch.py b/src/sequifier/io/batch.py new file mode 100644 index 00000000..8f9e7fe4 --- /dev/null +++ b/src/sequifier/io/batch.py @@ -0,0 +1,41 @@ +from dataclasses import dataclass +from typing import Optional + +import torch + +REQUIRED_METADATA_KEYS = frozenset({"attention_valid_mask", "target_valid_mask"}) + + +@dataclass(frozen=True) +class SequifierBatch: + inputs: dict[str, torch.Tensor] + targets: dict[str, torch.Tensor] + metadata: dict[str, torch.Tensor] + sequence_ids: Optional[torch.Tensor] = None + subsequence_ids: Optional[torch.Tensor] = None + + def __post_init__(self) -> None: + metadata_keys = self.metadata.keys() if self.metadata is not None else set() + missing_keys = REQUIRED_METADATA_KEYS - metadata_keys + if missing_keys: + missing = ", ".join(sorted(missing_keys)) + raise ValueError( + f"SequifierBatch metadata is missing required keys: {missing}" + ) + + def pin_memory(self) -> "SequifierBatch": + return SequifierBatch( + inputs={k: v.pin_memory() for k, v in self.inputs.items()}, + targets={k: v.pin_memory() for k, v in self.targets.items()}, + metadata={k: v.pin_memory() for k, v in self.metadata.items()}, + sequence_ids=( + self.sequence_ids.pin_memory() + if self.sequence_ids is not None + else None + ), + subsequence_ids=( + self.subsequence_ids.pin_memory() + if self.subsequence_ids is not None + else None + ), + ) diff --git a/src/sequifier/io/iteration_state.py b/src/sequifier/io/iteration_state.py new file mode 100644 index 00000000..d6f80aae --- /dev/null +++ b/src/sequifier/io/iteration_state.py @@ -0,0 +1,80 @@ +from collections.abc import Sequence + +import torch + + +def shared_int(value: int = 0) -> torch.Tensor: + """Return a shared scalar int tensor visible to DataLoader worker copies.""" + state = torch.empty((), dtype=torch.int64) + state.fill_(int(value)) + state.share_memory_() + return state + + +def read_shared_int(state: torch.Tensor) -> int: + return int(state.item()) + + +def write_shared_int(state: torch.Tensor, value: int) -> None: + state.fill_(int(value)) + + +def resolve_resume_worker( + start_batch: int, + worker_id: int, + num_workers: int, + worker_batch_counts: Sequence[int], +) -> tuple[int, int]: + """Map a physical worker to the logical worker/batch offset after resume. + + PyTorch requests IterableDataset samples from workers in worker-id order. To + resume at a non-zero global batch without yielding skipped batches, worker 0 + is rotated onto the worker that would have produced start_batch in the + uninterrupted iterator. Each logical worker then skips only the batches it + owned before start_batch. + """ + if num_workers <= 0: + raise ValueError("num_workers must be positive.") + if len(worker_batch_counts) != num_workers: + raise ValueError("worker_batch_counts must match num_workers.") + + counts = [max(0, int(count)) for count in worker_batch_counts] + total_batches = sum(counts) + capped_start = min(max(0, int(start_batch)), total_batches) + if capped_start == 0 or total_batches == 0: + return worker_id, 0 + + skips = [0] * num_workers + active_workers = [i for i, count in enumerate(counts) if count > 0] + consumed = 0 + start_worker = active_workers[0] if active_workers else 0 + + while active_workers and consumed < capped_start: + rounds_until_next_exhaustion = min(counts[i] - skips[i] for i in active_workers) + block_batches = rounds_until_next_exhaustion * len(active_workers) + remaining = capped_start - consumed + + if remaining >= block_batches: + for i in active_workers: + skips[i] += rounds_until_next_exhaustion + consumed += block_batches + active_workers = [i for i in active_workers if skips[i] < counts[i]] + start_worker = active_workers[0] if active_workers else 0 + continue + + full_rounds, offset = divmod(remaining, len(active_workers)) + for i in active_workers: + skips[i] += full_rounds + for i in active_workers[:offset]: + skips[i] += 1 + start_worker = active_workers[offset] + consumed = capped_start + + logical_worker_id = (worker_id + start_worker) % num_workers + return logical_worker_id, skips[logical_worker_id] + + +def skip_samples_for_batches( + skip_batches: int, batch_size: int, total_samples: int +) -> int: + return min(max(0, int(skip_batches)) * int(batch_size), max(0, int(total_samples))) diff --git a/src/sequifier/io/sequifier_dataset_from_file.py b/src/sequifier/io/sequifier_dataset_from_file.py index ec590953..c96358a3 100644 --- a/src/sequifier/io/sequifier_dataset_from_file.py +++ b/src/sequifier/io/sequifier_dataset_from_file.py @@ -1,5 +1,5 @@ import math -from typing import Dict, Iterator, Tuple +from typing import Iterator import torch import torch.distributed as dist @@ -7,27 +7,33 @@ from torch.utils.data import IterableDataset from sequifier.config.train_config import TrainModel -from sequifier.helpers import PANDAS_TO_TORCH_TYPES, numpy_to_pytorch, read_data +from sequifier.helpers import ( + PANDAS_TO_TORCH_TYPES, + numpy_to_pytorch, + read_data, + resolve_window_view, +) +from sequifier.io.batch import SequifierBatch +from sequifier.io.iteration_state import ( + read_shared_int, + resolve_resume_worker, + shared_int, + skip_samples_for_batches, + write_shared_int, +) class SequifierDatasetFromFile(IterableDataset): - """ - An iterable-style dataset that pre-loads all data into CPU RAM and yields - pre-collated batches. - - This is the idiomatic PyTorch solution for implementing custom 'en block' - batching. The __iter__ method handles shuffling and batch slicing, ensuring - maximum performance. - """ + """Eager single-file dataset yielding pre-collated batches.""" def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): super().__init__() self.config = config self.batch_size = config.training_spec.batch_size self.shuffle = shuffle - self.epoch = 0 + self._epoch_state = shared_int(0) + self._start_batch_state = shared_int(0) - # Create a unified list of all columns the model might need all_columns = sorted(list(set(config.input_columns + config.target_columns))) logger.info( @@ -40,12 +46,12 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): for col in config.column_types } - # self.all_tensors now holds both inputs and targets - all_tensors = numpy_to_pytorch( + resolved_view = resolve_window_view(config.storage_layout, config.window_view) + all_tensors, metadata_tensors = numpy_to_pytorch( data=data_df, column_types=column_types, all_columns=all_columns, - seq_length=config.seq_length, + resolved_view=resolved_view, ) self.n_samples = all_tensors[all_columns[0]].shape[0] @@ -57,6 +63,7 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): self.target_tensors = { key: all_tensors[f"{key}_target"] for key in self.config.target_columns } + self.metadata_tensors = metadata_tensors del all_tensors if config.training_spec.device.startswith("cuda"): @@ -64,58 +71,64 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): self.sequence_tensors[key] = self.sequence_tensors[key].pin_memory() for key in self.target_tensors: self.target_tensors[key] = self.target_tensors[key].pin_memory() + for key in self.metadata_tensors: + self.metadata_tensors[key] = self.metadata_tensors[key].pin_memory() logger.info(f"[INFO] Dataset loaded with {self.n_samples} samples.") def set_epoch(self, epoch: int): - """Allows the training loop to set the epoch for deterministic shuffling.""" - self.epoch = epoch + """Set the shuffle epoch.""" + write_shared_int(self._epoch_state, epoch) + + def set_start_batch(self, start_batch: int): + """Set the first global batch to yield on the next iteration.""" + write_shared_int(self._start_batch_state, start_batch) def __len__(self) -> int: - """Returns the total number of samples in the dataset.""" return math.ceil(self.n_samples / self.batch_size) def __iter__( self, - ) -> Iterator[ - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None] - ]: - """Yields batches of data. - - Handles shuffling (if enabled) and slicing data based on distributed - rank and worker ID. - - Yields: - Iterator[Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None]]: - An iterator where each item is a tuple containing: - - data_batch (dict): Dictionary of feature tensors for the batch. - - targets_batch (dict): Dictionary of target tensors for the batch. - - None: Placeholder for sequence_id (not used in this dataset type). - - None: Placeholder for subsequence_id (not used in this dataset type). - - None: Placeholder for start_position (not used in this dataset type). - """ + ) -> Iterator[SequifierBatch]: worker_info = torch.utils.data.get_worker_info() world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 if worker_info is None: # Single-process data loading - worker_id = 0 + physical_worker_id = 0 num_workers = 1 else: # Multi-process data loading - worker_id = worker_info.id + physical_worker_id = worker_info.id num_workers = worker_info.num_workers + epoch = read_shared_int(self._epoch_state) + start_batch = read_shared_int(self._start_batch_state) indices = torch.arange(self.n_samples) if self.shuffle: g = torch.Generator() # Use epoch and seed for a different but deterministic shuffle each epoch - g.manual_seed(self.config.seed + self.epoch) + g.manual_seed(self.config.seed + epoch) indices = indices[torch.randperm(self.n_samples, generator=g)] indices_for_rank = indices[rank::world_size] + worker_batch_counts = [ + len(indices_for_rank[i::num_workers]) // self.batch_size + for i in range(num_workers) + ] + worker_id, skip_batches = resolve_resume_worker( + start_batch, + physical_worker_id, + num_workers, + worker_batch_counts, + ) + indices_for_worker = indices_for_rank[worker_id::num_workers] + skipped_samples = skip_samples_for_batches( + skip_batches, self.batch_size, len(indices_for_worker) + ) + indices_for_worker = indices_for_worker[skipped_samples:] for i in range(0, len(indices_for_worker), self.batch_size): batch_end = i + self.batch_size @@ -132,5 +145,13 @@ def __iter__( key: tensor[batch_indices] for key, tensor in self.target_tensors.items() } + metadata_batch = { + key: tensor[batch_indices] + for key, tensor in self.metadata_tensors.items() + } - yield data_batch, targets_batch, None, None, None + yield SequifierBatch( + inputs=data_batch, + targets=targets_batch, + metadata=metadata_batch, + ) diff --git a/src/sequifier/io/sequifier_dataset_from_folder_parquet.py b/src/sequifier/io/sequifier_dataset_from_folder_parquet.py index 5beb3347..9e4acca7 100644 --- a/src/sequifier/io/sequifier_dataset_from_folder_parquet.py +++ b/src/sequifier/io/sequifier_dataset_from_folder_parquet.py @@ -1,7 +1,7 @@ import json import math import os -from typing import Dict, Iterator, Tuple +from typing import Dict, Iterator import polars as pl import torch @@ -10,17 +10,26 @@ from torch.utils.data import IterableDataset, get_worker_info from sequifier.config.train_config import TrainModel -from sequifier.helpers import PANDAS_TO_TORCH_TYPES, normalize_path +from sequifier.helpers import ( + PANDAS_TO_TORCH_TYPES, + columns_from_slice, + get_left_pad_lengths_from_preprocessed_data, + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, +) +from sequifier.io.batch import SequifierBatch +from sequifier.io.iteration_state import ( + read_shared_int, + resolve_resume_worker, + shared_int, + skip_samples_for_batches, + write_shared_int, +) class SequifierDatasetFromFolderParquet(IterableDataset): - """ - An efficient PyTorch IterableDataset that pre-loads a folder of chunked - Parquet files entirely into CPU RAM at initialization. - - Yields full, pre-collated batches natively. Fully supports DDP/FSDP distributed - environments using customizable sampling strategies. - """ + """Eager Parquet-folder dataset yielding rank/worker-aligned batches.""" def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): super().__init__() @@ -28,7 +37,8 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): self.config = config self.batch_size = config.training_spec.batch_size self.shuffle = shuffle - self.epoch = 0 + self._epoch_state = shared_int(0) + self._start_batch_state = shared_int(0) self.sampling_strategy = config.training_spec.sampling_strategy metadata_path = os.path.join(self.data_dir, "metadata.json") @@ -41,6 +51,9 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): with open(metadata_path, "r") as f: metadata = json.load(f) + self.folder_layout = stored_window_layout_from_metadata(metadata) + self.resolved_view = resolve_window_view(self.folder_layout, config.window_view) + self.n_samples = metadata["total_samples"] logger.info( @@ -53,22 +66,29 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): } # Sequence formatting structures matching long-format schema boundaries - train_seq_len = self.config.seq_length - input_seq_cols = [str(c) for c in range(train_seq_len, 0, -1)] - target_seq_cols = [str(c) for c in range(train_seq_len - 1, -1, -1)] - + input_seq_cols = columns_from_slice( + self.resolved_view.input_slice, self.folder_layout.stored_context_width + ) + target_seq_cols = columns_from_slice( + self.resolved_view.target_slice, self.folder_layout.stored_context_width + ) all_sequences: Dict[str, list[torch.Tensor]] = { col: [] for col in config.input_columns } all_targets: Dict[str, list[torch.Tensor]] = { col: [] for col in config.target_columns } + all_left_pad_lengths: list[torch.Tensor] = [] # Step 1: Eager I/O reduction pass over all chunk allocations for file_info in metadata["batch_files"]: file_path = os.path.join(self.data_dir, file_info["path"]) df = pl.read_parquet(file_path) + left_pad_lengths = get_left_pad_lengths_from_preprocessed_data(df) + if left_pad_lengths is not None: + all_left_pad_lengths.append(left_pad_lengths) + for col in all_sequences.keys(): feature_df = df.filter(pl.col("inputCol") == col) if not feature_df.is_empty(): @@ -99,12 +119,15 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): for col, tensors in all_targets.items() if tensors } + self.left_pad_lengths = torch.cat(all_left_pad_lengths) # Step 3: Prevent serialization duplications across worker forks via shared memory flags for tensor in self.sequences.values(): tensor.share_memory_() for tensor in self.targets.values(): tensor.share_memory_() + if self.left_pad_lengths is not None: + self.left_pad_lengths.share_memory_() self.target_samples = self._get_target_samples() self.total_batches = self._calculate_total_batches(self.target_samples) @@ -126,11 +149,15 @@ def _calculate_total_batches(self, target_samples: int) -> int: return total_batches def set_epoch(self, epoch: int): - """Allows the training loop to synchronize seed steps for shuffling.""" - self.epoch = epoch + """Set the shuffle epoch.""" + write_shared_int(self._epoch_state, epoch) + + def set_start_batch(self, start_batch: int): + """Set the first global batch to yield on the next iteration.""" + write_shared_int(self._start_batch_state, start_batch) def _get_target_samples(self) -> int: - """Calculates precise sample counts per rank to manage FSDP layer allocations.""" + """Return per-rank sample count under the configured sampling strategy.""" world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 @@ -151,50 +178,85 @@ def __len__(self) -> int: def __iter__( self, - ) -> Iterator[ - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None] - ]: + ) -> Iterator[SequifierBatch]: world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 worker_info = get_worker_info() - worker_id = worker_info.id if worker_info is not None else 0 + physical_worker_id = worker_info.id if worker_info is not None else 0 num_workers = worker_info.num_workers if worker_info is not None else 1 + epoch = read_shared_int(self._epoch_state) + start_batch = read_shared_int(self._start_batch_state) - # 1. Coordinate global shuffling masks indices = torch.arange(self.n_samples) if self.shuffle: g = torch.Generator() - g.manual_seed(self.config.seed + self.epoch) + g.manual_seed(self.config.seed + epoch) indices = indices[torch.randperm(self.n_samples, generator=g)] - # 2. Slice metrics based on GPU distribution metrics indices_for_rank = indices[rank::world_size].tolist() + sample_is_real = [True] * len(indices_for_rank) - # 3. Synchronize cross-device oversampling/undersampling rules if self.sampling_strategy == "oversampling": + real_count = len(indices_for_rank) + if real_count == 0: + fallback_indices = indices.tolist() + while len(indices_for_rank) < self.target_samples and fallback_indices: + n = min( + len(fallback_indices), + self.target_samples - len(indices_for_rank), + ) + indices_for_rank.extend(fallback_indices[:n]) + sample_is_real.extend([False] * n) while len(indices_for_rank) < self.target_samples: - indices_for_rank.extend( - indices_for_rank[: self.target_samples - len(indices_for_rank)] - ) + n = min(real_count, self.target_samples - len(indices_for_rank)) + indices_for_rank.extend(indices_for_rank[:n]) + sample_is_real.extend([False] * n) elif self.sampling_strategy == "undersampling": indices_for_rank = indices_for_rank[: self.target_samples] + sample_is_real = sample_is_real[: self.target_samples] + + worker_batch_counts = [ + math.ceil(len(indices_for_rank[i::num_workers]) / self.batch_size) + for i in range(num_workers) + ] + worker_id, skip_batches = resolve_resume_worker( + start_batch, + physical_worker_id, + num_workers, + worker_batch_counts, + ) - # 4. Map worker task splits indices_for_worker = indices_for_rank[worker_id::num_workers] + sample_is_real_for_worker = sample_is_real[worker_id::num_workers] + skipped_samples = skip_samples_for_batches( + skip_batches, self.batch_size, len(indices_for_worker) + ) + indices_for_worker = indices_for_worker[skipped_samples:] + sample_is_real_for_worker = sample_is_real_for_worker[skipped_samples:] - # 5. Extract and pass unified data frames - train_seq_len = self.config.seq_length for i in range(0, len(indices_for_worker), self.batch_size): batch_indices = indices_for_worker[i : i + self.batch_size] + batch_sample_is_real = sample_is_real_for_worker[i : i + self.batch_size] data_batch = { - key: tensor[batch_indices, -train_seq_len:] - for key, tensor in self.sequences.items() + key: tensor[batch_indices] for key, tensor in self.sequences.items() } targets_batch = { - key: tensor[batch_indices, -train_seq_len:] - for key, tensor in self.targets.items() + key: tensor[batch_indices] for key, tensor in self.targets.items() } - yield data_batch, targets_batch, None, None, None + metadata_batch = {} + if self.left_pad_lengths is not None: + metadata_batch = self.resolved_view.build_masks( + self.left_pad_lengths[batch_indices] + ) + metadata_batch["sample_valid_mask"] = torch.tensor( + batch_sample_is_real, dtype=torch.bool + ) + + yield SequifierBatch( + inputs=data_batch, + targets=targets_batch, + metadata=metadata_batch, + ) diff --git a/src/sequifier/io/sequifier_dataset_from_folder_parquet_lazy.py b/src/sequifier/io/sequifier_dataset_from_folder_parquet_lazy.py index cc000e1c..df1a71d1 100644 --- a/src/sequifier/io/sequifier_dataset_from_folder_parquet_lazy.py +++ b/src/sequifier/io/sequifier_dataset_from_folder_parquet_lazy.py @@ -1,7 +1,7 @@ import json import math import os -from typing import Dict, Iterator, Tuple +from typing import Dict, Iterator import numpy as np import polars as pl @@ -11,33 +11,26 @@ from torch.utils.data import IterableDataset, get_worker_info from sequifier.config.train_config import TrainModel -from sequifier.helpers import PANDAS_TO_TORCH_TYPES, normalize_path +from sequifier.helpers import ( + PANDAS_TO_TORCH_TYPES, + columns_from_slice, + get_left_pad_lengths_from_preprocessed_data, + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, +) +from sequifier.io.batch import SequifierBatch +from sequifier.io.iteration_state import ( + read_shared_int, + resolve_resume_worker, + shared_int, + skip_samples_for_batches, + write_shared_int, +) class SequifierDatasetFromFolderParquetLazy(IterableDataset): - """ - An efficient, memory-safe PyTorch IterableDataset for out-of-core training. - - Streams long-format Parquet files sequentially using cross-file buffering to yield - exact batches, eliminating CPU cloning bottlenecks. Fully supports DDP/FSDP by - precisely calculating and distributing sample boundaries across GPU ranks and workers. - - Args: - data_path (str): Path to the directory containing `.parquet` chunks and `metadata.json`. - config (TrainModel): Training configuration (batch size, workers, sequence length, etc.). - shuffle (bool, optional): If True, deterministically shuffles file order and - sample indices per epoch. Defaults to True. - - Yields: - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None]: - A batch tuple containing sequence dictionaries, target dictionaries, - and three `None` placeholders (for API compatibility). - - Raises: - FileNotFoundError: If `metadata.json` is missing. - Exception: If sample counts are uneven across ranks using the 'exact' sampling - strategy, or if a GPU rank is assigned no files. - """ + """Streams long-format Parquet chunks into rank/worker-aligned batches.""" def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): super().__init__() @@ -45,7 +38,8 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): self.config = config self.batch_size = config.training_spec.batch_size self.shuffle = shuffle - self.epoch = 0 + self._epoch_state = shared_int(0) + self._start_batch_state = shared_int(0) metadata_path = os.path.join(self.data_dir, "metadata.json") if not os.path.exists(metadata_path): @@ -57,6 +51,9 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): with open(metadata_path, "r") as f: metadata = json.load(f) + self.folder_layout = stored_window_layout_from_metadata(metadata) + self.resolved_view = resolve_window_view(self.folder_layout, config.window_view) + self.batch_files_info = metadata["batch_files"] self.total_samples = metadata["total_samples"] self.sampling_strategy = config.training_spec.sampling_strategy @@ -85,11 +82,15 @@ def _calculate_total_batches(self, target_samples: int) -> int: return total_batches def set_epoch(self, epoch: int): - """Allows the training loop to set the epoch for deterministic file shuffling.""" - self.epoch = epoch + """Set the shuffle epoch.""" + write_shared_int(self._epoch_state, epoch) + + def set_start_batch(self, start_batch: int): + """Set the first global batch to yield on the next iteration.""" + write_shared_int(self._start_batch_state, start_batch) def _get_target_samples(self) -> int: - """Calculates exact sample count per rank to ensure FSDP syncs properly.""" + """Return per-rank sample count under the configured sampling strategy.""" world_size = dist.get_world_size() if dist.is_initialized() else 1 num_files = len(self.batch_files_info) @@ -150,19 +151,22 @@ def __len__(self) -> int: def __iter__( self, - ) -> Iterator[ - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None] - ]: + ) -> Iterator[SequifierBatch]: world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 worker_info = get_worker_info() - worker_id = worker_info.id if worker_info is not None else 0 + physical_worker_id = worker_info.id if worker_info is not None else 0 num_workers = worker_info.num_workers if worker_info is not None else 1 + epoch = read_shared_int(self._epoch_state) + start_batch = read_shared_int(self._start_batch_state) - # 1. Distribute files among ranks num_files = len(self.batch_files_info) - files_for_this_rank = list(range(rank, num_files, world_size)) + original_files_for_this_rank = list(range(rank, num_files, world_size)) + rank_real_samples = sum( + self.batch_files_info[i]["samples"] for i in original_files_for_this_rank + ) + files_for_this_rank = original_files_for_this_rank.copy() if not files_for_this_rank: if self.sampling_strategy == "oversampling": @@ -170,23 +174,39 @@ def __iter__( else: raise Exception(f"No file found for GPU rank {rank}.") - # 2. Assign exact sample quotas and boundaries to this specific worker thread base_samples_per_worker = self.target_samples // num_workers remainder = self.target_samples % num_workers + worker_sample_counts = [ + base_samples_per_worker + (1 if i < remainder else 0) + for i in range(num_workers) + ] + worker_batch_counts = [ + math.ceil(sample_count / self.batch_size) + for sample_count in worker_sample_counts + ] + worker_id, skip_batches = resolve_resume_worker( + start_batch, + physical_worker_id, + num_workers, + worker_batch_counts, + ) - # Calculate exactly where this worker's data starts and ends in the global stream worker_start_sample = 0 for i in range(worker_id): - worker_start_sample += base_samples_per_worker + (1 if i < remainder else 0) + worker_start_sample += worker_sample_counts[i] - worker_target_samples = base_samples_per_worker + ( - 1 if worker_id < remainder else 0 - ) + worker_target_samples = worker_sample_counts[worker_id] worker_end_sample = worker_start_sample + worker_target_samples + skipped_samples = skip_samples_for_batches( + skip_batches, self.batch_size, worker_target_samples + ) + worker_start_sample += skipped_samples + worker_target_samples -= skipped_samples + if worker_target_samples <= 0: + return - # 3. Shuffle files deterministically g = torch.Generator() - g.manual_seed(self.config.seed + self.epoch) + g.manual_seed(self.config.seed + epoch) if self.shuffle: file_order = torch.randperm(len(files_for_this_rank), generator=g).tolist() @@ -194,7 +214,6 @@ def __iter__( else: ordered_files = files_for_this_rank.copy() - # 4. Extend files based on exact target requirements extended_files = [] current_samples = 0 file_idx = 0 @@ -204,18 +223,19 @@ def __iter__( current_samples += self.batch_files_info[f_id]["samples"] file_idx += 1 - # 5. Stream data using precise global boundaries and a CROSS-FILE BUFFER yielded_samples = 0 - train_seq_len = self.config.seq_length global_file_start_sample = 0 - # Sequence formatting configurations - input_seq_cols = [str(c) for c in range(train_seq_len, 0, -1)] - target_seq_cols = [str(c) for c in range(train_seq_len - 1, -1, -1)] + input_seq_cols = columns_from_slice( + self.resolved_view.input_slice, self.folder_layout.stored_context_width + ) + target_seq_cols = columns_from_slice( + self.resolved_view.target_slice, self.folder_layout.stored_context_width + ) - # Initialize cross-file buffers seq_buffer: Dict[str, torch.Tensor] = {} tgt_buffer: Dict[str, torch.Tensor] = {} + meta_buffer: Dict[str, torch.Tensor] = {} buffer_len = 0 for f_id in extended_files: @@ -227,27 +247,29 @@ def __iter__( file_end = global_file_start_sample + file_samples global_file_start_sample += file_samples - # Skip this file if it belongs entirely to other workers if file_end <= worker_start_sample or file_start >= worker_end_sample: continue - # This file overlaps with our worker's assigned boundary. Load it. file_path = os.path.join(self.data_dir, self.batch_files_info[f_id]["path"]) df = pl.read_parquet(file_path) - feature_names = df["inputCol"].unique().to_list() + left_pad_lengths = get_left_pad_lengths_from_preprocessed_data(df) - # Generate indices for the whole file using torch (matching pt_lazy) indices = torch.arange(file_samples) if self.shuffle: g_file = torch.Generator() - g_file.manual_seed(self.config.seed + self.epoch + f_id + rank) + g_file.manual_seed(self.config.seed + epoch + f_id + rank) indices = indices[torch.randperm(file_samples, generator=g_file)] - # Slice the indices to extract ONLY the portion belonging to this worker worker_file_start_idx = max(0, worker_start_sample - file_start) worker_file_end_idx = min(file_samples, worker_end_sample - file_start) worker_indices = indices[worker_file_start_idx:worker_file_end_idx] + logical_positions = torch.arange( + file_start + worker_file_start_idx, + file_start + worker_file_end_idx, + dtype=torch.int64, + ) + sample_is_real = logical_positions < rank_real_samples num_new_samples = len(worker_indices) @@ -257,57 +279,44 @@ def __iter__( worker_indices_np = worker_indices.numpy() - # 1. Single-pass partition: Groups data natively in C++/Rust, eliminating O(F * N) scans feature_partitions = { frame.item(0, "inputCol"): frame for frame in df.partition_by("inputCol") } - # Dynamic feature names fallback to gracefully handle MagicMock objects in unit tests - feature_names = list(feature_partitions.keys()) - cols_to_process = ( - self.config.input_columns - if isinstance(getattr(self.config, "input_columns", None), list) - else feature_names - ) - - # Process Long format data structures into PyTorch Tensors new_seq, new_tgt = {}, {} - expected_samples = len(worker_indices_np) - - # 2. Iterate over the expected config columns, not the dynamically found ones - for col_name in cols_to_process: - # Gracefully handle MagicMock column_torch_types dictionaries - torch_type = self.column_torch_types[col_name] + for col_name in self.config.input_columns: if col_name in feature_partitions: - # Positional advanced selection using the coordinated indices feature_chunk = feature_partitions[col_name][worker_indices_np] - new_seq[col_name] = torch.tensor( feature_chunk.select(input_seq_cols).to_numpy(), - dtype=torch_type, + dtype=self.column_torch_types[col_name], ) + else: + raise ValueError(f"Column not found in input data: {col_name}") + + for col_name in self.config.target_columns: + if col_name in feature_partitions: + feature_chunk = feature_partitions[col_name][worker_indices_np] new_tgt[col_name] = torch.tensor( feature_chunk.select(target_seq_cols).to_numpy(), - dtype=torch_type, + dtype=self.column_torch_types[col_name], ) else: - # 3. Graceful fallback: Pad with zeros if a chunk is mysteriously missing a feature - new_seq[col_name] = torch.zeros( - (expected_samples, train_seq_len), dtype=torch_type - ) - new_tgt[col_name] = torch.zeros( - (expected_samples, train_seq_len), dtype=torch_type + raise RuntimeError( + f"Missing required column {col_name} in Parquet partition" ) - # Free the DataFrame immediately to keep RAM down + new_meta = self.resolved_view.build_masks(left_pad_lengths[worker_indices]) + new_meta["sample_valid_mask"] = sample_is_real + del df - # Append the new slice to the cross-file buffer if buffer_len == 0: seq_buffer = new_seq tgt_buffer = new_tgt + meta_buffer = new_meta else: seq_buffer = { k: torch.cat([seq_buffer[k], new_seq[k]], dim=0) for k in seq_buffer @@ -315,32 +324,47 @@ def __iter__( tgt_buffer = { k: torch.cat([tgt_buffer[k], new_tgt[k]], dim=0) for k in tgt_buffer } + if set(meta_buffer) != set(new_meta): + raise RuntimeError( + "Inconsistent leftPadLength metadata across Parquet chunks." + ) + meta_buffer = { + k: torch.cat([meta_buffer[k], new_meta[k]], dim=0) + for k in meta_buffer + } buffer_len += num_new_samples - # Yield batches as long as the buffer contains at least `batch_size` samples while buffer_len >= self.batch_size: if yielded_samples >= worker_target_samples: break - # Slice out a perfect batch from the top of the buffer batch_seq = {k: v[: self.batch_size] for k, v in seq_buffer.items()} batch_tgt = {k: v[: self.batch_size] for k, v in tgt_buffer.items()} + batch_meta = {k: v[: self.batch_size] for k, v in meta_buffer.items()} - yield batch_seq, batch_tgt, None, None, None + yield SequifierBatch( + inputs=batch_seq, + targets=batch_tgt, + metadata=batch_meta, + ) yielded_samples += self.batch_size - # Keep the remainder in the buffer for the next loop/file seq_buffer = {k: v[self.batch_size :] for k, v in seq_buffer.items()} tgt_buffer = {k: v[self.batch_size :] for k, v in tgt_buffer.items()} + meta_buffer = {k: v[self.batch_size :] for k, v in meta_buffer.items()} buffer_len -= self.batch_size - # 6. Yield the final partial batch from the buffer if any remains if buffer_len > 0 and yielded_samples < worker_target_samples: remaining_needed = worker_target_samples - yielded_samples final_yield_size = min(buffer_len, remaining_needed) batch_seq = {k: v[:final_yield_size] for k, v in seq_buffer.items()} batch_tgt = {k: v[:final_yield_size] for k, v in tgt_buffer.items()} + batch_meta = {k: v[:final_yield_size] for k, v in meta_buffer.items()} - yield batch_seq, batch_tgt, None, None, None + yield SequifierBatch( + inputs=batch_seq, + targets=batch_tgt, + metadata=batch_meta, + ) diff --git a/src/sequifier/io/sequifier_dataset_from_folder_pt.py b/src/sequifier/io/sequifier_dataset_from_folder_pt.py index 182ad841..469b044e 100644 --- a/src/sequifier/io/sequifier_dataset_from_folder_pt.py +++ b/src/sequifier/io/sequifier_dataset_from_folder_pt.py @@ -1,7 +1,7 @@ import json import math import os -from typing import Dict, Iterator, Tuple +from typing import Dict, Iterator import torch import torch.distributed as dist @@ -9,17 +9,24 @@ from torch.utils.data import IterableDataset, get_worker_info from sequifier.config.train_config import TrainModel -from sequifier.helpers import normalize_path +from sequifier.helpers import ( + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, + validate_stored_window_width, +) +from sequifier.io.batch import SequifierBatch +from sequifier.io.iteration_state import ( + read_shared_int, + resolve_resume_worker, + shared_int, + skip_samples_for_batches, + write_shared_int, +) class SequifierDatasetFromFolderPt(IterableDataset): - """ - An efficient PyTorch IterableDataset that pre-loads all data into RAM. - - This strategy pays a one-time I/O cost at initialization, after which - all data access during training is extremely fast. It yields full, - pre-collated batches natively. - """ + """Eager PT-folder dataset yielding rank/worker-aligned batches.""" def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): super().__init__() @@ -27,7 +34,8 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): self.config = config self.batch_size = config.training_spec.batch_size self.shuffle = shuffle - self.epoch = 0 + self._epoch_state = shared_int(0) + self._start_batch_state = shared_int(0) self.sampling_strategy = config.training_spec.sampling_strategy metadata_path = os.path.join(self.data_dir, "metadata.json") @@ -40,6 +48,9 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): with open(metadata_path, "r") as f: metadata = json.load(f) + self.folder_layout = stored_window_layout_from_metadata(metadata) + self.resolved_view = resolve_window_view(self.folder_layout, config.window_view) + self.n_samples = metadata["total_samples"] logger.info( @@ -49,22 +60,33 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): all_sequences: Dict[str, list[torch.Tensor]] = { col: [] for col in set(config.input_columns + config.target_columns) } + all_left_pad_lengths: list[torch.Tensor] = [] - # Load all data files into RAM for file_info in metadata["batch_files"]: file_path = os.path.join(self.data_dir, file_info["path"]) - (sequences_batch, _, _, _) = torch.load( - file_path, map_location="cpu", weights_only=False - ) + ( + sequences_batch, + _, + _, + _, + left_pad_lengths_batch, + ) = torch.load(file_path, map_location="cpu", weights_only=False) for col in all_sequences.keys(): if col in sequences_batch: + validate_stored_window_width( + sequences_batch[col], self.folder_layout.stored_context_width + ) all_sequences[col].append(sequences_batch[col]) + all_left_pad_lengths.append(left_pad_lengths_batch) self.sequences: Dict[str, torch.Tensor] = { col: torch.cat(tensors) for col, tensors in all_sequences.items() if tensors } + self.left_pad_lengths = torch.cat(all_left_pad_lengths) for tensor in self.sequences.values(): tensor.share_memory_() + if self.left_pad_lengths is not None: + self.left_pad_lengths.share_memory_() self.target_samples = self._get_target_samples() self.total_batches = self._calculate_total_batches(self.target_samples) @@ -86,11 +108,15 @@ def _calculate_total_batches(self, target_samples: int) -> int: return total_batches def set_epoch(self, epoch: int): - """Allows the training loop to set the epoch for deterministic shuffling.""" - self.epoch = epoch + """Set the shuffle epoch.""" + write_shared_int(self._epoch_state, epoch) + + def set_start_batch(self, start_batch: int): + """Set the first global batch to yield on the next iteration.""" + write_shared_int(self._start_batch_state, start_batch) def _get_target_samples(self) -> int: - """Calculates exact sample count per rank to ensure FSDP syncs properly.""" + """Return per-rank sample count under the configured sampling strategy.""" world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 @@ -111,53 +137,89 @@ def __len__(self) -> int: def __iter__( self, - ) -> Iterator[ - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None] - ]: + ) -> Iterator[SequifierBatch]: world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 worker_info = get_worker_info() - worker_id = worker_info.id if worker_info is not None else 0 + physical_worker_id = worker_info.id if worker_info is not None else 0 num_workers = worker_info.num_workers if worker_info is not None else 1 + epoch = read_shared_int(self._epoch_state) + start_batch = read_shared_int(self._start_batch_state) - # 1. Global Shuffling indices = torch.arange(self.n_samples) if self.shuffle: g = torch.Generator() - g.manual_seed(self.config.seed + self.epoch) + g.manual_seed(self.config.seed + epoch) indices = indices[torch.randperm(self.n_samples, generator=g)] - # 2. Distribute across GPU ranks indices_for_rank = indices[rank::world_size].tolist() + sample_is_real = [True] * len(indices_for_rank) - # 3. Handle FSDP oversampling/undersampling sync requirements if self.sampling_strategy == "oversampling": - # Loop the indices to pad out the shorter ranks + real_count = len(indices_for_rank) + if real_count == 0: + fallback_indices = indices.tolist() + while len(indices_for_rank) < self.target_samples and fallback_indices: + n = min( + len(fallback_indices), + self.target_samples - len(indices_for_rank), + ) + indices_for_rank.extend(fallback_indices[:n]) + sample_is_real.extend([False] * n) while len(indices_for_rank) < self.target_samples: - indices_for_rank.extend( - indices_for_rank[: self.target_samples - len(indices_for_rank)] - ) + n = min(real_count, self.target_samples - len(indices_for_rank)) + indices_for_rank.extend(indices_for_rank[:n]) + sample_is_real.extend([False] * n) elif self.sampling_strategy == "undersampling": indices_for_rank = indices_for_rank[: self.target_samples] + sample_is_real = sample_is_real[: self.target_samples] + + worker_batch_counts = [ + math.ceil(len(indices_for_rank[i::num_workers]) / self.batch_size) + for i in range(num_workers) + ] + worker_id, skip_batches = resolve_resume_worker( + start_batch, + physical_worker_id, + num_workers, + worker_batch_counts, + ) - # 4. Distribute among CPU workers for this GPU indices_for_worker = indices_for_rank[worker_id::num_workers] + sample_is_real_for_worker = sample_is_real[worker_id::num_workers] + skipped_samples = skip_samples_for_batches( + skip_batches, self.batch_size, len(indices_for_worker) + ) + indices_for_worker = indices_for_worker[skipped_samples:] + sample_is_real_for_worker = sample_is_real_for_worker[skipped_samples:] - # 5. Yield full batches - train_seq_len = self.config.seq_length for i in range(0, len(indices_for_worker), self.batch_size): batch_indices = indices_for_worker[i : i + self.batch_size] + batch_sample_is_real = sample_is_real_for_worker[i : i + self.batch_size] data_batch = { - key: tensor[batch_indices, -(train_seq_len + 1) : -1] + key: tensor[batch_indices, self.resolved_view.input_slice] for key, tensor in self.sequences.items() if key in self.config.input_columns } targets_batch = { - key: tensor[batch_indices, -train_seq_len:] + key: tensor[batch_indices, self.resolved_view.target_slice] for key, tensor in self.sequences.items() if key in self.config.target_columns } - yield data_batch, targets_batch, None, None, None + metadata_batch = {} + if self.left_pad_lengths is not None: + metadata_batch = self.resolved_view.build_masks( + self.left_pad_lengths[batch_indices] + ) + metadata_batch["sample_valid_mask"] = torch.tensor( + batch_sample_is_real, dtype=torch.bool + ) + + yield SequifierBatch( + inputs=data_batch, + targets=targets_batch, + metadata=metadata_batch, + ) diff --git a/src/sequifier/io/sequifier_dataset_from_folder_pt_lazy.py b/src/sequifier/io/sequifier_dataset_from_folder_pt_lazy.py index c6d1e238..6754f3ec 100644 --- a/src/sequifier/io/sequifier_dataset_from_folder_pt_lazy.py +++ b/src/sequifier/io/sequifier_dataset_from_folder_pt_lazy.py @@ -1,7 +1,7 @@ import json import math import os -from typing import Dict, Iterator, Tuple +from typing import Dict, Iterator import numpy as np import torch @@ -10,33 +10,24 @@ from torch.utils.data import IterableDataset, get_worker_info from sequifier.config.train_config import TrainModel -from sequifier.helpers import normalize_path +from sequifier.helpers import ( + normalize_path, + resolve_window_view, + stored_window_layout_from_metadata, + validate_stored_window_width, +) +from sequifier.io.batch import SequifierBatch +from sequifier.io.iteration_state import ( + read_shared_int, + resolve_resume_worker, + shared_int, + skip_samples_for_batches, + write_shared_int, +) class SequifierDatasetFromFolderPtLazy(IterableDataset): - """ - An efficient, memory-safe PyTorch IterableDataset for out-of-core training. - - Streams pre-processed chunked files sequentially using cross-file buffering to yield - exact batches, eliminating CPU cloning bottlenecks. Fully supports DDP/FSDP by - precisely calculating and distributing sample boundaries across GPU ranks and workers. - - Args: - data_path (str): Path to the directory containing `.pt` chunks and `metadata.json`. - config (TrainModel): Training configuration (batch size, workers, sequence length, etc.). - shuffle (bool, optional): If True, deterministically shuffles file order and - sample indices per epoch. Defaults to True. - - Yields: - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None]: - A batch tuple containing sequence dictionaries, target dictionaries, - and three `None` placeholders (for API compatibility). - - Raises: - FileNotFoundError: If `metadata.json` is missing. - Exception: If sample counts are uneven across ranks using the 'exact' sampling - strategy, or if a GPU rank is assigned no files. - """ + """Streams PT chunks into rank/worker-aligned batches.""" def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): super().__init__() @@ -44,7 +35,8 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): self.config = config self.batch_size = config.training_spec.batch_size self.shuffle = shuffle - self.epoch = 0 + self._epoch_state = shared_int(0) + self._start_batch_state = shared_int(0) metadata_path = os.path.join(self.data_dir, "metadata.json") if not os.path.exists(metadata_path): @@ -56,6 +48,9 @@ def __init__(self, data_path: str, config: TrainModel, shuffle: bool = True): with open(metadata_path, "r") as f: metadata = json.load(f) + self.folder_layout = stored_window_layout_from_metadata(metadata) + self.resolved_view = resolve_window_view(self.folder_layout, config.window_view) + self.batch_files_info = metadata["batch_files"] self.total_samples = metadata["total_samples"] self.sampling_strategy = config.training_spec.sampling_strategy @@ -79,11 +74,15 @@ def _calculate_total_batches(self, target_samples: int) -> int: return total_batches def set_epoch(self, epoch: int): - """Allows the training loop to set the epoch for deterministic file shuffling.""" - self.epoch = epoch + """Set the shuffle epoch.""" + write_shared_int(self._epoch_state, epoch) + + def set_start_batch(self, start_batch: int): + """Set the first global batch to yield on the next iteration.""" + write_shared_int(self._start_batch_state, start_batch) def _get_target_samples(self) -> int: - """Calculates exact sample count per rank to ensure FSDP syncs properly.""" + """Return per-rank sample count under the configured sampling strategy.""" world_size = dist.get_world_size() if dist.is_initialized() else 1 num_files = len(self.batch_files_info) @@ -144,19 +143,22 @@ def __len__(self) -> int: def __iter__( self, - ) -> Iterator[ - Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], None, None, None] - ]: + ) -> Iterator[SequifierBatch]: world_size = dist.get_world_size() if dist.is_initialized() else 1 rank = dist.get_rank() if dist.is_initialized() else 0 worker_info = get_worker_info() - worker_id = worker_info.id if worker_info is not None else 0 + physical_worker_id = worker_info.id if worker_info is not None else 0 num_workers = worker_info.num_workers if worker_info is not None else 1 + epoch = read_shared_int(self._epoch_state) + start_batch = read_shared_int(self._start_batch_state) - # 1. Distribute files among ranks num_files = len(self.batch_files_info) - files_for_this_rank = list(range(rank, num_files, world_size)) + original_files_for_this_rank = list(range(rank, num_files, world_size)) + rank_real_samples = sum( + self.batch_files_info[i]["samples"] for i in original_files_for_this_rank + ) + files_for_this_rank = original_files_for_this_rank.copy() if not files_for_this_rank: if self.sampling_strategy == "oversampling": @@ -164,23 +166,39 @@ def __iter__( else: raise Exception(f"No file found for GPU rank {rank}.") - # 2. Assign exact sample quotas and boundaries to this specific worker thread base_samples_per_worker = self.target_samples // num_workers remainder = self.target_samples % num_workers + worker_sample_counts = [ + base_samples_per_worker + (1 if i < remainder else 0) + for i in range(num_workers) + ] + worker_batch_counts = [ + math.ceil(sample_count / self.batch_size) + for sample_count in worker_sample_counts + ] + worker_id, skip_batches = resolve_resume_worker( + start_batch, + physical_worker_id, + num_workers, + worker_batch_counts, + ) - # Calculate exactly where this worker's data starts and ends in the global stream worker_start_sample = 0 for i in range(worker_id): - worker_start_sample += base_samples_per_worker + (1 if i < remainder else 0) + worker_start_sample += worker_sample_counts[i] - worker_target_samples = base_samples_per_worker + ( - 1 if worker_id < remainder else 0 - ) + worker_target_samples = worker_sample_counts[worker_id] worker_end_sample = worker_start_sample + worker_target_samples + skipped_samples = skip_samples_for_batches( + skip_batches, self.batch_size, worker_target_samples + ) + worker_start_sample += skipped_samples + worker_target_samples -= skipped_samples + if worker_target_samples <= 0: + return - # 3. Shuffle files deterministically g = torch.Generator() - g.manual_seed(self.config.seed + self.epoch) + g.manual_seed(self.config.seed + epoch) if self.shuffle: file_order = torch.randperm(len(files_for_this_rank), generator=g).tolist() @@ -188,7 +206,6 @@ def __iter__( else: ordered_files = files_for_this_rank.copy() - # 4. Extend files based on exact target requirements extended_files = [] current_samples = 0 file_idx = 0 @@ -198,14 +215,12 @@ def __iter__( current_samples += self.batch_files_info[f_id]["samples"] file_idx += 1 - # 5. Stream data using precise global boundaries and a CROSS-FILE BUFFER yielded_samples = 0 - train_seq_len = self.config.seq_length global_file_start_sample = 0 - # Initialize cross-file buffers seq_buffer: Dict[str, torch.Tensor] = {} tgt_buffer: Dict[str, torch.Tensor] = {} + meta_buffer: Dict[str, torch.Tensor] = {} buffer_len = 0 for f_id in extended_files: @@ -217,53 +232,66 @@ def __iter__( file_end = global_file_start_sample + file_samples global_file_start_sample += file_samples - # Skip this file if it belongs entirely to other workers if file_end <= worker_start_sample or file_start >= worker_end_sample: continue - # This file overlaps with our worker's assigned boundary. Load it. file_path = os.path.join(self.data_dir, self.batch_files_info[f_id]["path"]) - (sequences_batch, _, _, _) = torch.load( - file_path, map_location="cpu", weights_only=False - ) + ( + sequences_batch, + _, + _, + _, + left_pad_lengths_batch, + ) = torch.load(file_path, map_location="cpu", weights_only=False) + for tensor in sequences_batch.values(): + validate_stored_window_width( + tensor, self.folder_layout.stored_context_width + ) - # Generate indices for the whole file indices = torch.arange(file_samples) if self.shuffle: g_file = torch.Generator() - g_file.manual_seed(self.config.seed + self.epoch + f_id + rank) + g_file.manual_seed(self.config.seed + epoch + f_id + rank) indices = indices[torch.randperm(file_samples, generator=g_file)] - # Slice the indices to extract ONLY the portion belonging to this worker worker_file_start_idx = max(0, worker_start_sample - file_start) worker_file_end_idx = min(file_samples, worker_end_sample - file_start) worker_indices = indices[worker_file_start_idx:worker_file_end_idx] + logical_positions = torch.arange( + file_start + worker_file_start_idx, + file_start + worker_file_end_idx, + dtype=torch.int64, + ) + sample_is_real = logical_positions < rank_real_samples num_new_samples = len(worker_indices) if num_new_samples == 0: del sequences_batch continue - # Extract the data subset for this worker (Advanced indexing copies the data) new_seq = { - k: v[worker_indices, -(train_seq_len + 1) : -1] + k: v[worker_indices, self.resolved_view.input_slice] for k, v in sequences_batch.items() if k in self.config.input_columns } new_tgt = { - k: v[worker_indices, -train_seq_len:] + k: v[worker_indices, self.resolved_view.target_slice] for k, v in sequences_batch.items() if k in self.config.target_columns } - # Free the large file immediately to keep RAM down - del sequences_batch + new_meta = self.resolved_view.build_masks( + left_pad_lengths_batch[worker_indices] + ) + new_meta["sample_valid_mask"] = sample_is_real + + del sequences_batch, left_pad_lengths_batch - # Append the new slice to the cross-file buffer if buffer_len == 0: seq_buffer = new_seq tgt_buffer = new_tgt + meta_buffer = new_meta else: seq_buffer = { k: torch.cat([seq_buffer[k], new_seq[k]], dim=0) for k in seq_buffer @@ -271,32 +299,47 @@ def __iter__( tgt_buffer = { k: torch.cat([tgt_buffer[k], new_tgt[k]], dim=0) for k in tgt_buffer } + if set(meta_buffer) != set(new_meta): + raise RuntimeError( + "Inconsistent leftPadLength metadata across PT chunks." + ) + meta_buffer = { + k: torch.cat([meta_buffer[k], new_meta[k]], dim=0) + for k in meta_buffer + } buffer_len += num_new_samples - # Yield batches as long as the buffer contains at least `batch_size` samples while buffer_len >= self.batch_size: if yielded_samples >= worker_target_samples: break - # Slice out a perfect batch from the top of the buffer batch_seq = {k: v[: self.batch_size] for k, v in seq_buffer.items()} batch_tgt = {k: v[: self.batch_size] for k, v in tgt_buffer.items()} + batch_meta = {k: v[: self.batch_size] for k, v in meta_buffer.items()} - yield batch_seq, batch_tgt, None, None, None + yield SequifierBatch( + inputs=batch_seq, + targets=batch_tgt, + metadata=batch_meta, + ) yielded_samples += self.batch_size - # Keep the remainder in the buffer for the next loop/file seq_buffer = {k: v[self.batch_size :] for k, v in seq_buffer.items()} tgt_buffer = {k: v[self.batch_size :] for k, v in tgt_buffer.items()} + meta_buffer = {k: v[self.batch_size :] for k, v in meta_buffer.items()} buffer_len -= self.batch_size - # 6. Yield the final partial batch from the buffer if any remains if buffer_len > 0 and yielded_samples < worker_target_samples: remaining_needed = worker_target_samples - yielded_samples final_yield_size = min(buffer_len, remaining_needed) batch_seq = {k: v[:final_yield_size] for k, v in seq_buffer.items()} batch_tgt = {k: v[:final_yield_size] for k, v in tgt_buffer.items()} + batch_meta = {k: v[:final_yield_size] for k, v in meta_buffer.items()} - yield batch_seq, batch_tgt, None, None, None + yield SequifierBatch( + inputs=batch_seq, + targets=batch_tgt, + metadata=batch_meta, + ) diff --git a/src/sequifier/io/yaml.py b/src/sequifier/io/yaml.py index c275050a..1b8aa1c2 100644 --- a/src/sequifier/io/yaml.py +++ b/src/sequifier/io/yaml.py @@ -1,5 +1,6 @@ import numpy import yaml +from pydantic import BaseModel from sequifier.config.train_config import ( DotDict, @@ -7,76 +8,43 @@ TrainingSpecModel, TrainModel, ) +from sequifier.helpers import ModelWindowView, StoredWindowLayout def represent_sequifier_object(dumper, data): - """ - Represents objects from 'sequifier.config.train_config' (like TrainModel, - ModelSpecModel, TrainingSpecModel) as a simple YAML mapping, - using the object's __dict__. This effectively removes the - !!python/object tag and the explicit '__dict__:', '__fields_set__:' keys. - """ - # We assume the object's __dict__ contains the attributes to be serialized. - # If these objects are Pydantic models, using data.model_dump(mode='python') - # would be more robust if available. + """Represent sequifier config objects as plain YAML mappings.""" return dumper.represent_dict(data.__dict__) def represent_dot_dict(dumper, data): - """ - Represents DotDict objects as a simple YAML mapping. - The original output showed a 'dictitems' attribute. If your DotDict - is essentially a dictionary, this will work. - """ - # If DotDict has a specific attribute like 'dictitems' that holds the actual dict: - # return dumper.represent_dict(data.dictitems) - # If DotDict is a subclass of dict or dict-like: + """Represent DotDict as a plain YAML mapping.""" return dumper.represent_dict(dict(data)) def represent_numpy_float(dumper, data): - """ - Represents numpy.float64 (and similar numpy floats) as standard YAML floats. - """ + """Represent NumPy floats as YAML floats.""" return dumper.represent_float(float(data)) def represent_numpy_int(dumper, data): - """ - Represents numpy.int64 (and similar numpy integers) as standard YAML integers. - """ + """Represent NumPy integers as YAML integers.""" return dumper.represent_int(int(data)) class TrainModelDumper(yaml.Dumper): - """A custom YAML dumper for TrainModel objects. + """YAML dumper for sequifier config objects.""" - This dumper extends the base yaml.Dumper to provide custom serialization - for TrainModel and related objects, ensuring a clean and readable YAML - output. It also modifies the indentation behavior for better formatting. - """ - - # You can add more customizations here if needed, like indent width. def increase_indent(self, flow=False, indentless=False): - """Increase the indentation level for the YAML output. - - This method overrides the default behavior to force indentation for all - block-style collections, improving the readability of the output YAML. - - Args: - flow: Whether the context is a flow-style collection. - indentless: Whether the context is an indentless sequence. - - Returns: - The result of the parent class's increase_indent method, with flow - forced to False. - """ + """Indent block sequences.""" return super(TrainModelDumper, self).increase_indent(flow, False) TrainModelDumper.add_representer(TrainModel, represent_sequifier_object) TrainModelDumper.add_representer(ModelSpecModel, represent_sequifier_object) TrainModelDumper.add_representer(TrainingSpecModel, represent_sequifier_object) +TrainModelDumper.add_representer(StoredWindowLayout, represent_sequifier_object) +TrainModelDumper.add_representer(ModelWindowView, represent_sequifier_object) +TrainModelDumper.add_multi_representer(BaseModel, represent_sequifier_object) TrainModelDumper.add_representer(DotDict, represent_dot_dict) TrainModelDumper.add_representer(numpy.float64, represent_numpy_float) TrainModelDumper.add_representer( diff --git a/src/sequifier/make.py b/src/sequifier/make.py index fdc29a7a..938f82ef 100644 --- a/src/sequifier/make.py +++ b/src/sequifier/make.py @@ -5,16 +5,16 @@ read_format: csv write_format: parquet selected_columns: [EXAMPLE_INPUT_COLUMN_NAME] # should include all target column, can include additional columns +column_types: null # optional map of selected columns to output dtypes, e.g. {EXAMPLE_INPUT_COLUMN_NAME: Float32} +mask_column: null split_ratios: - 0.8 - 0.1 - 0.1 -seq_length: 48 -stride_by_split: -- 1 -- 1 -- 1 +split_method: within_sequence # one of within_sequence, between_sequence +stored_context_width: 49 +max_target_offset: 1 max_rows: null """ @@ -28,7 +28,7 @@ target_column_types: # 'criterion' in training_spec must also be adapted EXAMPLE_TARGET_COLUMN_NAME: real -seq_length: 48 +context_length: 48 inference_batch_size: 10 export_generative_model: PLEASE FILL # true or false @@ -46,10 +46,11 @@ num_layers: 3 prediction_length: 1 training_spec: + training_objective: causal device: cuda epochs: 10 save_interval_epochs: 10 - batch_size: 100 + batch_size: 10 log_interval: 10 learning_rate: 0.0001 accumulation_steps: 1 @@ -81,10 +82,11 @@ target_column_types: EXAMPLE_TARGET_COLUMN_NAME: real +training_objective: causal output_probabilities: false map_to_id: true device: cpu -seq_length: 48 +context_length: 48 inference_batch_size: 10 autoregression: true @@ -100,11 +102,7 @@ def make(args): - """Creates a new sequifier project. - - Args: - args: The command-line arguments. - """ + """Create a sequifier project scaffold.""" project_name = args.project_name if not (project_name and len(project_name) > 0): diff --git a/src/sequifier/model/layers.py b/src/sequifier/model/layers.py index ec970e8b..ddd2c839 100644 --- a/src/sequifier/model/layers.py +++ b/src/sequifier/model/layers.py @@ -10,17 +10,10 @@ def __init__(self, dim: int, eps: float = 1e-6): self.weight = nn.Parameter(torch.ones(dim)) def forward(self, x): - # 1. Cast input to float32 once for stability x_fp32 = x.to(torch.float32) - - # 2. Calculate variance var = torch.mean(x_fp32.pow(2), dim=-1, keepdim=True) - - # 3. Normalize x_normed = x_fp32 * torch.rsqrt(var + self.eps) - # 4. Cast back to the *input tensor's* dtype (traceable), - # rather than self.weight.dtype (not traceable in Cast ops) return (self.weight.to(x_normed.dtype) * x_normed).to(x.dtype) @@ -106,7 +99,7 @@ def __init__( n_kv_heads, attention_type, dropout, - seq_length, + context_length, use_rope=False, rope_theta=10000.0, ): @@ -127,7 +120,7 @@ def __init__( if use_rope: self.rope = RotaryEmbedding( - self.head_dim, max_seq_len=seq_length, theta=rope_theta + self.head_dim, max_seq_len=context_length, theta=rope_theta ) if self.head_dim % 2 != 0: raise ValueError(f"head_dim ({self.head_dim}) must be even for RoPE") @@ -176,7 +169,9 @@ def forward(self, x, mask=None): class SequifierEncoderLayer(nn.Module): - def __init__(self, config, dim_model, n_head, dim_feedforward, dropout, seq_length): + def __init__( + self, config, dim_model, n_head, dim_feedforward, dropout, context_length + ): super().__init__() self.norm_first = config.norm_first @@ -192,7 +187,7 @@ def __init__(self, config, dim_model, n_head, dim_feedforward, dropout, seq_leng n_kv_heads=config.n_kv_heads, attention_type=config.attention_type, dropout=dropout, - seq_length=seq_length, + context_length=context_length, use_rope=(config.positional_encoding == "rope"), rope_theta=config.rope_theta, ) diff --git a/src/sequifier/optimizers/ademamix.py b/src/sequifier/optimizers/ademamix.py index 9eeced8e..a69ad875 100644 --- a/src/sequifier/optimizers/ademamix.py +++ b/src/sequifier/optimizers/ademamix.py @@ -9,26 +9,7 @@ class AdEMAMix(Optimizer): - """Implements the AdEMAMix optimizer. - - This optimizer is based on the paper "AdEMAMix: A Novel Adaptive Optimizer for - Deep Learning". It combines the advantages of Adam and EMA, and introduces a - mixing term to further improve performance. - - Args: - params (iterable): Iterable of parameters to optimize or dicts defining - parameter groups. - learning_rate (float, optional): Learning rate (default: 1e-3). - betas (Tuple[float, float, float], optional): Coefficients used for - computing running averages of gradient and its square - (default: (0.9, 0.999, 0.9999)). - eps (float, optional): Term added to the denominator to improve - numerical stability (default: 1e-8). - weight_decay (float, optional): Weight decay (L2 penalty) (default: 0). - alpha (float, optional): Mixing coefficient (default: 5.0). - T_alpha_beta3 (int, optional): Time period for alpha and beta3 scheduling - (default: None). - """ + """AdEMAMix optimizer.""" def __init__( self, @@ -62,24 +43,11 @@ def __init__( super(AdEMAMix, self).__init__(params, defaults) def __setstate__(self, state): - """Set the state of the optimizer. - - Args: - state (dict): The state of the optimizer. - """ super(AdEMAMix, self).__setstate__(state) @torch.no_grad() def step(self, closure=None): - """Perform a single optimization step. - - Args: - closure (callable, optional): A closure that reevaluates the model - and returns the loss. (default: None) - - Returns: - The loss, if the closure is provided. Otherwise, returns None. - """ + """Run one optimizer step.""" loss = None if closure is not None: with torch.enable_grad(): @@ -163,27 +131,7 @@ def _update_adamemix( weight_decay, eps, ): - """Perform the AdEMAMix update for a single parameter group. - - Args: - params (list[torch.Tensor]): List of parameters to update. - grads (list[torch.Tensor]): List of gradients for each parameter. - exp_avgs (list[torch.Tensor]): List of exponential moving averages of - gradients. - exp_avg_sqs (list[torch.Tensor]): List of exponential moving averages - of squared gradients. - exp_avg_slow (list[torch.Tensor]): List of slow exponential moving - averages of gradients. - state_steps (list[int]): List of steps for each parameter. - beta1 (float): Coefficient for the first moment estimate. - beta2 (float): Coefficient for the second moment estimate. - beta3 (float): Coefficient for the slow moment estimate. - alpha (float): Mixing coefficient. - T_alpha_beta3 (int): Time period for alpha and beta3 scheduling. - learning_rate (float): Learning rate. - weight_decay (float): Weight decay. - eps (float): Epsilon term for numerical stability. - """ + """Update one parameter group in place.""" for i, param in enumerate(params): grad = grads[i] exp_avg = exp_avgs[i] @@ -211,7 +159,6 @@ def _update_adamemix( alpha_t = alpha beta3_t = beta3 - # Decay the first and second moment running average coefficient exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1) exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2) exp_avg_slow_i.mul_(beta3_t).add_(grad, alpha=1 - beta3_t) diff --git a/src/sequifier/optimizers/optimizers.py b/src/sequifier/optimizers/optimizers.py index 2930433e..dbcef9cd 100644 --- a/src/sequifier/optimizers/optimizers.py +++ b/src/sequifier/optimizers/optimizers.py @@ -7,14 +7,7 @@ def get_optimizer_class(optimizer_name: str) -> torch.optim.Optimizer: - """Gets the optimizer class from a string. - - Args: - optimizer_name: The name of the optimizer. - - Returns: - The optimizer class. - """ + """Resolve a custom, torch-optimizer, or torch optimizer class.""" if optimizer_name in CUSTOM_OPTIMIZERS: return CUSTOM_OPTIMIZERS[optimizer_name] elif hasattr(torch_optimizer, optimizer_name): diff --git a/src/sequifier/preprocess.py b/src/sequifier/preprocess.py index f25dc721..3ad7b9bb 100644 --- a/src/sequifier/preprocess.py +++ b/src/sequifier/preprocess.py @@ -1,9 +1,11 @@ +import hashlib import json import math import multiprocessing import os import re import shutil +import warnings from pathlib import Path from typing import Any, Optional, Union @@ -15,25 +17,264 @@ from loguru import logger from sequifier.config.preprocess_config import load_preprocessor_config -from sequifier.helpers import PANDAS_TO_TORCH_TYPES, read_data, write_data +from sequifier.helpers import ( + PANDAS_TO_TORCH_TYPES, + StoredWindowLayout, + assign_sequence_to_split, + canonicalize_polars_dtype_name, + is_float_dtype_name, + is_integer_dtype_name, + polars_dtype_from_name, + read_data, + write_data, +) +from sequifier.special_tokens import ( + SPECIAL_TOKEN_ID_VALUES, + SPECIAL_TOKEN_IDS, + SPECIAL_TOKEN_LABELS, + validate_special_token_ids, +) + +INPUT_METADATA_COLUMNS = ("sequenceId", "itemPosition") +REAL_MASK_VALUE = 0.0 +CURRENT_STORED_WINDOW_LAYOUT_VERSION = 2 + +FLOAT_TYPE_ORDER = ("Float16", "Float32", "Float64") +INTEGER_TYPE_ORDER = ( + "Int8", + "UInt8", + "Int16", + "UInt16", + "Int32", + "UInt32", + "Int64", + "UInt64", +) +INTEGER_TYPE_INFO = { + "Int8": np.iinfo(np.int8), + "Int16": np.iinfo(np.int16), + "Int32": np.iinfo(np.int32), + "Int64": np.iinfo(np.int64), + "UInt8": np.iinfo(np.uint8), + "UInt16": np.iinfo(np.uint16), + "UInt32": np.iinfo(np.uint32), + "UInt64": np.iinfo(np.uint64), +} +FLOAT_TYPE_INFO = { + "Float16": np.finfo(np.float16), + "Float32": np.finfo(np.float32), + "Float64": np.finfo(np.float64), +} +FLOAT_EXACT_INTEGER_LIMITS = { + "Float16": 2**11, + "Float32": 2**24, + "Float64": 2**53, +} + + +def _stable_json_value(value: Any) -> Any: + if isinstance(value, dict): + return { + str(key): _stable_json_value(val) + for key, val in sorted(value.items(), key=lambda item: str(item[0])) + } + if isinstance(value, (list, tuple)): + return [_stable_json_value(item) for item in value] + if isinstance(value, np.generic): + return value.item() + if isinstance(value, float) and math.isnan(value): + return "NaN" + return value + + +def _stable_json_digest(value: Any) -> str: + encoded = json.dumps( + _stable_json_value(value), + sort_keys=True, + separators=(",", ":"), + ).encode("utf-8") + return hashlib.sha256(encoded).hexdigest() + + +@beartype +def _normalize_column_types( + column_types: Optional[dict[str, str]], +) -> Optional[dict[str, str]]: + if column_types is None: + return None + return { + column: canonicalize_polars_dtype_name(dtype) + for column, dtype in column_types.items() + } + + +@beartype +def _configured_column_types_for_data_columns( + column_types: Optional[dict[str, str]], + data_columns: list[str], +) -> Optional[dict[str, str]]: + if column_types is None: + return None + + missing_columns = [column for column in data_columns if column not in column_types] + if missing_columns: + raise ValueError( + "column_types must include every to-be-processed column. " + f"Missing: {missing_columns}" + ) + + return {column: column_types[column] for column in data_columns} + + +@beartype +def _dtype_is_numeric(dtype: Any) -> bool: + return dtype.is_numeric() if hasattr(dtype, "is_numeric") else False + + +@beartype +def _apply_configured_input_casting( + data: pl.DataFrame, + data_columns: list[str], + column_types: Optional[dict[str, str]], +) -> pl.DataFrame: + """Cast input columns early when the requested type defines processing semantics.""" + configured = _configured_column_types_for_data_columns(column_types, data_columns) + if configured is None: + return data + + casts = [] + for column in data_columns: + target_type = configured[column] + source_dtype = data.schema[column] + + if is_float_dtype_name(target_type): + casts.append(pl.col(column).cast(polars_dtype_from_name(target_type))) + elif is_integer_dtype_name(target_type) and _dtype_is_numeric(source_dtype): + casts.append(pl.col(column).cast(polars_dtype_from_name(target_type))) + + if not casts: + return data + + return data.with_columns(casts) + + +@beartype +def _apply_output_type_casting( + data: pl.DataFrame, + data_columns: list[str], + col_types: dict[str, str], +) -> pl.DataFrame: + casts = [ + pl.col(column).cast(polars_dtype_from_name(col_types[column])) + for column in data_columns + ] + if not casts: + return data + return data.with_columns(casts) + + +@beartype +def _highest_ranked_type(types: list[str], order: tuple[str, ...]) -> str: + return max(types, key=lambda type_: order.index(type_)) + + +@beartype +def _smallest_float_covering_integer_range(integer_type: str) -> str: + integer_info = INTEGER_TYPE_INFO[integer_type] + largest_magnitude = max(abs(int(integer_info.min)), int(integer_info.max)) + for float_type in FLOAT_TYPE_ORDER: + if ( + largest_magnitude <= float(FLOAT_TYPE_INFO[float_type].max) + and largest_magnitude <= FLOAT_EXACT_INTEGER_LIMITS[float_type] + ): + return float_type + return "Float64" + + +@beartype +def _resolve_integer_sequence_type(integer_types: list[str]) -> Any: + if not integer_types: + raise ValueError("Cannot resolve an integer sequence type without integers") + + min_value = min(int(INTEGER_TYPE_INFO[type_].min) for type_ in integer_types) + max_value = max(int(INTEGER_TYPE_INFO[type_].max) for type_ in integer_types) + + if min_value >= 0 and all(type_.startswith("UInt") for type_ in integer_types): + for dtype_name in ("UInt8", "UInt16", "UInt32", "UInt64"): + info = INTEGER_TYPE_INFO[dtype_name] + if max_value <= int(info.max): + return polars_dtype_from_name(dtype_name) + + for dtype_name in ("Int8", "Int16", "Int32", "Int64"): + info = INTEGER_TYPE_INFO[dtype_name] + if min_value >= int(info.min) and max_value <= int(info.max): + return polars_dtype_from_name(dtype_name) + + raise ValueError(f"Cannot resolve a safe integer dtype for {integer_types}") + + +@beartype +def _resolve_unified_parquet_type(column_types: dict[str, str]) -> Any: + if not column_types: + raise ValueError("column_types cannot be empty") + + normalized_types = [ + canonicalize_polars_dtype_name(type_) for type_ in column_types.values() + ] + float_types = [type_ for type_ in normalized_types if is_float_dtype_name(type_)] + integer_types = [ + type_ for type_ in normalized_types if is_integer_dtype_name(type_) + ] + + if not float_types: + if len(set(integer_types)) > 1: + logger.warning( + "Multiple integer column_types were specified for Parquet output; " + "using a unified integer schema." + ) + return _resolve_integer_sequence_type(integer_types) + + resolved_float = _highest_ranked_type(float_types, FLOAT_TYPE_ORDER) + if len(set(normalized_types)) > 1: + logger.warning( + "Multiple column_types were specified for Parquet output; " + f"using unified sequence dtype {resolved_float}." + ) + + if integer_types: + required_float = _highest_ranked_type( + [ + _smallest_float_covering_integer_range(integer_type) + for integer_type in integer_types + ], + FLOAT_TYPE_ORDER, + ) + if FLOAT_TYPE_ORDER.index(required_float) > FLOAT_TYPE_ORDER.index( + resolved_float + ): + logger.warning( + "An integer column_type has a range exceeding " + f"{resolved_float}; upgrading unified Parquet sequence dtype " + f"to {required_float}." + ) + resolved_float = required_float + + return polars_dtype_from_name(resolved_float) + + +@beartype +def _resolve_pt_extraction_type(column_types: dict[str, str]) -> Any: + normalized_types = [ + canonicalize_polars_dtype_name(type_) for type_ in column_types.values() + ] + if any(is_float_dtype_name(type_) for type_ in normalized_types): + return pl.Float64 + return _resolve_integer_sequence_type(normalized_types) @beartype def preprocess(args: Any, args_config: dict[str, Any]) -> None: - """Runs the main data preprocessing pipeline. - - This function loads the preprocessing configuration, initializes the - `Preprocessor` class, and executes the preprocessing steps based on the - loaded configuration. - - Args: - args: An object containing command-line arguments. Expected to have - a `config_path` attribute specifying the path to the YAML - configuration file. - args_config: A dictionary containing additional configuration parameters - that may override or supplement the settings loaded from the - config file. - """ + """Load preprocessing config and run preprocessing.""" logger.info("--- Starting Preprocessing ---") config_path = args.config_path or "configs/preprocess.yaml" config = load_preprocessor_config(config_path, args_config) @@ -42,22 +283,7 @@ def preprocess(args: Any, args_config: dict[str, Any]) -> None: class Preprocessor: - """A class for preprocessing data for the sequifier model. - - This class handles loading, preprocessing, and saving data. It supports - single-file and multi-file processing, and can handle large datasets by - processing them in batches. - - Attributes: - project_root (str): The path to the sequifier project directory. - batches_per_file (int): The number of batches to process per file. - data_name_root (str): The root name of the data file. - merge_output (bool): Whether to combine the output into a single file. - target_dir (str): The target directory for temporary files. - seed (int): The random seed for reproducibility. - n_cores (int): The number of cores to use for parallel processing. - split_paths (list[str]): The paths to the output split files. - """ + """Stateful preprocessing pipeline for single-file or folder inputs.""" @beartype def __init__( @@ -68,9 +294,10 @@ def __init__( read_format: str, write_format: str, merge_output: bool, + allow_sequence_splitting: bool, selected_columns: Optional[list[str]], split_ratios: list[float], - seq_length: int, + stored_context_width: int, stride_by_split: list[int], max_rows: Optional[int], seed: int, @@ -80,29 +307,17 @@ def __init__( subsequence_start_mode: str, use_precomputed_maps: Optional[list[str]], metadata_config_path: Optional[str], + max_target_offset: int = 1, + mask_column: Optional[str] = None, + column_types: Optional[dict[str, str]] = None, + split_method: str = "within_sequence", ): - """Initializes the Preprocessor with the given parameters. - - Args: - project_root: The path to the sequifier project directory. - data_path: The path to the input data file. - read_format: The file type of the input data. - write_format: The file type for the preprocessed output data. - merge_output: Whether to combine the output into a single file. - selected_columns: A list of columns to be included in the preprocessing. - split_ratios: A list of floats that define the relative sizes of data splits. - seq_length: The sequence length for the model inputs. - stride_by_split: A list of step sizes for creating subsequences. - max_rows: The maximum number of input rows to process. - seed: A random seed for reproducibility. - n_cores: The number of CPU cores to use for parallel processing. - batches_per_file: The number of batches to process per file. - process_by_file: A flag to indicate if processing should be done file by file. - use_precomputed_maps: An optional list of columns for which to enforce precomputed maps - metadata_config_path: Optional path to a precomputed metadata config - """ + """Initialize and run preprocessing from validated config fields.""" self.project_root = project_root self.batches_per_file = batches_per_file + self.data_path = data_path + self.read_format = read_format + self.write_format = write_format self.data_name_root = os.path.splitext(os.path.basename(data_path))[0] self.merge_output = merge_output @@ -115,26 +330,49 @@ def __init__( ) self.target_dir = f"{self.data_name_root}-temp" + self.allow_sequence_splitting = allow_sequence_splitting + self.use_precomputed_maps = use_precomputed_maps self.metadata_config_path = metadata_config_path + self.mask_column = mask_column + if split_method not in ["within_sequence", "between_sequence"]: + raise ValueError( + "split_method must be one of 'within_sequence', 'between_sequence'" + ) + self.split_method = split_method + self.split_ratios = split_ratios + self.stride_by_split = stride_by_split + self.max_rows = max_rows + self.process_by_file = process_by_file + self.subsequence_start_mode = subsequence_start_mode + self.column_types = _normalize_column_types(column_types) + if self.mask_column is not None and self.metadata_config_path is None: + raise ValueError("metadata_config_path must be set when mask_column is set") + self.seed = seed np.random.seed(seed) self.n_cores = n_cores or multiprocessing.cpu_count() self.continue_preprocessing = continue_preprocessing + self.storage_layout = StoredWindowLayout( + stored_context_width=stored_context_width, + max_target_offset=max_target_offset, + version=CURRENT_STORED_WINDOW_LAYOUT_VERSION, + ) self._setup_directories() if selected_columns is not None: selected_columns = ["sequenceId", "itemPosition"] + selected_columns + if self.mask_column is not None and self.mask_column in selected_columns: + raise ValueError( + f"'{self.mask_column}' is not allowed to be in 'selected_columns'" + ) self._setup_split_paths(write_format, len(split_ratios)) if self.continue_preprocessing: - # 1. Determine what paths indicate "completion" if self.merge_output: - # If merging, check for the final files (e.g., "data/mydata-split0.pt") paths_to_check = self.split_paths else: - # If not merging, check for the output folders (e.g., "data/mydata-split0") paths_to_check = [ os.path.join( self.project_root, "data", f"{self.data_name_root}-split{i}" @@ -142,7 +380,6 @@ def __init__( for i in range(len(split_ratios)) ] - # 2. If any target exists, skip processing and jump to cleanup if any(os.path.exists(p) for p in paths_to_check): logger.info( "Existing split paths found with continue_preprocessing=True. " @@ -153,11 +390,19 @@ def __init__( if os.path.isfile(data_path): data = _load_and_preprocess_data( - data_path, read_format, selected_columns, max_rows + data_path, + read_format, + selected_columns, + max_rows, + self.mask_column, + ) + data_columns = _get_data_columns(data, self.mask_column) + configured_col_types = _configured_column_types_for_data_columns( + self.column_types, data_columns + ) + data = _apply_configured_input_casting( + data, data_columns, configured_col_types ) - data_columns = [ - col for col in data.columns if col not in ["sequenceId", "itemPosition"] - ] if self.metadata_config_path: metadata_path = os.path.join( self.project_root, self.metadata_config_path @@ -166,6 +411,10 @@ def __init__( with open(metadata_path, "r") as f: preexisting_metadata = json.load(f) + validate_special_token_ids( + preexisting_metadata["special_token_ids"], + source=f"metadata config '{self.metadata_config_path}'", + ) id_maps = preexisting_metadata["id_maps"] selected_columns_statistics = preexisting_metadata[ "selected_columns_statistics" @@ -186,6 +435,7 @@ def __init__( selected_columns_statistics, 0, precomputed_id_maps, + self.mask_column, ) id_maps = id_maps | precomputed_id_maps @@ -198,13 +448,29 @@ def __init__( id_maps, selected_columns_statistics, n_classes=n_classes, - col_types=col_types, + col_types=configured_col_types or col_types, + ) + if configured_col_types is not None: + col_types = configured_col_types + data = _apply_mask_column(data, data_columns, col_types, self.mask_column) + data = _apply_output_type_casting(data, data_columns, col_types) + + self._write_or_validate_resume_manifest( + selected_columns, + write_format, + data_columns, + id_maps, + n_classes, + col_types, + selected_columns_statistics, ) self._export_metadata( id_maps, n_classes, col_types, selected_columns_statistics ) - schema = self._create_schema(col_types, seq_length + 1) + schema = self._create_schema( + col_types, self.storage_layout.stored_context_width + ) data = data.sort(["sequenceId", "itemPosition"]) n_batches = _process_batches_single_file( @@ -213,7 +479,7 @@ def __init__( data, schema, self.n_cores, - seq_length, + self.storage_layout, stride_by_split, data_columns, col_types, @@ -224,6 +490,9 @@ def __init__( self.batches_per_file, subsequence_start_mode, self.merge_output, + self.allow_sequence_splitting, + self.split_method, + self.seed, ) if self.merge_output: @@ -254,6 +523,10 @@ def __init__( with open(metadata_path, "r") as f: preexisting_metadata = json.load(f) + validate_special_token_ids( + preexisting_metadata["special_token_ids"], + source=f"metadata config '{self.metadata_config_path}'", + ) id_maps = preexisting_metadata["id_maps"] selected_columns_statistics = preexisting_metadata[ "selected_columns_statistics" @@ -265,8 +538,13 @@ def __init__( data_columns = [ col for col in col_types.keys() - if col not in ["sequenceId", "itemPosition"] + if col not in _reserved_input_columns(self.mask_column) ] + configured_col_types = _configured_column_types_for_data_columns( + self.column_types, data_columns + ) + if configured_col_types is not None: + col_types = configured_col_types # We still need to find the files to process files_to_process = [] @@ -283,15 +561,31 @@ def __init__( col_types, data_columns, ) = self._get_column_metadata_across_files( - data_path, read_format, max_rows, selected_columns + data_path, + read_format, + max_rows, + selected_columns, + self.column_types, ) for col in id_maps: - col_types[col] = "Int64" + if self.column_types is None: + col_types[col] = "Int64" + self._write_or_validate_resume_manifest( + selected_columns, + write_format, + data_columns, + id_maps, + n_classes, + col_types, + selected_columns_statistics, + ) self._export_metadata( id_maps, n_classes, col_types, selected_columns_statistics ) - schema = self._create_schema(col_types, seq_length + 1) + schema = self._create_schema( + col_types, self.storage_layout.stored_context_width + ) self._process_batches_multiple_files( files_to_process, @@ -300,7 +594,7 @@ def __init__( max_rows, schema, self.n_cores, - seq_length, + self.storage_layout, stride_by_split, data_columns, n_classes, @@ -317,48 +611,27 @@ def __init__( @beartype def _create_schema( - self, col_types: dict[str, str], seq_length: int + self, col_types: dict[str, str], stored_context_width: int ) -> dict[str, Any]: - """Creates the Polars schema for the intermediate sequence DataFrame. - - This schema defines the structure of the DataFrame after sequence - extraction, which includes sequence identifiers, the start item position - within the original sequence, the input column name, and columns for - each item in the sequence (named '0', '1', ..., 'seq_length-1'). - - Args: - col_types: A dictionary mapping data column names to their Polars - string representations (e.g., "Int64", "Float64"). - seq_length: The length of the sequences being extracted. - - Returns: - A dictionary defining the Polars schema. Keys are column names - (e.g., "sequenceId", "subsequenceId", "startItemPosition", "inputCol", "0", "1", ...) - and values are Polars data types (e.g., `pl.Int64`). - """ + """Build the long-format extracted-window schema.""" schema = { "sequenceId": pl.Int64, "subsequenceId": pl.Int64, "startItemPosition": pl.Int64, + "leftPadLength": pl.Int64, "inputCol": pl.String, } - if (np.unique(list(col_types.values())) == np.array(["Int64"]))[0]: - sequence_position_type = pl.Int64 + if self.write_format == "parquet": + sequence_position_type = _resolve_unified_parquet_type(col_types) else: - if not np.all( - [ - type_.lower().startswith("int") - or type_.lower().startswith("uint") - or type_.lower().startswith("float") - for type_ in col_types.values() - ] - ): - raise ValueError("All column types must start with int or float") - sequence_position_type = pl.Float64 + sequence_position_type = _resolve_pt_extraction_type(col_types) schema.update( - {str(i): sequence_position_type for i in range(seq_length - 1, -1, -1)} + { + str(i): sequence_position_type + for i in range(stored_context_width - 1, -1, -1) + } ) return schema @@ -370,6 +643,7 @@ def _get_column_metadata_across_files( read_format: str, max_rows: Optional[int], selected_columns: Optional[list[str]], + column_types: Optional[dict[str, str]], ) -> tuple[ list[str], dict[str, int], @@ -378,39 +652,7 @@ def _get_column_metadata_across_files( dict[str, str], list[str], ]: - """Scans multiple data files to compute combined column metadata. - - This method iterates through all files in `data_path` matching `read_format`, - loading each one to incrementally build up metadata. It computes: - 1. ID maps for categorical/string columns. - 2. Mean and standard deviation for numerical (float) columns. - 3. The total number of unique classes for mapped columns. - 4. The data types of all columns. - - This is used when the dataset is split into multiple files to get a - consistent global view of the data. - - Args: - data_path: The path to the root data directory. - read_format: The file extension (e.g., "csv", "parquet") to read. - max_rows: The maximum total number of rows to process across all - files. If `None`, all rows are processed. - selected_columns: A list of columns to include. If `None`, all - columns (except "sequenceId" and "itemPosition") are used. - - Returns: - A tuple containing: - - n_classes (dict[str, int]): Map of column name to its - number of unique classes (including padding/unknown). - - id_maps (dict[str, dict[Union[str, int], int]]): Nested map - from column name to its value-to-integer-ID map. - - selected_columns_statistics (dict[str, dict[str, float]]): - Nested map from numerical column name to its 'mean' and 'std'. - - col_types (dict[str, str]): Map of column name to its - Polars string data type. - - data_columns (list[str]): List of all processed data - column names. - """ + """Accumulate metadata/statistics over a folder input.""" n_rows_running_count = 0 id_maps, selected_columns_statistics = {}, {} @@ -441,18 +683,24 @@ def _get_column_metadata_across_files( read_format, selected_columns, max_rows_inner, + self.mask_column, ) - # Get columns for the current file (excluding metadata cols) - current_file_cols = [ - col - for col in data.columns - if col not in ["sequenceId", "itemPosition"] - ] + current_file_cols = _get_data_columns(data, self.mask_column) + current_configured_col_types = ( + _configured_column_types_for_data_columns( + column_types, current_file_cols + ) + ) + data = _apply_configured_input_casting( + data, current_file_cols, current_configured_col_types + ) if col_types is None: data_columns = current_file_cols - col_types = {col: str(data.schema[col]) for col in data_columns} + col_types = current_configured_col_types or { + col: str(data.schema[col]) for col in data_columns + } for col in precomputed_id_maps.keys(): if col not in data_columns: @@ -471,12 +719,13 @@ def _get_column_metadata_across_files( f"Extra: {extra}" ) - for col in current_file_cols: - if str(data.schema[col]) != col_types[col]: - raise ValueError( - f"Type mismatch for column '{col}' in file '{file}'. " - f"Expected {col_types[col]}, got {str(data.schema[col])}" - ) + if column_types is None: + for col in current_file_cols: + if str(data.schema[col]) != col_types[col]: + raise ValueError( + f"Type mismatch for column '{col}' in file '{file}'. " + f"Expected {col_types[col]}, got {str(data.schema[col])}" + ) if data_columns is None: raise ValueError("data_columns is None") @@ -488,6 +737,7 @@ def _get_column_metadata_across_files( selected_columns_statistics, n_rows_running_count, precomputed_id_maps, + self.mask_column, ) n_rows_running_count += data.shape[0] @@ -512,13 +762,7 @@ def _get_column_metadata_across_files( @beartype def _setup_directories(self) -> None: - """Sets up the output directories for preprocessed data. - - This method creates the base `data/` directory within the `project_root` - if it doesn't exist. It also creates a temporary directory (defined by - `self.target_dir`) for storing intermediate batch files, removing it - first if it already exists to ensure a clean run. - """ + """Prepare or validate preprocessing temp directories.""" temp_path = os.path.join(self.project_root, "data", self.target_dir) @@ -533,16 +777,7 @@ def _setup_directories(self) -> None: @beartype def _setup_split_paths(self, write_format: str, n_splits: int) -> None: - """Sets up the final output paths for the data splits. - - This method constructs the full file paths for each data split - (e.g., train, validation, test) based on the `data_name_root` and - `write_format`. The paths are stored in the `self.split_paths` attribute. - - Args: - write_format: The file extension for the output files (e.g., "pt", "parquet"). - n_splits: The number of splits to create (e.g., 3 for train/val/test). - """ + """Set final split output paths.""" split_paths = [ os.path.join( self.project_root, @@ -563,7 +798,7 @@ def _process_batches_multiple_files( max_rows: Optional[int], schema: Any, n_cores: int, - seq_length: int, + layout: StoredWindowLayout, stride_by_split: list[int], data_columns: list[str], n_classes: dict[str, int], @@ -574,28 +809,12 @@ def _process_batches_multiple_files( write_format: str, process_by_file: bool = True, subsequence_start_mode: str = "distribute", + mask_column: Optional[str] = None, ) -> None: - """Processes batches of data from multiple files. - - Args: - file_paths: A list of file paths to process. - read_format: The file format to read. - selected_columns: A list of columns to be included in the preprocessing. - max_rows: The maximum number of rows to process. - schema: The schema for the preprocessed data. - n_cores: The number of cores to use for parallel processing. - seq_length: The sequence length for the model inputs. - stride_by_split: A list of step sizes for creating subsequences. - data_columns: A list of data columns. - n_classes: A dictionary containing the number of classes for each categorical column. - id_maps: A dictionary containing the id maps for each categorical column. - selected_columns_statistics: A dictionary containing the statistics for each numerical column. - col_types: A dictionary containing the column types. - split_ratios: A list of floats that define the relative sizes of data splits. - write_format: The file format for the output files. - process_by_file: A flag to indicate if processing should be done file by file. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - """ + """Dispatch folder preprocessing by file or by process shard.""" + if mask_column is None: + mask_column = self.mask_column + if process_by_file: _process_batches_multiple_files_inner( project_root=self.project_root, @@ -607,7 +826,7 @@ def _process_batches_multiple_files( max_rows=max_rows, schema=schema, n_cores=n_cores, - seq_length=seq_length, + layout=layout, stride_by_split=stride_by_split, data_columns=data_columns, n_classes=n_classes, @@ -620,8 +839,12 @@ def _process_batches_multiple_files( target_dir=self.target_dir, batches_per_file=self.batches_per_file, merge_output=self.merge_output, + allow_sequence_splitting=self.allow_sequence_splitting, continue_preprocessing=self.continue_preprocessing, subsequence_start_mode=subsequence_start_mode, + mask_column=mask_column, + split_method=self.split_method, + seed=self.seed, ) input_files = create_file_paths_for_multiple_files2( self.project_root, @@ -651,7 +874,7 @@ def _process_batches_multiple_files( "max_rows": max_rows, "schema": schema, "n_cores": 1, - "seq_length": seq_length, + "layout": layout, "stride_by_split": stride_by_split, "data_columns": data_columns, "n_classes": n_classes, @@ -664,8 +887,12 @@ def _process_batches_multiple_files( "target_dir": self.target_dir, "batches_per_file": self.batches_per_file, "merge_output": self.merge_output, + "allow_sequence_splitting": self.allow_sequence_splitting, "continue_preprocessing": self.continue_preprocessing, "subsequence_start_mode": subsequence_start_mode, + "mask_column": mask_column, + "split_method": self.split_method, + "seed": self.seed, } job_params = [ @@ -705,21 +932,7 @@ def _process_batches_multiple_files( @beartype def _cleanup(self, write_format: str) -> None: - """Finalizes output files and removes temporary directories. - - If `write_format` is 'pt' and `merge_output` is False, - this method moves the processed .pt batch files from the temporary - `target_dir` into their final split-specific subfolders (e.g., - 'data_name_root-split0/'). It also generates a 'metadata.json' file - in each of these subfolders, which is required by - `SequifierDatasetFromFolderPt`. - - Finally, it removes the temporary `target_dir` if it's empty or - if `target_dir` is "temp" (implying `merge_output` was True). - - Args: - write_format: The file format of the output files (e.g., "pt"). - """ + """Move split outputs, write folder metadata, and remove temp files.""" logger.info("Start cleanup") temp_output_path = os.path.join(self.project_root, "data", self.target_dir) @@ -752,6 +965,81 @@ def _cleanup(self, write_format: str) -> None: if not os.listdir(directory) or self.target_dir == "temp": shutil.rmtree(directory) + @beartype + def _layout_metadata(self) -> dict[str, int]: + return { + "stored_context_width": self.storage_layout.stored_context_width, + "max_target_offset": self.storage_layout.max_target_offset, + "stored_window_layout_version": self.storage_layout.version, + } + + @beartype + def _write_or_validate_resume_manifest( + self, + selected_columns: Optional[list[str]], + write_format: str, + data_columns: list[str], + id_maps: dict[str, dict[Union[str, int], int]], + n_classes: dict[str, int], + col_types: dict[str, str], + selected_columns_statistics: dict[str, dict[str, float]], + ) -> None: + effective_metadata = { + "n_classes": n_classes, + "id_maps": id_maps, + "column_types": col_types, + "selected_columns_statistics": selected_columns_statistics, + "special_token_ids": SPECIAL_TOKEN_IDS.ids_by_label, + } + manifest = { + "manifest_version": 1, + "preprocessing_config": { + **self._layout_metadata(), + "read_format": self.read_format, + "write_format": write_format, + "merge_output": self.merge_output, + "selected_columns": selected_columns, + "data_columns": data_columns, + "split_ratios": self.split_ratios, + "split_method": self.split_method, + "seed": self.seed, + "stride_by_split": self.stride_by_split, + "max_rows": self.max_rows, + "process_by_file": self.process_by_file, + "subsequence_start_mode": self.subsequence_start_mode, + "mask_column": self.mask_column, + "metadata_config_path": self.metadata_config_path, + "use_precomputed_maps": self.use_precomputed_maps, + }, + "effective_metadata_digest": { + "algorithm": "sha256", + "value": _stable_json_digest(effective_metadata), + }, + } + manifest_path = os.path.join( + self.project_root, "data", self.target_dir, "preprocess-manifest.json" + ) + + if self.continue_preprocessing: + if not os.path.exists(manifest_path): + raise ValueError( + "Cannot continue preprocessing because the temp manifest is missing." + ) + with open(manifest_path, "r") as f: + previous_manifest = json.load(f) + if _stable_json_value(previous_manifest) != _stable_json_value(manifest): + raise ValueError( + "Cannot continue preprocessing with a different preprocessing " + "manifest. Check sequence layout, input path, selected/data " + "columns, output format, mask/metadata settings, split/stride " + "settings, max_rows, process_by_file, subsequence_start_mode, " + "or metadata/maps/statistics." + ) + return + + with open(manifest_path, "w") as f: + json.dump(manifest, f, indent=4) + @beartype def _export_metadata( self, @@ -760,32 +1048,21 @@ def _export_metadata( col_types: dict[str, str], selected_columns_statistics: dict[str, dict[str, float]], ) -> None: - """Exports the computed data metadata to a JSON file. - - Saves metadata such as class counts, ID mappings, split paths, - column types, and numerical statistics to a JSON file. This file is - saved in the `configs/metadata_configs/` directory, named after the - `data_name_root`. This metadata is essential for initializing the - model and data loaders during training. - - Args: - id_maps: A dictionary containing the id maps for each - categorical column. - n_classes: A dictionary containing the number of classes for - each categorical column. - col_types: A dictionary containing the column types. - selected_columns_statistics: A dictionary containing the - statistics for each numerical column. - """ + """Write metadata config JSON for training/inference.""" data_driven_config = { "n_classes": n_classes, "id_maps": id_maps, + "special_token_ids": SPECIAL_TOKEN_IDS.ids_by_label, "split_paths": [ os.path.splitext(split_path)[0] if not self.merge_output else split_path for split_path in self.split_paths ], "column_types": col_types, - "selected_columns_statistics": selected_columns_statistics, + "selected_columns_statistics": { + col: {"mean": stats["mean"], "std": stats["std"]} + for col, stats in selected_columns_statistics.items() + }, + **self._layout_metadata(), } os.makedirs( os.path.join(self.project_root, "configs", "metadata_configs"), @@ -805,19 +1082,7 @@ def _export_metadata( @beartype def _create_metadata_for_folder(self, folder_path: str, write_format: str) -> None: - """Scans a directory for batch files, counts samples, and writes metadata.json. - - This method is used when `merge_output` is False. It iterates over all - files in the given `folder_path` matching the `write_format`, loads each - one to count the number of samples (sequences), and writes a `metadata.json` - file in that same folder. This JSON file contains the total sample count and a - list of all batch files with their respective sample counts. - - Args: - folder_path: The path to the directory containing the batch files - for a specific data split. - write_format: The file format of the output files (e.g., 'pt', 'parquet'). - """ + """Write metadata.json for an unmerged split folder.""" logger.info(f"Creating metadata for folder '{folder_path}'") batch_files_metadata = [] total_samples = 0 @@ -835,7 +1100,9 @@ def _create_metadata_for_folder(self, folder_path: str, write_format: str) -> No for file_path in files: try: if write_format == "pt": - sequences_dict, _, _, _ = torch.load(file_path, weights_only=False) + sequences_dict, _, _, _, _ = torch.load( + file_path, weights_only=False + ) if sequences_dict: n_samples = sequences_dict[ list(sequences_dict.keys())[0] @@ -864,6 +1131,7 @@ def _create_metadata_for_folder(self, folder_path: str, write_format: str) -> No metadata = { "total_samples": total_samples, "batch_files": batch_files_metadata, + **self._layout_metadata(), } metadata_path = directory / "metadata.json" @@ -871,6 +1139,103 @@ def _create_metadata_for_folder(self, folder_path: str, write_format: str) -> No json.dump(metadata, f, indent=4) +@beartype +def _reserved_input_columns(mask_column: Optional[str]) -> tuple[str, ...]: + if mask_column is None: + return INPUT_METADATA_COLUMNS + return (*INPUT_METADATA_COLUMNS, mask_column) + + +@beartype +def _get_data_columns( + data: pl.DataFrame, mask_column: Optional[str] = None +) -> list[str]: + return [ + col for col in data.columns if col not in _reserved_input_columns(mask_column) + ] + + +@beartype +def _deduplicate_columns(columns: list[str]) -> list[str]: + return list(dict.fromkeys(columns)) + + +@beartype +def _selected_columns_with_optional_mask( + data_path: str, + read_format: str, + selected_columns: Optional[list[str]], + mask_column: Optional[str] = None, +) -> Optional[list[str]]: + if selected_columns is None or mask_column is None: + return selected_columns + + if read_format != "parquet": + return _deduplicate_columns(selected_columns + [mask_column]) + + schema_columns = pq.read_schema(data_path).names + if mask_column in schema_columns: + return _deduplicate_columns(selected_columns + [mask_column]) + raise ValueError(f"mask_column '{mask_column}' not found in {data_path}") + + +@beartype +def _validate_and_create_mask_column_expr( + series: Any, mask_dtype: Any, mask_column: str +) -> pl.Expr: + mask_col = pl.col(mask_column) + + if mask_dtype == pl.Boolean: + return mask_col + + if mask_dtype.is_numeric(): + if not series.drop_nulls().is_in([0, 1]).all(): + raise ValueError( + f"Mask column {mask_column} contains inadmissible values not in (0, 1)" + ) + return mask_col == 1 + + raise ValueError( + f"Column {mask_column} must be boolean or numeric, got {mask_dtype}" + ) + + +@beartype +def _apply_mask_column( + data: pl.DataFrame, + data_columns: list[str], + col_types: dict[str, str], + mask_column: Optional[str] = None, +) -> pl.DataFrame: + if mask_column is None: + return data + if mask_column not in data.columns: + raise ValueError(f"mask_column '{mask_column}' not found in input data") + + mask_expr = _validate_and_create_mask_column_expr( + data[mask_column], data.schema[mask_column], mask_column + ) + updates = [] + for col in data_columns: + mask_value = ( + SPECIAL_TOKEN_IDS.mask + if is_integer_dtype_name(col_types[col]) + else REAL_MASK_VALUE + ) + updates.append( + pl.when(mask_expr) + .then(pl.lit(mask_value)) + .otherwise(pl.col(col)) + .cast(data.schema[col]) + .alias(col) + ) + + if updates: + data = data.with_columns(updates) + + return data.drop(mask_column) + + @beartype def _apply_column_statistics( data: pl.DataFrame, @@ -880,47 +1245,31 @@ def _apply_column_statistics( n_classes: Optional[dict[str, int]] = None, col_types: Optional[dict[str, str]] = None, ) -> tuple[pl.DataFrame, dict[str, int], dict[str, str]]: - """Applies pre-computed statistics to transform the data. - - This function performs two main transformations on the DataFrame: - 1. **Categorical Mapping**: Replaces original values in categorical - columns with their corresponding integer IDs using `id_maps`. - 2. **Numerical Standardization**: Standardizes numerical columns - (those in `selected_columns_statistics`) using the Z-score - formula: (value - mean) / (std + 1e-9). - - It also computes `n_classes` and `col_types` if they are not provided. - - Args: - data: The input Polars DataFrame to transform. - data_columns: A list of column names to process. - id_maps: A nested dictionary mapping column names to their - value-to-integer-ID maps. - selected_columns_statistics: A nested dictionary mapping - column names to their 'mean' and 'std' statistics. - n_classes: An optional dictionary mapping column names to - their total number of unique classes. If `None`, it's computed - from `id_maps`. - col_types: An optional dictionary mapping column names to - their string data types. If `None`, it's inferred from the - `data` schema. - - Returns: - A tuple `(data, n_classes, col_types)` where: - - `data`: The transformed Polars DataFrame. - - `n_classes`: The (potentially computed) class count dictionary. - - `col_types`: The (potentially computed) column type dictionary. - """ + """Apply categorical maps and numeric standardization.""" + col_types_was_provided = col_types is not None + if n_classes is None: n_classes = {col: max(id_maps[col].values()) + 1 for col in id_maps} if col_types is None: col_types = {col: str(data.schema[col]) for col in data_columns} + missing_columns = [ + col + for col in data_columns + if col not in id_maps and col not in selected_columns_statistics + ] + if missing_columns: + raise ValueError( + "No unmasked examples found for columns: " + f"{missing_columns}. Check the mask column or provide precomputed metadata." + ) + for col in data_columns: if col in id_maps: data = data.with_columns(pl.col(col).replace(id_maps[col], default=1)) - col_types[col] = "Int64" + if not col_types_was_provided: + col_types[col] = "Int64" elif col in selected_columns_statistics: data = data.with_columns( ( @@ -938,17 +1287,7 @@ def load_precomputed_id_maps( data_columns: Optional[list[str]], required_maps: Optional[list[str]] = None, ) -> dict[str, dict[Union[str, int], int]]: - """Loads custom ID maps from configs/id_maps if the folder exists. - - Args: - project_root: The path to the project root directory. - data_columns: Optional list of columns present in the data to validate - against the found map files. - required_maps: Optional list of columns for which a precomputed id_map is required - - Returns: - A dictionary mapping column names to their ID maps. - """ + """Load and validate precomputed ID maps.""" custom_maps = {} path = os.path.join(project_root, "configs", "id_maps") @@ -967,16 +1306,44 @@ def load_precomputed_id_maps( ) with open(os.path.join(path, file), "r") as f: - # Load and ensure values are integers m = {k: int(v) for k, v in json.load(f).items()} if not len(m) > 0: raise ValueError(f"map in {file} does not contain any values") - min_val = min(m.values()) - if min_val != 2: + for ( + reserved_key, + expected_value, + ) in SPECIAL_TOKEN_IDS.ids_by_label.items(): + if reserved_key in m and m[reserved_key] != expected_value: + raise ValueError( + f"{reserved_key} in map {file} must map to {expected_value}" + ) + + user_values = [ + value + for key, value in m.items() + if key not in SPECIAL_TOKEN_LABELS + ] + if not user_values: + raise ValueError( + f"map in {file} does not contain any non-reserved values" + ) + + min_val = min(user_values) + if min_val == 2: + raise ValueError( + f"Precomputed map {file} uses legacy user IDs starting at 2" + ) + if min_val != SPECIAL_TOKEN_IDS.user_start: raise ValueError( - f"minimum value in map {file} is {min_val}, must be 2." + f"minimum non-reserved value in map {file} is {min_val}, must be {SPECIAL_TOKEN_IDS.user_start}." ) + if any(value in SPECIAL_TOKEN_ID_VALUES for value in user_values): + raise ValueError( + f"non-reserved values in map {file} must not use reserved IDs {SPECIAL_TOKEN_ID_VALUES}" + ) + if len(set(m.values())) != len(m.values()): + raise ValueError(f"map in {file} contains duplicate IDs") custom_maps[col_name] = m if required_maps: missing_maps = [col for col in required_maps if col not in custom_maps] @@ -997,42 +1364,21 @@ def _get_column_statistics( selected_columns_statistics: dict[str, dict[str, float]], n_rows_running_count: int, precomputed_id_maps: dict[str, dict[Union[str, int], int]], + mask_column: Optional[str] = None, ) -> tuple[ dict[str, dict[Union[str, int], int]], dict[str, dict[str, float]], ]: - """Computes or updates column statistics from a data chunk. - - This function iterates over the `data_columns` and updates the - `id_maps` and `selected_columns_statistics` dictionaries based on the - provided `data` chunk. - - - For string/integer columns: It creates an ID map of unique values and - merges it with any existing map in `id_maps`. - - For float columns: It computes the mean and standard deviation of the - chunk and combines them with the existing statistics in - `selected_columns_statistics` using a numerically stable parallel - algorithm, weighted by `n_rows_running_count`. - - Args: - data: The Polars DataFrame chunk to process. - data_columns: A list of column names in `data` to analyze. - id_maps: The dictionary of existing ID maps to be updated. - selected_columns_statistics: The dictionary of existing numerical - statistics to be updated. - n_rows_running_count: The total number of rows processed *before* - this chunk, used for weighting statistics. - precomputed_id_maps: A dictionary of pre-loaded ID maps that should - be applied and not re-computed. - - Returns: - A tuple `(id_maps, selected_columns_statistics)` containing the - updated dictionaries. - - Raises: - ValueError: If a column has an unsupported data type (neither - string, integer, nor float). - """ + """Update ID maps and numeric statistics from one chunk.""" + if mask_column is not None and mask_column in data.columns: + mask_expr = _validate_and_create_mask_column_expr( + data[mask_column], data.schema[mask_column], mask_column + ) + data = data.filter(~mask_expr) + + if data.is_empty(): + return id_maps, selected_columns_statistics + for data_col in data_columns: dtype = data.schema[data_col] if isinstance( @@ -1055,24 +1401,35 @@ def _get_column_statistics( id_maps[data_col] = combine_maps(new_id_map, id_maps.get(data_col, {})) else: logger.info(f"Applying precomputed map for {data_col}") - elif isinstance(dtype, (pl.Float32, pl.Float64)): + elif isinstance(dtype, (pl.Float16, pl.Float32, pl.Float64)): if data_col in precomputed_id_maps: raise ValueError( f"Column {data_col} is not categorical, precomputed map is invalid." ) - combined_mean, combined_std = get_combined_statistics( - data.shape[0], - data.get_column(data_col).mean(), - data.get_column(data_col).std(), - n_rows_running_count, - selected_columns_statistics.get(data_col, {"mean": 0.0})["mean"], - selected_columns_statistics.get(data_col, {"std": 0.0})["std"], - ) + chunk_mean = data.get_column(data_col).mean() + chunk_std = data.get_column(data_col).std() or 0.0 + previous_stats = selected_columns_statistics.get(data_col) + + if previous_stats is None: + combined_mean, combined_std = chunk_mean, chunk_std + combined_count = data.shape[0] + else: + previous_count = int(previous_stats.get("count", n_rows_running_count)) + combined_mean, combined_std = get_combined_statistics( + data.shape[0], + chunk_mean, + chunk_std, + previous_count, + previous_stats["mean"], + previous_stats["std"], + ) + combined_count = previous_count + data.shape[0] selected_columns_statistics[data_col] = { "std": combined_std, "mean": combined_mean, + "count": float(combined_count), } else: raise ValueError(f"Column {data_col} has unsupported dtype: {dtype}") @@ -1086,38 +1443,29 @@ def _load_and_preprocess_data( read_format: str, selected_columns: Optional[list[str]], max_rows: Optional[int], + mask_column: Optional[str] = None, ) -> pl.DataFrame: - """Loads data from a file and performs initial preparation. - - This function reads a data file using the specified `read_format`. - It then performs the following steps: - 1. Asserts that the data contains no null or NaN values. - 2. Selects only the `selected_columns` if provided. - 3. Slices the DataFrame to `max_rows` if provided. - - Args: - data_path: The path to the data file. - read_format: The file format to read (e.g., "csv", "parquet"). - selected_columns: A list of columns to load. If `None`, all - columns are loaded. - max_rows: The maximum number of rows to load. If `None`, all - rows are loaded. - - Returns: - A Polars DataFrame containing the loaded and initially - prepared data. - """ + """Read, validate, column-filter, and row-limit one input file.""" logger.info(f"Reading data from '{data_path}'...") - data = read_data(data_path, read_format, columns=selected_columns) + columns_to_read = _selected_columns_with_optional_mask( + data_path, read_format, selected_columns, mask_column + ) + data = read_data(data_path, read_format, columns=columns_to_read) + + if mask_column is not None and mask_column not in data.columns: + raise ValueError(f"mask_column '{mask_column}' not found in {data_path}") if data.null_count().sum().sum_horizontal().item() != 0: raise ValueError(f"NaN or null values not accepted: {data.null_count()}") if selected_columns: selected_columns_filtered = [ - col for col in selected_columns if col not in ["sequenceId", "itemPosition"] + col for col in selected_columns if col not in INPUT_METADATA_COLUMNS ] - data = data.select(["sequenceId", "itemPosition"] + selected_columns_filtered) + columns_to_select = list(INPUT_METADATA_COLUMNS) + selected_columns_filtered + if mask_column is not None and mask_column in data.columns: + columns_to_select.append(mask_column) + data = data.select(_deduplicate_columns(columns_to_select)) if max_rows: data = data.slice(0, int(max_rows)) @@ -1175,6 +1523,31 @@ def _check_file_has_been_processed( return False +@beartype +def _get_processed_prefixes( + project_root: str, + target_dir: str, + write_format: str, +) -> set[str]: + temp_dir = Path(project_root) / "data" / target_dir + + if not temp_dir.is_dir(): + return set() + + suffix = f".{write_format}" + processed = set() + + with os.scandir(temp_dir) as entries: + for entry in entries: + if not entry.is_file() or not entry.name.endswith(suffix): + continue + + if "-split" in entry.name: + processed.add(entry.name.rsplit("-split", 1)[0]) + + return processed + + @beartype def _process_batches_multiple_files_inner( project_root: str, @@ -1186,7 +1559,7 @@ def _process_batches_multiple_files_inner( max_rows: Optional[int], schema: Any, n_cores: int, - seq_length: int, + layout: StoredWindowLayout, stride_by_split: list[int], data_columns: list[str], n_classes: dict[str, int], @@ -1199,37 +1572,20 @@ def _process_batches_multiple_files_inner( target_dir: str, batches_per_file: int, merge_output: bool, + allow_sequence_splitting: bool, continue_preprocessing: bool, subsequence_start_mode: str, + mask_column: Optional[str], + split_method: str, + seed: int, ): - """Inner function for processing batches of data from multiple files. - - Args: - project_root: The path to the sequifier project directory. - data_name_root: The root name of the data file. - process_id: The id of the process. - file_paths: A list of file paths to process. - read_format: The file format to read. - selected_columns: A list of columns to be included in the preprocessing. - max_rows: The maximum number of rows to process. - schema: The schema for the preprocessed data. - n_cores: The number of cores to use for parallel processing. - seq_length: The sequence length for the model inputs. - stride_by_split: A list of step sizes for creating subsequences. - data_columns: A list of data columns. - n_classes: A dictionary containing the number of classes for each categorical column. - id_maps: A dictionary containing the id maps for each categorical column. - selected_columns_statistics: A dictionary containing the statistics for each numerical column. - col_types: A dictionary containing the column types. - split_ratios: A list of floats that define the relative sizes of data splits. - write_format: The file format for the output files. - split_paths: The paths to the output split files. - target_dir: The target directory for temporary files. - batches_per_file: The number of batches to process per file. - merge_output: Whether to combine the output into a single file. - continue_preprocessing: Continue preprocessing job that was interrupted while writing to temp folder. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - """ + """Process this worker's file shard.""" + + processed_prefixes = ( + _get_processed_prefixes(project_root, target_dir, write_format) + if continue_preprocessing and not merge_output + else set() + ) n_files = len(file_paths) if n_files <= 0: raise ValueError("No files found to process.") @@ -1247,32 +1603,42 @@ def _process_batches_multiple_files_inner( for path in split_paths ] if continue_preprocessing: - file_has_been_processed = _check_file_has_been_processed( - project_root, - data_name_root, - process_id, - split_ratios, - write_format, - target_dir, - merge_output, - file_index_str, - ) - + file_prefix_str = f"{data_name_root}-{process_id}-{file_index_str}" + + if not merge_output: + file_has_been_processed = file_prefix_str in processed_prefixes + else: + file_has_been_processed = _check_file_has_been_processed( + project_root, + data_name_root, + process_id, + split_ratios, + write_format, + target_dir, + merge_output, + file_index_str, + ) if file_has_been_processed: logger.info(f"Skipping already processed file: {path}") if max_rows is not None: data = _load_and_preprocess_data( - path, read_format, selected_columns, max_rows_inner + path, + read_format, + selected_columns, + max_rows_inner, + mask_column, ) n_rows_running_count += data.shape[0] continue data = _load_and_preprocess_data( - path, read_format, selected_columns, max_rows_inner - ) - data = _load_and_preprocess_data( - path, read_format, selected_columns, max_rows_inner + path, + read_format, + selected_columns, + max_rows_inner, + mask_column, ) + data = _apply_configured_input_casting(data, data_columns, col_types) data, _, _ = _apply_column_statistics( data, data_columns, @@ -1281,6 +1647,8 @@ def _process_batches_multiple_files_inner( n_classes, col_types, ) + data = _apply_mask_column(data, data_columns, col_types, mask_column) + data = _apply_output_type_casting(data, data_columns, col_types) data_name_root_inner = f"{data_name_root}-{process_id}-{file_index_str}" @@ -1290,7 +1658,7 @@ def _process_batches_multiple_files_inner( data, schema, n_cores, - seq_length, + layout, stride_by_split, data_columns, col_types, @@ -1301,6 +1669,9 @@ def _process_batches_multiple_files_inner( batches_per_file, subsequence_start_mode, merge_output, + allow_sequence_splitting, + split_method, + seed, ) if merge_output: @@ -1337,7 +1708,7 @@ def _process_batches_single_file( data: pl.DataFrame, schema: Any, n_cores: Optional[int], - seq_length: int, + layout: StoredWindowLayout, stride_by_split: list[int], data_columns: list[str], col_types: dict[str, str], @@ -1348,32 +1719,13 @@ def _process_batches_single_file( batches_per_file: int, subsequence_start_mode: str, merge_output: bool, + allow_sequence_splitting: bool, + split_method: str = "within_sequence", + seed: int = 1010, ) -> int: - """Processes batches of data from a single file. - - Args: - project_root: The path to the sequifier project directory. - data_name_root: The root name of the data file. - data: The data to process. - schema: The schema for the preprocessed data. - n_cores: The number of cores to use for parallel processing. - seq_length: The sequence length for the model inputs. - stride_by_split: A list of step sizes for creating subsequences. - data_columns: A list of data columns. - col_types: A dictionary containing the column types. - split_ratios: A list of floats that define the relative sizes of data splits. - write_format: The file format for the output files. - split_paths: The paths to the output split files. - target_dir: The target directory for temporary files. - batches_per_file: The number of batches to process per file. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - merge_output: merge output - - Returns: - The number of batches processed. - """ + """Split one file into worker batches and preprocess them.""" n_cores = n_cores or multiprocessing.cpu_count() - batch_limits = get_batch_limits(data, n_cores) + batch_limits = get_batch_limits(data, n_cores, allow_sequence_splitting) valid_batch_limits = [(s, e) for s, e in batch_limits if (e - s) > 0] batches = [ ( @@ -1383,7 +1735,7 @@ def _process_batches_single_file( data.slice(start, end - start), schema, split_paths, - seq_length, + layout, stride_by_split, data_columns, col_types, @@ -1393,6 +1745,8 @@ def _process_batches_single_file( batches_per_file, subsequence_start_mode, merge_output, + split_method, + seed, ) for process_id, (start, end) in enumerate(valid_batch_limits) ] @@ -1410,33 +1764,20 @@ def _process_batches_single_file( def get_combined_statistics( n1: int, mean1: float, std1: float, n2: int, mean2: float, std2: float ) -> tuple[float, float]: - """Calculates the combined mean and standard deviation of two data subsets. - - Uses a stable parallel algorithm (related to Welford's algorithm) to - combine statistics from two subsets without needing the original data. - - Args: - n1: Number of samples in subset 1. - mean1: Mean of subset 1. - std1: Standard deviation of subset 1. - n2: Number of samples in subset 2. - mean2: Mean of subset 2. - std2: Standard deviation of subset 2. - - Returns: - A tuple `(combined_mean, combined_std)` containing the combined - mean and standard deviation of the two subsets. - """ - # Step 1: Calculate the combined mean. + """Combine two mean/std summaries.""" + if n1 == 0: + return mean2, std2 + if n2 == 0: + return mean1, std1 + combined_mean = (n1 * mean1 + n2 * mean2) / (n1 + n2) - # Step 2: Calculate the pooled sum of squared differences. - # This includes the internal variance of each subset and the variance - # between the subset mean and the combined mean. + if n1 + n2 <= 1: + return combined_mean, 0.0 + sum_of_squares1 = (n1 - 1) * std1**2 + n1 * (mean1 - combined_mean) ** 2 sum_of_squares2 = (n2 - 1) * std2**2 + n2 * (mean2 - combined_mean) ** 2 - # Step 3: Calculate the combined standard deviation. combined_std = math.sqrt((sum_of_squares1 + sum_of_squares2) / (n1 + n2 - 1)) return combined_mean, combined_std @@ -1444,113 +1785,157 @@ def get_combined_statistics( @beartype def create_id_map(data: pl.DataFrame, column: str) -> dict[Union[str, int], int]: - """Creates a map from unique values in a column to integer indices. - - Finds all unique values in the specified `column` of the `data` - DataFrame, sorts them, and creates a dictionary mapping each unique - value to a 1-based integer index. - - Args: - data: The Polars DataFrame containing the column. - column: The name of the column to map. - - Returns: - A dictionary mapping unique values (str or int) to an integer - index (starting from 1). - """ + """Map sorted user values to IDs after reserved tokens.""" ids = sorted( [int(x) if not isinstance(x, str) else x for x in np.unique(data[column])] ) # type: ignore - id_map = {id_: i + 2 for i, id_ in enumerate(ids)} + + if isinstance(ids[0], str): + if SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.mask] in ids: + raise ValueError( + f"Found value '{SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.mask]}' in {column}, this is invalid" + ) + + for special_val in [ + SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.unknown], + SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.other], + ]: + if special_val in ids: + warnings.warn( + f"Found special value {special_val} in {column}, these will be combined with the sequifier-internal special value {special_val}" + ) + ids = [ + id_ + for id_ in ids + if id_ + not in [ + SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.unknown], + SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.other], + ] + ] + id_map = {id_: i + SPECIAL_TOKEN_IDS.user_start for i, id_ in enumerate(ids)} + id_map[SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.unknown]] = ( + SPECIAL_TOKEN_IDS.unknown + ) + id_map[SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.other]] = ( + SPECIAL_TOKEN_IDS.other + ) + else: + id_map = {id_: i + SPECIAL_TOKEN_IDS.user_start for i, id_ in enumerate(ids)} return dict(id_map) @beartype -def get_batch_limits(data: pl.DataFrame, n_batches: int) -> list[tuple[int, int]]: - """Calculates row indices to split a DataFrame into batches. - - This function divides the DataFrame into `n_batches` roughly equal - chunks. Crucially, it ensures that no `sequenceId` is split across - two different batches. It does this by finding the ideal split points - and then adjusting them to the nearest `sequenceId` boundary. - - Args: - data: The DataFrame to split. Must be sorted by "sequenceId". - n_batches: The desired number of batches. - - Returns: - A list of `(start_index, end_index)` tuples, where each tuple - defines the row indices for a batch. - """ +def get_batch_limits( + data: pl.DataFrame, n_batches: int, allow_sequence_splitting: bool +) -> list[tuple[int, int]]: + """Split rows into batches without crossing sequenceId boundaries unless allowed.""" + if n_batches <= 0: + raise ValueError("n_batches must be positive.") + if data.is_empty(): + raise ValueError("Cannot split an empty dataset into batches.") + sequence_ids = data.get_column("sequenceId").to_numpy() - new_sequence_id_indices = np.concatenate( - [ - [0], - np.where( - np.concatenate([[False], sequence_ids[1:] != sequence_ids[:-1]], axis=0) - )[0], - ] + sequence_start_indices = np.concatenate( + [[0], np.where(sequence_ids[1:] != sequence_ids[:-1])[0] + 1] ) + sequence_boundaries = np.concatenate([sequence_start_indices, [data.shape[0]]]) + sequence_count = len(sequence_start_indices) - ideal_step = math.ceil(data.shape[0] / n_batches) - ideal_limits = np.array( - [ideal_step * m for m in range(n_batches)] + [data.shape[0]] - ) - distances = [ - np.abs(new_sequence_id_indices - ideal_limit) - for ideal_limit in ideal_limits[:-1] - ] - actual_limit_indices = [ - np.where(distance == np.min(distance))[0] for distance in distances - ] - actual_limits = [ - int(new_sequence_id_indices[limit_index[0]]) - for limit_index in actual_limit_indices - ] + [data.shape[0]] - return list(zip(actual_limits[:-1], actual_limits[1:])) + if n_batches > sequence_count: + if not allow_sequence_splitting: + raise ValueError( + "Cannot create more non-empty batches than there are sequences without " + "splitting a sequence." + ) + + original_lengths = np.diff(sequence_boundaries) + pieces = np.ones(len(original_lengths), dtype=int) + + for _ in range(n_batches - sequence_count): + largest_piece_idx = int(np.argmax(original_lengths / pieces)) + pieces[largest_piece_idx] += 1 + + if np.any(pieces > original_lengths): + raise ValueError( + "Cannot split further: sequences are too short to reach the " + "requested number of non-empty batches." + ) + + new_boundaries = [] + for start, length, num_pieces in zip( + sequence_boundaries[:-1], original_lengths, pieces + ): + # Calculate evenly spaced boundaries within this sequence + splits = start + np.round(np.linspace(0, length, num_pieces + 1)).astype( + int + ) + + if not new_boundaries: + new_boundaries.extend(splits) + else: + new_boundaries.extend( + splits[1:] + ) # Avoid duplicating the shared boundary + + sequence_boundaries = np.array(new_boundaries) + + interior_boundaries = sequence_boundaries[1:-1] + ideal_limits = np.linspace(0, data.shape[0], n_batches + 1)[1:-1] + + selected_boundaries: list[int] = [] + previous_boundary = 0 + for batch_index, ideal_limit in enumerate(ideal_limits): + remaining_boundaries_needed = len(ideal_limits) - batch_index - 1 + candidates = [ + int(boundary) + for boundary in interior_boundaries + if boundary > previous_boundary + and (data.shape[0] - boundary) >= remaining_boundaries_needed + ] + if not candidates: + raise ValueError( + "Cannot create requested non-empty batches without splitting a sequence." + ) + + selected_boundary = min( + candidates, + key=lambda boundary: abs(boundary - ideal_limit), + ) + selected_boundaries.append(selected_boundary) + previous_boundary = selected_boundary + + limits = [0, *selected_boundaries, data.shape[0]] + return list(zip(limits[:-1], limits[1:])) @beartype def combine_maps( map1: dict[Union[str, int], int], map2: dict[Union[str, int], int] ) -> dict[Union[str, int], int]: - """Combines two ID maps into a new, consolidated map. - - Takes all unique keys from both `map1` and `map2`, sorts them, - and creates a new, single map where keys are mapped to 1-based - indices based on the sorted order. This ensures a consistent - mapping across different data chunks. - - Args: - map1: The first ID map. - map2: The second ID map. - - Returns: - A new, combined, and re-indexed ID map. - """ - combined_keys = sorted(list(set(list(map1.keys())).union(list(set(map2.keys()))))) - id_map = {id_: i + 2 for i, id_ in enumerate(combined_keys)} + """Merge maps and reassign user IDs after reserved tokens.""" + keys1 = {k for k in map1.keys() if k not in SPECIAL_TOKEN_LABELS} + keys2 = {k for k in map2.keys() if k not in SPECIAL_TOKEN_LABELS} + + combined_keys = sorted(list(keys1.union(keys2))) + id_map = { + id_: i + SPECIAL_TOKEN_IDS.user_start for i, id_ in enumerate(combined_keys) + } + + if combined_keys and isinstance(combined_keys[0], str): + id_map[SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.unknown]] = ( + SPECIAL_TOKEN_IDS.unknown + ) + id_map[SPECIAL_TOKEN_IDS.labels_by_id[SPECIAL_TOKEN_IDS.other]] = ( + SPECIAL_TOKEN_IDS.other + ) + return id_map @beartype def get_group_bounds(data_subset: pl.DataFrame, split_ratios: list[float]): - """Calculates row indices for splitting a sequence into groups. - - This function takes a DataFrame `data_subset` (which typically - contains all items for a single `sequenceId`) and calculates the - row indices to split it into multiple groups (e.g., train, val, test) - based on the provided `split_ratios`. - - Args: - data_subset: The DataFrame (for a single sequence) to split. - split_ratios: A list of floats (e.g., [0.8, 0.1, 0.1]) that - sum to 1.0, defining the relative sizes of the splits. - - Returns: - A list of `(start_index, end_index)` tuples, one for each - proportion, defining the row slices for each group. - """ + """Return per-split row bounds for one sequence.""" n = data_subset.shape[0] upper_bounds = list((np.cumsum(split_ratios) * n).astype(int)) lower_bounds = [0] + list(upper_bounds[:-1]) @@ -1560,44 +1945,29 @@ def get_group_bounds(data_subset: pl.DataFrame, split_ratios: list[float]): @beartype def process_and_write_data_pt( - data: pl.DataFrame, seq_length: int, path: str, column_types: dict[str, str] + data: pl.DataFrame, + stored_context_width: int, + path: str, + column_types: dict[str, str], ): - """Processes the sequence DataFrame and writes it to a .pt file. - - This function takes the long-format sequence DataFrame (`data`), - aggregates it by `sequenceId` and `subsequenceId`, and pivots it - so that each `inputCol` becomes its own column containing a list - of sequence items. It also extracts the `startItemPosition`. - - It then converts these lists into NumPy arrays, splits them into - `sequences` (all but last item) and `targets` (all but first item), - and converts them to PyTorch tensors along with sequence/subsequence IDs - and start positions. The final data tuple - `(sequences_dict, targets_dict, sequence_ids_tensor, subsequence_ids_tensor, start_item_positions_tensor)` - is saved to a .pt file using `torch.save`. - - Args: - data: The long-format Polars DataFrame of extracted sequences. - seq_length: The total sequence length (N). The resulting tensors - will have sequence length N-1. - path: The output file path (e.g., "data/batch_0.pt"). - column_types: A dictionary mapping column names to their - string data types, used to determine the correct torch dtype. - """ + """Write long-format sequences as packed PT tensors.""" if data.is_empty(): return - sequence_cols = [str(c) for c in range(seq_length, -1, -1)] + sequence_cols = [str(c) for c in range(stored_context_width - 1, -1, -1)] all_feature_cols = data.get_column("inputCol").unique().to_list() aggs = [ pl.concat_list(sequence_cols) .filter(pl.col("inputCol") == col_name) - .flatten() + .list.explode(keep_nulls=False, empty_as_null=False) # flatten .alias(f"seq_{col_name}") for col_name in all_feature_cols - ] + [pl.col("startItemPosition").first().alias("startItemPosition")] + ] + [ + pl.col("startItemPosition").first().alias("startItemPosition"), + pl.col("leftPadLength").first().alias("leftPadLength"), + ] aggregated_data = ( data.group_by(["sequenceId", "subsequenceId"]) @@ -1617,6 +1987,9 @@ def process_and_write_data_pt( start_item_positions_tensor = torch.tensor( aggregated_data.get_column("startItemPosition").to_numpy(), dtype=torch.int64 ) + left_pad_lengths_tensor = torch.tensor( + aggregated_data.get_column("leftPadLength").to_numpy(), dtype=torch.int64 + ) sequences_dict = {} for col_name in all_feature_cols: @@ -1637,6 +2010,7 @@ def process_and_write_data_pt( sequence_ids_tensor, subsequence_ids_tensor, start_item_positions_tensor, + left_pad_lengths_tensor, ) torch.save(data_to_save, path) @@ -1649,26 +2023,10 @@ def _write_accumulated_sequences( process_id: int, file_index_str: str, target_dir: str, - seq_length: int, + layout: StoredWindowLayout, col_types: dict[str, str], ): - """Helper to write a batch of accumulated sequences to a single .pt file. - - This function concatenates a list of sequence DataFrames and writes - the combined DataFrame to a single .pt file using - `process_and_write_data_pt`. This is used to batch multiple sequences - into fewer, larger files when `write_format` is 'pt'. - - Args: - sequences_to_write: A list of Polars DataFrames to combine and write. - split_path: The base path for the split (e.g., "data/split0.pt"). - write_format: The file format (e.g., "pt"). - process_id: The ID of the parent multiprocessing process. - file_index: The index of this file batch for this split and process. - target_dir: The temporary directory to write the file into. - seq_length: The total sequence length. - col_types: A dictionary mapping column names to their string types. - """ + """Write one accumulated sequence shard.""" if not sequences_to_write: return @@ -1680,11 +2038,63 @@ def _write_accumulated_sequences( out_path = insert_top_folder(split_path_batch_seq, target_dir) if write_format == "pt": - process_and_write_data_pt(combined_df, seq_length, out_path, col_types) + process_and_write_data_pt( + combined_df, layout.stored_context_width, out_path, col_types + ) elif write_format == "parquet": combined_df.write_parquet(out_path) +@beartype +def _extract_sequences_for_splits( + data_subset: pl.DataFrame, + sequence_id: int, + schema: Any, + layout: StoredWindowLayout, + stride_by_split: list[int], + data_columns: list[str], + split_ratios: list[float], + subsequence_start_mode: str, + split_method: str, + seed: int, +) -> dict[int, pl.DataFrame]: + """Return extracted windows for one sequence across configured splits.""" + if split_method == "within_sequence": + group_bounds = get_group_bounds(data_subset, split_ratios) + return { + i: cast_columns_to_string( + extract_sequences( + data_subset.slice(lb, ub - lb), + schema, + layout, + stride_by_split[i], + data_columns, + subsequence_start_mode, + ) + ) + for i, (lb, ub) in enumerate(group_bounds) + } + + if split_method == "between_sequence": + assigned_group = assign_sequence_to_split(sequence_id, split_ratios, seed) + sequences = {i: pl.DataFrame(schema=schema) for i in range(len(split_ratios))} + sequences[assigned_group] = cast_columns_to_string( + extract_sequences( + data_subset, + schema, + layout, + stride_by_split[assigned_group], + data_columns, + subsequence_start_mode, + ) + ) + return sequences + + raise ValueError( + "split_method must be one of 'within_sequence', 'between_sequence'" + ) + + @beartype def preprocess_batch( project_root: str, @@ -1693,7 +2103,7 @@ def preprocess_batch( batch: pl.DataFrame, schema: Any, split_paths: list[str], - seq_length: int, + layout: StoredWindowLayout, stride_by_split: list[int], data_columns: list[str], col_types: dict[str, str], @@ -1703,50 +2113,31 @@ def preprocess_batch( batches_per_file: int, subsequence_start_mode: str, merge_output: bool, + split_method: str = "within_sequence", + seed: int = 1010, ) -> None: - """Processes a batch of data. - - Args: - project_root: The path to the sequifier project directory. - data_name_root: The root name of the data file. - process_id: The id of the process. - batch: The batch of data to process. - schema: The schema for the preprocessed data. - split_paths: The paths to the output split files. - seq_length: The sequence length for the model inputs. - stride_by_split: A list of step sizes for creating subsequences. - data_columns: A list of data columns. - col_types: A dictionary containing the column types. - split_ratios: A list of floats that define the relative sizes of data splits. - target_dir: The target directory for temporary files. - write_format: The file format for the output files. - batches_per_file: The number of batches to process per file. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - """ + """Extract and write all split windows for one batch.""" sequence_ids = sorted(batch.get_column("sequenceId").unique().to_list()) if not merge_output: - # New logic for batching sequences into files for .pt format sequences_by_split = {i: [] for i in range(len(split_paths))} file_indices = {i: 0 for i in range(len(split_paths))} pad_width = len(str(math.ceil(len(sequence_ids) / batches_per_file) + 1)) for i, sequence_id in enumerate(sequence_ids): data_subset = batch.filter(pl.col("sequenceId") == sequence_id) - group_bounds = get_group_bounds(data_subset, split_ratios) - sequences = { - i: cast_columns_to_string( - extract_sequences( - data_subset.slice(lb, ub - lb), - schema, - seq_length, - stride_by_split[i], - data_columns, - subsequence_start_mode, - ) - ) - for i, (lb, ub) in enumerate(group_bounds) - } + sequences = _extract_sequences_for_splits( + data_subset, + sequence_id, + schema, + layout, + stride_by_split, + data_columns, + split_ratios, + subsequence_start_mode, + split_method, + seed, + ) for group, split_df in sequences.items(): if not split_df.is_empty(): @@ -1761,7 +2152,7 @@ def preprocess_batch( process_id, str(file_indices[group]).zfill(pad_width), target_dir, - seq_length, + layout, col_types, ) # Reset the accumulator and increment the file index @@ -1777,7 +2168,7 @@ def preprocess_batch( process_id, str(file_indices[group]).zfill(pad_width), target_dir, - seq_length, + layout, col_types, ) @@ -1785,23 +2176,22 @@ def preprocess_batch( written_files: dict[int, list[str]] = {i: [] for i in range(len(split_paths))} for i, sequence_id in enumerate(sequence_ids): data_subset = batch.filter(pl.col("sequenceId") == sequence_id) - group_bounds = get_group_bounds(data_subset, split_ratios) - sequences = { - j: cast_columns_to_string( - extract_sequences( - data_subset.slice(lb, ub - lb), - schema, - seq_length, - stride_by_split[j], - data_columns, - subsequence_start_mode, - ) - ) - for j, (lb, ub) in enumerate(group_bounds) - } + sequences = _extract_sequences_for_splits( + data_subset, + sequence_id, + schema, + layout, + stride_by_split, + data_columns, + split_ratios, + subsequence_start_mode, + split_method, + seed, + ) post_split_str = f"{process_id}-{i}" - for split_path, (group, split) in zip(split_paths, sequences.items()): + for group, split in sequences.items(): + split_path = split_paths[group] split_path_batch_seq = split_path.replace( f".{write_format}", f"-{post_split_str}.{write_format}" ) @@ -1832,35 +2222,12 @@ def preprocess_batch( def extract_sequences( data: pl.DataFrame, schema: Any, - seq_length: int, + layout: StoredWindowLayout, stride_for_split: int, columns: list[str], subsequence_start_mode: str, ) -> pl.DataFrame: - """Extracts subsequences from a DataFrame of full sequences. - - This function takes a DataFrame where each row contains all items - for a single `sequenceId`. It iterates through each `sequenceId`, - extracts all possible subsequences of `seq_length` using the - specified `stride_for_split`, calculates the starting position of each - subsequence within the original sequence, and formats them into a new, - long-format DataFrame that conforms to the provided `schema`. - - Args: - data: The input Polars DataFrame, grouped by "sequenceId". - schema: The schema for the output long-format DataFrame. - seq_length: The length of the subsequences to extract. - stride_for_split: The step size to use when sliding the window - to create subsequences. - columns: A list of the data column names (features) to extract. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - - Returns: - A new, long-format Polars DataFrame containing the extracted - subsequences, matching the provided `schema`. Includes columns - for `sequenceId`, `subsequenceId`, `startItemPosition`, `inputCol`, - and the sequence items ('0', '1', ...). - """ + """Extract long-format windows from grouped sequences.""" if data.is_empty(): return pl.DataFrame(schema=schema) @@ -1872,9 +2239,9 @@ def extract_sequences( for in_row in raw_sequences.iter_rows(named=True): in_seq_lists_only = {col: in_row[col] for col in columns} - subsequences = extract_subsequences( + subsequences, left_pad_lengths, subsequence_starts = extract_subsequences( in_seq_lists_only, - seq_length, + layout.stored_context_width, stride_for_split, columns, subsequence_start_mode, @@ -1885,12 +2252,15 @@ def extract_sequences( row = [ in_row["sequenceId"], subsequence_id, - subsequence_id * stride_for_split, + int(subsequence_starts[subsequence_id]) + - left_pad_lengths[subsequence_id], + left_pad_lengths[subsequence_id], col, ] + subseqs[subsequence_id] - if len(row) != (seq_length + 5): + expected_row_length = 5 + layout.stored_context_width + if len(row) != expected_row_length: raise RuntimeError( - f"Row length mismatch. Expected {seq_length + 5}, got {len(row)}. Row: {row}" + f"Row length mismatch. Expected {expected_row_length}, got {len(row)}. Row: {row}" ) rows.append(row) @@ -1904,35 +2274,19 @@ def extract_sequences( @beartype def get_subsequence_starts( - in_seq_length: int, - seq_length: int, + in_context_length: int, + stored_context_width: int, stride_for_split: int, subsequence_start_mode: str, ) -> np.ndarray: - """Calculates the start indices for extracting subsequences. - - This function determines the starting indices for sliding a window of - `seq_length` over an input sequence of `in_seq_length`. It aims to - use `stride_for_split`, but adjusts the step size slightly to ensure - that the windows are distributed as evenly as possible and cover the - full sequence from the beginning to the end. - - Args: - in_seq_length: The length of the original input sequence. - seq_length: The length of the subsequences to extract. - stride_for_split: The *desired* step size between subsequences. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - - Returns: - A numpy array of integer start indices for each subsequence. - """ + """Return window start indices for distribute/exact modes.""" if subsequence_start_mode not in ["distribute", "exact"]: raise ValueError( f"subsequence_start_mode must be 'distribute' or 'exact', got '{subsequence_start_mode}'" ) if subsequence_start_mode == "distribute": - last_available_start = in_seq_length - (seq_length + 1) + last_available_start = in_context_length - stored_context_width raw_starts = np.arange( 0, last_available_start + stride_for_split, stride_for_split ) @@ -1943,11 +2297,11 @@ def get_subsequence_starts( return np.unique(starts) if subsequence_start_mode == "exact": - if ((in_seq_length - 1) - seq_length) % stride_for_split != 0: + if (in_context_length - stored_context_width) % stride_for_split != 0: raise ValueError( - f"'exact' mode requires sequence length alignment, i.e. if: ((in_seq_length - 1) - seq_length) % stride_for_split == 0, {(in_seq_length -1) = }, {seq_length = }, {stride_for_split = }" + f"'exact' mode requires sequence length alignment, i.e. if: (in_context_length - stored_context_width) % stride_for_split == 0, {in_context_length = }, {stored_context_width = }, {stride_for_split = }" ) - last_possible_start = in_seq_length - (seq_length + 1) + last_possible_start = in_context_length - stored_context_width return np.arange(0, last_possible_start + 1, stride_for_split) return np.array([]) @@ -1955,43 +2309,24 @@ def get_subsequence_starts( @beartype def extract_subsequences( in_seq: dict[str, list], - seq_length: int, + stored_context_width: int, stride_for_split: int, columns: list[str], subsequence_start_mode: str, -) -> dict[str, list[list[Union[float, int]]]]: - """Extracts subsequences from a dictionary of sequence lists. - - This function takes a dictionary `in_seq` where keys are column - names and values are lists of items for a single full sequence. - It first pads the sequences with 0s at the beginning if they are - shorter than `seq_length`. Then, it calculates the subsequence - start indices using `get_subsequence_starts` and extracts all - subsequences. - - Args: - in_seq: A dictionary mapping column names to lists of items - (e.g., `{'col_A': [1, 2, 3, 4, 5], 'col_B': [6, 7, 8, 9, 10]}`). - seq_length: The length of the subsequences to extract. - stride_for_split: The desired step size between subsequences. - columns: A list of the column names (keys in `in_seq`) to process. - subsequence_start_mode: "distribute" to minimize max subsequence overlap, or "exact". - - Returns: - A dictionary mapping column names to a *list of lists*, where - each inner list is a subsequence. - """ - if not in_seq[columns[0]]: - return {col: [] for col in columns} - +) -> tuple[dict[str, list[list[Union[float, int]]]], list[int], np.ndarray]: + """Extract padded windows plus left-pad lengths from one sequence.""" in_seq_len = len(in_seq[columns[0]]) - if in_seq_len < (seq_length + 1): - pad_len = (seq_length + 1) - in_seq_len + pad_len = 0 + if in_seq_len < stored_context_width: + pad_len = stored_context_width - in_seq_len in_seq = {col: ([0] * pad_len) + in_seq[col] for col in columns} - in_seq_length = len(in_seq[columns[0]]) + in_context_length = len(in_seq[columns[0]]) subsequence_starts = get_subsequence_starts( - in_seq_length, seq_length, stride_for_split, subsequence_start_mode + in_context_length, + stored_context_width, + stride_for_split, + subsequence_start_mode, ) subsequence_starts_diff = subsequence_starts[1:] - subsequence_starts[:-1] if not np.all(subsequence_starts_diff <= stride_for_split): @@ -1999,26 +2334,20 @@ def extract_subsequences( f"Diff of {subsequence_starts = }, {subsequence_starts_diff = } larger than {stride_for_split = }" ) - return { - col: [list(in_seq[col][i : i + seq_length + 1]) for i in subsequence_starts] + result = { + col: [ + list(in_seq[col][i : i + stored_context_width]) for i in subsequence_starts + ] for col in columns } + left_pad_lengths = [pad_len] * len(subsequence_starts) + + return result, left_pad_lengths, subsequence_starts @beartype def insert_top_folder(path: str, folder_name: str) -> str: - """Inserts a directory name into a file path, just before the filename. - - Example: - `insert_top_folder("a/b/c.txt", "temp")` returns `"a/b/temp/c.txt"` - - Args: - path: The original file path. - folder_name: The name of the folder to insert. - - Returns: - The new path string with the folder inserted. - """ + """Insert folder_name before the basename.""" components = os.path.split(path) new_components = list(components[:-1]) + [folder_name] + [components[-1]] return os.path.join(*new_components) @@ -2026,30 +2355,14 @@ def insert_top_folder(path: str, folder_name: str) -> str: @beartype def cast_columns_to_string(data: pl.DataFrame) -> pl.DataFrame: - """Casts the column names of a Polars DataFrame to strings. - - This is often necessary because Polars schemas may use integers as - column names (e.g., '0', '1', '2'...) which need to be strings for - some operations. - - Args: - data: The Polars DataFrame. - - Returns: - The same DataFrame with its `columns` attribute modified. - """ + """Cast Polars column names to strings.""" data.columns = [str(col) for col in data.columns] return data @beartype def delete_files(files: Union[list[str], dict[int, list[str]]]) -> None: - """Deletes a list of files from the filesystem. - - Args: - files: A list of file paths to delete, or a dictionary - whose values are lists of file paths to delete. - """ + """Delete paths from a list or split-indexed dict.""" if isinstance(files, dict): files = [x for y in list(files.values()) for x in y] for file in files: @@ -2067,29 +2380,7 @@ def create_file_paths_for_multiple_files1( dataset_name: str, write_format: str, ) -> dict[int, list[str]]: - """Creates a dictionary of temporary file paths for a specific data file. - - This is used in the multi-file, `merge_output=True` - workflow. It generates file path names for intermediate batches - *before* they are combined. - - The naming pattern is: - `{dataset_name}-{process_id}-{file_index_str}-split{split}-{batch_id}.{write_format}` - - Args: - project_root: The path to the sequifier project directory. - target_dir: The temporary directory to place files in. - n_splits: The number of data splits. - n_batches: The number of batches created by the process. - process_id: The ID of the multiprocessing worker. - file_index_str: The index of the file being processed by this worker. - dataset_name: The root name of the dataset. - write_format: The file extension. - - Returns: - A dictionary mapping a split index (int) to a list of file paths - (str) for all batches in that split. - """ + """Return per-split temp paths for one multi-file shard.""" files = {} for split in range(n_splits): files_for_split = [ @@ -2114,27 +2405,7 @@ def create_file_paths_for_single_file( dataset_name: str, write_format: str, ) -> dict[int, list[str]]: - """Creates a dictionary of temporary file paths for a single-file run. - - This is used in the single-file, `merge_output=True` - workflow. It generates file path names for intermediate batches - created by different processes *before* they are combined. - - The naming pattern is: - `{dataset_name}-split{split}-{core_id}.{write_format}` - - Args: - project_root: The path to the sequifier project directory. - target_dir: The temporary directory to place files in. - n_splits: The number of data splits. - n_batches: The number of processes (batches) running in parallel. - dataset_name: The root name of the dataset. - write_format: The file extension. - - Returns: - A dictionary mapping a split index (int) to a list of file paths - (str) for all batches in that split. - """ + """Return per-split temp paths for one single-file run.""" files = {} for split in range(n_splits): files_for_split = [ @@ -2160,29 +2431,7 @@ def create_file_paths_for_multiple_files2( dataset_name: str, write_format: str, ) -> dict[int, list[str]]: - """Creates a dictionary of intermediate file paths for a multi-file run. - - This is used in the multi-file, `merge_output=True` - workflow. It generates the file paths for the *combined* files - from each process, which are the *inputs* to the final combination step. - - The naming pattern is: - `{dataset_name}-{process_id}-{file_index}-split{split}.{write_format}` - - Args: - project_root: The path to the sequifier project directory. - target_dir: The temporary directory where files are located. - n_splits: The number of data splits. - n_processes: The total number of multiprocessing workers. - n_files: A dictionary mapping `process_id` to the number of - files that process handled. - dataset_name: The root name of the dataset. - write_format: The file extension. - - Returns: - A dictionary mapping a split index (int) to a list of all - intermediate combined file paths (str) for that split. - """ + """Return per-split intermediate paths for multi-file merge.""" files = {} n_files_max = max(n_files.values()) if n_files else 1 pad_width = len(str(n_files_max - 1)) @@ -2214,31 +2463,7 @@ def combine_multiprocessing_outputs( pre_split_str: Optional[str] = None, post_split_str: Optional[str] = None, ) -> None: - """Combines multiple intermediate batch files into final split files. - - This function iterates through each split and combines all the - intermediate files listed in `input_files[split]` into a single - final output file for that split. - - - For "csv" format, it uses the `csvstack` command-line utility. - - For "parquet" format, it uses `pyarrow.parquet.ParquetWriter` - to concatenate the files efficiently. - - Args: - project_root: The path to the sequifier project directory. - target_dir: The temporary directory containing intermediate files. - n_splits: The number of data splits. - input_files: A dictionary mapping split index (int) to a list - of input file paths (str) for that split. - dataset_name: The root name for the final output files. - write_format: The file format ("csv" or "parquet"). - in_target_dir: If True, the final combined file is written - inside `target_dir`. If False, it's written to `data/`. - pre_split_str: An optional string to insert into the filename - before the "-split{i}" part. - post_split_str: An optional string to insert into the filename - after the "-split{i}" part. - """ + """Combine per-split intermediate files.""" for split in range(n_splits): split_file_path = create_split_file_path( project_root, @@ -2294,18 +2519,7 @@ def create_split_file_path( @beartype def combine_parquet_files(files: list[str], out_path: str) -> None: - """Combines multiple Parquet files into a single Parquet file. - - This function reads the schema from the first file and uses it to - initialize a `ParquetWriter`. It then iterates through all files in - the list, reading each one as a table and writing it to the new - combined file. This is more memory-efficient than reading all files - into one large table first. - - Args: - files: A list of paths to the Parquet files to combine. - out_path: The path for the combined output Parquet file. - """ + """Stream-concatenate Parquet files with the first file schema.""" schema = pq.ParquetFile(files[0]).schema_arrow with pq.ParquetWriter(out_path, schema=schema, compression="snappy") as writer: for file in files: diff --git a/src/sequifier/sequifier.py b/src/sequifier/sequifier.py index 54168070..ad62ec32 100644 --- a/src/sequifier/sequifier.py +++ b/src/sequifier/sequifier.py @@ -14,15 +14,7 @@ @beartype def build_args_config(args: Any) -> dict[str, Any]: - """ - Build configuration dictionary from command-line arguments. - - Args: - args: Parsed command-line arguments. - - Returns: - Dictionary containing configuration options. - """ + """Build config overrides from parsed CLI args.""" args_config = { k: v @@ -55,12 +47,7 @@ def build_args_config(args: Any) -> dict[str, Any]: @beartype def setup_parser() -> ArgumentParser: - """ - Set up the argument parser for the command-line interface. - - Returns: - Configured ArgumentParser object. - """ + """Build the sequifier CLI parser.""" parser = ArgumentParser() subparsers = parser.add_subparsers(dest="command", help="Available commands") diff --git a/src/sequifier/special_tokens.py b/src/sequifier/special_tokens.py new file mode 100644 index 00000000..d0224d1f --- /dev/null +++ b/src/sequifier/special_tokens.py @@ -0,0 +1,54 @@ +from collections.abc import Mapping +from dataclasses import asdict, dataclass +from typing import Any + + +@dataclass(frozen=True) +class SpecialTokenIds: + unknown: int = 0 + other: int = 1 + mask: int = 2 + + @property + def user_start(self) -> int: + return max(asdict(self).values()) + 1 + + @property + def labels_by_id(self) -> dict[int, str]: + return { + self.unknown: "[unknown]", + self.other: "[other]", + self.mask: "[mask]", + } + + @property + def ids_by_label(self) -> dict[str, int]: + return {label: id_ for id_, label in self.labels_by_id.items()} + + +SPECIAL_TOKEN_IDS = SpecialTokenIds() +SPECIAL_TOKEN_LABELS = frozenset(SPECIAL_TOKEN_IDS.ids_by_label.keys()) +SPECIAL_TOKEN_ID_VALUES = frozenset(SPECIAL_TOKEN_IDS.labels_by_id.keys()) + + +def validate_special_token_ids( + special_token_ids: Mapping[str, Any], + source: str = "metadata", +) -> dict[str, int]: + """Validate persisted special token IDs against runtime constants.""" + expected = SPECIAL_TOKEN_IDS.ids_by_label + + try: + normalized = {str(label): int(id_) for label, id_ in special_token_ids.items()} + except (AttributeError, TypeError, ValueError) as exc: + raise ValueError( + f"{source} special_token_ids must be a mapping from token labels to integer IDs." + ) from exc + + if normalized != expected: + raise ValueError( + f"{source} special_token_ids must match the sequifier runtime constants. " + f"Expected {expected}, found {dict(special_token_ids)}." + ) + + return normalized diff --git a/src/sequifier/train.py b/src/sequifier/train.py index e958f78c..ccdb4e11 100644 --- a/src/sequifier/train.py +++ b/src/sequifier/train.py @@ -1,20 +1,23 @@ import contextlib import copy import glob +import hashlib import json import logging import math import os +import random +import re import sys +from dataclasses import asdict os.environ["TORCH_NCCL_ASYNC_ERROR_HANDLING"] = "1" import time # noqa: E402 import uuid # noqa: E402 import warnings # noqa: E402 -from typing import Any, Optional, Union # noqa: E402 +from typing import Any, Optional, Union, cast # noqa: E402 import numpy as np # noqa: E402 -import polars as pl # noqa: E402 import torch # noqa: E402 import torch._dynamo # noqa: E402 import torch.distributed as dist # noqa: E402 @@ -22,7 +25,7 @@ from beartype import beartype # noqa: E402 from packaging import version # noqa: E402 from torch import Tensor, nn # noqa: E402 -from torch.amp import GradScaler # noqa: E402 +from torch.amp.grad_scaler import GradScaler # noqa: E402 from torch.distributed.checkpoint.state_dict import ( # noqa: E402 StateDictOptions, get_model_state_dict, @@ -39,9 +42,9 @@ ) else: from torch.distributed._composable.fsdp import ( # noqa: E402 - MixedPrecisionPolicy, - OffloadPolicy, - fully_shard, + MixedPrecisionPolicy, # type: ignore + OffloadPolicy, # type: ignore + fully_shard, # type: ignore ) from torch.distributed.device_mesh import init_device_mesh # noqa: E402 @@ -52,16 +55,22 @@ torch._dynamo.config.suppress_errors = True +ClassCounts = dict[str, Tensor] +CHECKPOINT_FORMAT_VERSION = 2 +SUPPORTED_CHECKPOINT_FORMAT_VERSIONS = {2} + from sequifier.config.train_config import TrainModel, load_train_config # noqa: E402 from sequifier.distributed.env import setup_distributed_env # noqa: E402 -from sequifier.helpers import normalize_path # noqa: E402 from sequifier.helpers import ( # noqa: E402 + apply_bert_masking, conditional_beartype, configure_determinism, configure_logger, construct_index_maps, get_torch_dtype, + normalize_path, ) +from sequifier.io.batch import SequifierBatch # noqa: E402 from sequifier.io.sequifier_dataset_from_file import ( # noqa: E402 SequifierDatasetFromFile, ) @@ -79,25 +88,35 @@ ) from sequifier.model.layers import RMSNorm, SequifierEncoderLayer # noqa: E402 from sequifier.optimizers.optimizers import get_optimizer_class # noqa: E402 +from sequifier.special_tokens import SPECIAL_TOKEN_IDS # noqa: E402 def cleanup(): - """Cleans up the distributed training environment.""" + """Destroy the active distributed process group.""" dist.destroy_process_group() @beartype -def create_dummy_data(config: TrainModel, local_rank: int) -> dict[str, Tensor]: +def create_dummy_data_and_metadata( + config: TrainModel, local_rank: int +) -> tuple[dict[str, Tensor], dict[str, Tensor]]: dummy_data = {} for col in config.input_columns: dtype = torch.int64 if col in config.categorical_columns else torch.float32 dummy_data[col] = torch.ones( - (config.training_spec.batch_size, config.seq_length), + (config.training_spec.batch_size, config.window_view.context_length), dtype=dtype, device=local_rank, ) - return dummy_data + dummy_metadata = { + "attention_valid_mask": torch.ones( + (config.training_spec.batch_size, config.window_view.context_length), + dtype=torch.bool, + device=local_rank, + ) + } + return dummy_data, dummy_metadata @beartype @@ -109,16 +128,7 @@ def train_worker( global_rank: int, torch_compile: str, ): - """The worker function for distributed training. - - Args: - rank: The rank of the current process. - world_size: The total number of processes. - config: The training configuration. - from_folder: Whether to load data from a folder (e.g., preprocessed .pt files) - or a single file (e.g., .parquet). - global_rank: The global rank - """ + """Run one local distributed-training worker.""" logger = configure_logger(config.project_root, config.model_name, global_rank) if config.training_spec.distributed: @@ -128,7 +138,6 @@ def train_worker( global_rank, local_rank, world_size, config.training_spec.backend ) - # 1. Create Datasets and DataLoaders with DistributedSampler if from_folder: if config.read_format == "pt": if config.training_spec.load_full_data_to_ram: @@ -171,6 +180,13 @@ def train_worker( train_dataset = SequifierDatasetFromFile(config.training_data_path, config) valid_dataset = SequifierDatasetFromFile(config.validation_data_path, config) + configure_determinism(config.seed, config.training_spec.enforce_determinism) + + train_loader_generator = torch.Generator() + train_loader_generator.manual_seed(config.seed + 10_001) + valid_loader_generator = torch.Generator() + valid_loader_generator.manual_seed(config.seed + 10_002) + train_loader = DataLoader( train_dataset, batch_size=None, # Batching is handled natively by the IterableDataset @@ -179,6 +195,7 @@ def train_worker( pin_memory=config.training_spec.device not in ["mps", "cpu"], prefetch_factor=4 if config.training_spec.num_workers > 0 else None, persistent_workers=(config.training_spec.num_workers > 0), + generator=train_loader_generator, ) valid_loader = DataLoader( @@ -189,11 +206,14 @@ def train_worker( pin_memory=config.training_spec.device not in ["mps", "cpu"], prefetch_factor=4 if config.training_spec.num_workers > 0 else None, persistent_workers=(config.training_spec.num_workers > 0), + generator=valid_loader_generator, ) - configure_determinism(config.seed, config.training_spec.enforce_determinism) - model = TransformerModel(config, rank=global_rank, local_rank=local_rank) + model._data_loader_generators = { + "train": train_loader_generator, + "valid": valid_loader_generator, + } base_model = model latest_model_path = model._get_latest_model_name() @@ -209,15 +229,21 @@ def train_worker( checkpoint = torch.load( latest_model_path, map_location="cpu", weights_only=False ) + model._validate_checkpoint_compatibility(checkpoint, len(train_loader)) model.load_state_dict(checkpoint["model_state_dict"]) model.optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) model.scheduler.load_state_dict(checkpoint["scheduler_state_dict"]) - if checkpoint["batch"] + 1 >= len(train_loader): - base_model.start_epoch = checkpoint["epoch"] + 1 - base_model.start_batch = 0 - else: - base_model.start_epoch = checkpoint["epoch"] - base_model.start_batch = checkpoint["batch"] + 1 + base_model.start_epoch, base_model.start_batch = _checkpoint_start_position( + checkpoint, len(train_loader) + ) + model._apply_checkpoint_training_state( + checkpoint.get("scaler_state_dict"), + checkpoint.get("best_val_loss", float("inf")), + checkpoint.get("n_epochs_no_improvement", 0), + checkpoint.get("best_model_state_dict"), + checkpoint.get("rng_state"), + checkpoint.get("data_loader_generator_states"), + ) else: model.start_epoch = 1 model.start_batch = 0 @@ -232,54 +258,78 @@ def train_worker( for i in range(len(model.layers)): model.layers[i] = torch.compile(model.layers[i]) + if checkpoint is not None: + base_model._restore_rng_state() + base_model._restore_data_loader_generator_states() + model.train_model(train_loader, valid_loader, ddp_model=None) elif config.training_spec.data_parallelism == "FSDP": mesh = init_device_mesh( "cuda", (world_size,) ) # 1D mesh for standard ZeRO-3 full sharding + model._data_parallel_group = mesh.get_group() - mp_policy = None + fsdp_kwargs = {"mesh": mesh} if config.training_spec.layer_autocast: amp_dtype = get_torch_dtype( config.training_spec.layer_type_dtypes.get("linear", "bfloat16") if config.training_spec.layer_type_dtypes else "bfloat16" ) - mp_policy = MixedPrecisionPolicy( + + fsdp_kwargs["mp_policy"] = MixedPrecisionPolicy( param_dtype=amp_dtype, reduce_dtype=amp_dtype, output_dtype=amp_dtype, ) + else: + fsdp_kwargs["mp_policy"] = MixedPrecisionPolicy() - offload_policy = ( - OffloadPolicy() if config.training_spec.fsdp_cpu_offload else None - ) + if config.training_spec.fsdp_cpu_offload: + fsdp_kwargs["offload_policy"] = OffloadPolicy() for layer in model.layers: - fully_shard( - layer, mesh=mesh, mp_policy=mp_policy, offload_policy=offload_policy - ) - fully_shard( - model, mesh=mesh, mp_policy=mp_policy, offload_policy=offload_policy - ) + fully_shard(layer, **fsdp_kwargs) + + fully_shard(model, **fsdp_kwargs) dist.barrier() params_to_optimize = model.parameters() model.initialize_optimizer(params=params_to_optimize) - if config.training_spec.continue_training and latest_model_path: + resume_signal = [ + config.training_spec.continue_training and latest_model_path is not None + if global_rank == 0 + else None + ] + dist.broadcast_object_list(resume_signal, src=0) + did_resume = cast(bool, resume_signal[0]) + + if did_resume: if global_rank == 0: + if latest_model_path is None: + raise RuntimeError("Rank 0 selected resume without a checkpoint.") checkpoint = torch.load( latest_model_path, map_location="cpu", weights_only=False ) full_msd = checkpoint["model_state_dict"] full_osd = checkpoint["optimizer_state_dict"] - - if checkpoint["batch"] + 1 >= len(train_loader): - start_epoch = checkpoint["epoch"] + 1 - start_batch = 0 - else: - start_epoch = checkpoint["epoch"] - start_batch = checkpoint["batch"] + 1 + start_epoch, start_batch = _checkpoint_start_position( + checkpoint, len(train_loader) + ) + resume_state = { + "scaler_state_dict": checkpoint.get("scaler_state_dict"), + "best_val_loss": checkpoint.get("best_val_loss", float("inf")), + "n_epochs_no_improvement": checkpoint.get( + "n_epochs_no_improvement", 0 + ), + "has_best_model_state_dict": checkpoint.get("best_model_state_dict") + is not None, + "rng_state": checkpoint.get("rng_state"), + "data_loader_generator_states": checkpoint.get( + "data_loader_generator_states" + ), + "checkpoint_metadata": checkpoint.get("checkpoint_metadata"), + } meta = [ start_epoch, @@ -287,15 +337,33 @@ def train_worker( checkpoint["scheduler_state_dict"], full_msd, full_osd, + resume_state, ] else: - meta = [None, None, None, None, None] + meta = [None, None, None, None, None, None] # Broadcast the checkpoint data to all ranks simultaneously dist.broadcast_object_list(meta, src=0) - # Unpack on all ranks - model.start_epoch, model.start_batch, sched_state, full_msd, full_osd = meta # type: ignore + # Unpack on all ranks. The placeholder Nones are replaced by broadcast. + ( + start_epoch_obj, + start_batch_obj, + sched_state_obj, + full_msd_obj, + full_osd_obj, + resume_state_obj, + ) = meta + model.start_epoch = cast(int, start_epoch_obj) + model.start_batch = cast(int, start_batch_obj) + sched_state = cast(Optional[dict[str, Any]], sched_state_obj) + full_msd = cast(dict[str, Tensor], full_msd_obj) + full_osd = cast(dict[str, Any], full_osd_obj) + resume_state = cast(dict[str, Any], resume_state_obj) + model._validate_checkpoint_compatibility( + {"checkpoint_metadata": resume_state.get("checkpoint_metadata")}, + len(train_loader), + ) options = StateDictOptions(full_state_dict=True, cpu_offload=True) @@ -314,6 +382,20 @@ def train_worker( if sched_state is not None: base_model.scheduler.load_state_dict(sched_state) + best_model_state_dict = None + if resume_state.get("has_best_model_state_dict"): + if global_rank == 0 and checkpoint is not None: + best_model_state_dict = checkpoint.get("best_model_state_dict") + else: + best_model_state_dict = {} + model._apply_checkpoint_training_state( + resume_state.get("scaler_state_dict"), + resume_state.get("best_val_loss", float("inf")), + resume_state.get("n_epochs_no_improvement", 0), + best_model_state_dict, + resume_state.get("rng_state"), + resume_state.get("data_loader_generator_states"), + ) else: model.start_epoch = 1 @@ -328,28 +410,43 @@ def train_worker( model.layers[i] = torch.compile(model.layers[i]) if config.training_spec.device.startswith("cuda"): - dummy_data = create_dummy_data(config, local_rank) + dummy_data, dummy_metadata = create_dummy_data_and_metadata( + config, local_rank + ) with torch.no_grad(): - _ = model(dummy_data, False) + _ = model(dummy_data, dummy_metadata, False) dist.barrier() + if did_resume: + base_model._restore_rng_state() + base_model._restore_data_loader_generator_states() + model.train_model(train_loader, valid_loader, ddp_model=base_model) cleanup() elif config.training_spec.data_parallelism == "DDP": # DDP + params_to_optimize = model.parameters() + model.initialize_optimizer(params=params_to_optimize) + if config.training_spec.continue_training and latest_model_path: checkpoint = torch.load( latest_model_path, map_location="cpu", weights_only=False ) + base_model._validate_checkpoint_compatibility(checkpoint, len(train_loader)) base_model.load_state_dict(checkpoint["model_state_dict"]) base_model.optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) base_model.scheduler.load_state_dict(checkpoint["scheduler_state_dict"]) - if checkpoint["batch"] + 1 >= len(train_loader): - base_model.start_epoch = checkpoint["epoch"] + 1 - base_model.start_batch = 0 - else: - base_model.start_epoch = checkpoint["epoch"] - base_model.start_batch = checkpoint["batch"] + 1 + base_model.start_epoch, base_model.start_batch = _checkpoint_start_position( + checkpoint, len(train_loader) + ) + base_model._apply_checkpoint_training_state( + checkpoint.get("scaler_state_dict"), + checkpoint.get("best_val_loss", float("inf")), + checkpoint.get("n_epochs_no_improvement", 0), + checkpoint.get("best_model_state_dict"), + checkpoint.get("rng_state"), + checkpoint.get("data_loader_generator_states"), + ) else: model.start_epoch = 1 model.start_batch = 0 @@ -357,9 +454,6 @@ def train_worker( f"[INFO] Initializing new model with {format_number(pytorch_total_params)} parameters." ) - params_to_optimize = model.parameters() - model.initialize_optimizer(params=params_to_optimize) - if config.training_spec.device.startswith("cuda"): if torch_compile == "outer": model = torch.compile(model) @@ -370,18 +464,23 @@ def train_worker( ddp_model = DDP(model, device_ids=device_ids, find_unused_parameters=False) if config.training_spec.device.startswith("cuda"): - dummy_data = create_dummy_data(config, local_rank) + dummy_data, dummy_metadata = create_dummy_data_and_metadata( + config, local_rank + ) if config.training_spec.layer_autocast: with torch.no_grad(), torch.autocast( device_type="cuda", dtype=torch.bfloat16 ): - _ = ddp_model(dummy_data, False) + _ = ddp_model(dummy_data, dummy_metadata, False) else: with torch.no_grad(): - _ = ddp_model(dummy_data, False) + _ = ddp_model(dummy_data, dummy_metadata, False) dist.barrier() + if checkpoint is not None: + base_model._restore_rng_state() + base_model._restore_data_loader_generator_states() model.train_model(train_loader, valid_loader, ddp_model=ddp_model) cleanup() else: @@ -408,12 +507,7 @@ def _mp_train_worker_wrapper( @beartype def train(args: Any, args_config: dict[str, Any]) -> None: - """The main training function. - - Args: - args: The command-line arguments. - args_config: The configuration dictionary. - """ + """Load train config and launch local or distributed training.""" config_path = args.config_path or "configs/train.yaml" config = load_train_config(config_path, args_config, args.skip_metadata) @@ -463,50 +557,109 @@ def train(args: Any, args_config: dict[str, Any]) -> None: @beartype -def format_number(number: Union[int, float, np.float32]) -> str: - """Format a number for display. +def format_number(number: int | float | np.float32) -> str: + value = float(number) + if math.isnan(value): + return "NaN" + if math.isinf(value): + return "Inf" if value > 0 else "-Inf" + return f"{value: .2e}" - Args: - number: The number to format. - Returns: - A formatted string representation of the number. - """ - if np.isnan(number): - return "NaN" - elif number == 0: - order_of_magnitude = 0 - else: - order_of_magnitude = math.floor(math.log(np.abs(number), 10)) +def _get_evaluation_loss_mask(metadata: dict[str, Tensor]) -> Tensor: + valid_mask = metadata["target_valid_mask"].bool() + + if "bert_mask" in metadata: + valid_mask = valid_mask & metadata["bert_mask"].bool() - number_adjusted = number * (10 ** (-order_of_magnitude)) - return f"{number_adjusted:5.2f}e{order_of_magnitude}" + if "sample_valid_mask" in metadata: + sample_valid_mask = metadata["sample_valid_mask"].bool() + + if sample_valid_mask.ndim != 1: + raise ValueError("sample_valid_mask must have shape [batch_size].") + if sample_valid_mask.shape[0] != valid_mask.shape[0]: + raise ValueError( + "sample_valid_mask batch dimension does not match target_valid_mask." + ) + + valid_mask = valid_mask & sample_valid_mask.unsqueeze(1) + + return valid_mask + + +@beartype +def _checkpoint_start_position( + checkpoint: dict[str, Any], num_batches: int +) -> tuple[int, int]: + """Return the next epoch/batch position after a saved checkpoint.""" + if checkpoint["batch"] + 1 >= num_batches: + return checkpoint["epoch"] + 1, 0 + return checkpoint["epoch"], checkpoint["batch"] + 1 + + +def _update_file_metadata_hash(hasher: Any, file_path: str) -> None: + """Hash file identity metadata without reading the file contents.""" + normalized_path = os.path.abspath(file_path) + file_stat = os.stat(normalized_path) + hasher.update(normalized_path.encode("utf-8")) + hasher.update(str(file_stat.st_size).encode("utf-8")) + hasher.update(str(file_stat.st_mtime_ns).encode("utf-8")) + + +@beartype +def accumulate_class_counts( + counts: ClassCounts, + output: dict[str, Tensor], + valid_mask: Tensor, + n_classes: dict[str, int], +) -> None: + """Accumulates predicted class counts over valid evaluation tokens.""" + flattened_mask = valid_mask.bool().T.contiguous().reshape(-1) + + for col, running_counts in counts.items(): + if col not in output: + raise RuntimeError(f"Output is missing class-share column {col!r}.") + + predicted_ids = output[col].argmax(dim=-1).contiguous().reshape(-1) + + if predicted_ids.numel() != flattened_mask.numel(): + raise RuntimeError( + f"Prediction/mask size mismatch for {col!r}: " + f"{predicted_ids.numel()} predictions versus " + f"{flattened_mask.numel()} mask entries." + ) + + valid_predictions = predicted_ids[flattened_mask] + + if valid_predictions.numel() == 0: + continue + + batch_counts = torch.bincount( + valid_predictions.to(torch.int64), + minlength=n_classes[col], + ) + + if batch_counts.numel() != running_counts.numel(): + raise RuntimeError( + f"Class-count size mismatch for {col!r}: " + f"{batch_counts.numel()} counts versus " + f"{running_counts.numel()} expected classes." + ) + + running_counts.add_(batch_counts) class TransformerEmbeddingModel(nn.Module): - """A wrapper around the TransformerModel to expose the embedding functionality.""" + """Embedding-only wrapper for TransformerModel.""" def __init__(self, transformer_model: "TransformerModel"): - """Initializes the TransformerEmbeddingModel. - - Args: - transformer_model: The TransformerModel to wrap. - """ super().__init__() self.transformer_model = transformer_model self.logger = self.transformer_model.logger @beartype def _copy_model(self): - """Copies the model. - - This creates a deep copy of the model, typically for saving the - "best model". It temporarily removes the `log_file` attribute - before copying to avoid errors, then re-initializes it. - - Returns: - A deep copy of the current TransformerModel instance. - """ + """Deep-copy without copying the logger handle.""" logger_ref = self.transformer_model.logger del self.transformer_model.logger del self.logger @@ -517,43 +670,35 @@ def _copy_model(self): return model_copy @conditional_beartype - def forward(self, src: dict[str, Tensor]): - """Forward pass for the embedding model. + def forward(self, src: dict[str, Tensor], metadata: dict[str, Tensor]): + """Return embedding output from the wrapped model.""" + return self.transformer_model.forward_embed(src, metadata=metadata) - Args: - src: The input data. - Returns: - The embedded output. - """ - return self.transformer_model.forward_embed(src) +class _OnnxExportWrapper(nn.Module): + def __init__( + self, + model: Union["TransformerModel", TransformerEmbeddingModel], + feature_columns: list[str], + ): + super().__init__() + self.model = model + self.feature_columns = feature_columns + def forward(self, *inputs: Tensor): + features = dict(zip(self.feature_columns, inputs[:-1])) + metadata = {"attention_valid_mask": inputs[-1]} + return self.model(features, metadata=metadata) -class TransformerModel(nn.Module): - """The main Transformer model for the sequifier. - This class implements the Transformer model, including the training and - evaluation loops, as well as the export functionality. - """ +class TransformerModel(nn.Module): + """Sequifier transformer plus train/eval/export routines.""" @beartype def __init__( self, hparams: Any, rank: Optional[int] = None, local_rank: Optional[int] = None ): - """Initializes the TransformerModel. - - Based on the hyperparameters, this initializes: - - Embeddings for categorical and real features (self.encoder) - - Positional encoders (self.pos_encoder) - - The main TransformerEncoder (self.transformer_encoder) - - Output decoders for each target column (self.decoder) - - Loss functions (self.criterion) - - Optimizer (self.optimizer) and scheduler (self.scheduler) - - Args: - hparams: The hyperparameters for the model (e.g., from TrainModel config). - rank: The rank of the current process (for distributed training). - """ + """Build model modules and training state from config.""" super().__init__() self.project_root = hparams.project_root self.model_type = "Transformer" @@ -581,7 +726,9 @@ def __init__( self.target_columns = hparams.target_columns self.target_column_types = hparams.target_column_types self.loss_weights = hparams.training_spec.loss_weights - self.seq_length = hparams.seq_length + self.storage_layout = hparams.storage_layout + self.window_view = hparams.window_view + self.context_length = hparams.window_view.context_length self.n_classes = hparams.n_classes self.inference_batch_size = hparams.inference_batch_size self.log_interval = hparams.training_spec.log_interval @@ -640,12 +787,12 @@ def __init__( self.pos_encoder = ModuleDict() for col in self.real_columns: self.pos_encoder[col] = nn.Embedding( - self.seq_length, self.feature_embedding_dims[col] + self.context_length, self.feature_embedding_dims[col] ) for col, n_classes in self.n_classes.items(): if col in self.categorical_columns: self.pos_encoder[col] = nn.Embedding( - self.seq_length, self.feature_embedding_dims[col] + self.context_length, self.feature_embedding_dims[col] ) else: self.pos_encoder = None @@ -658,7 +805,7 @@ def __init__( hparams.model_spec.n_head, hparams.model_spec.dim_feedforward, hparams.training_spec.dropout, - hparams.seq_length, + hparams.window_view.context_length, ) for _ in range(hparams.model_spec.num_layers) ] @@ -709,11 +856,20 @@ def __init__( self.batch_size = hparams.training_spec.batch_size self.accumulation_steps = hparams.training_spec.accumulation_steps - self.register_buffer( - "src_mask", - self._generate_square_subsequent_mask(self.seq_length), - persistent=False, # Optional: prevents the mask from being saved in your checkpoints - ) + if hparams.training_spec.training_objective == "causal": + self.register_buffer( + "src_mask", + self._generate_square_subsequent_mask(self.context_length), + persistent=False, # Optional: prevents the mask from being saved in your checkpoints + ) + elif hparams.training_spec.training_objective == "bert": + self.register_buffer( + "src_mask", + torch.zeros(self.context_length, self.context_length), + persistent=False, + ) + else: + pass self._init_weights() @@ -723,12 +879,9 @@ def __init__( self.save_latest_interval_minutes = ( hparams.training_spec.save_latest_interval_minutes ) - self.save_batch_interval_minutes = ( - hparams.training_spec.save_batch_interval_minutes - ) - self.save_batch_interval_minutes_val_loss = ( - hparams.training_spec.save_batch_interval_minutes_val_loss - ) + self.save_interval_minutes = hparams.training_spec.save_interval_minutes + self.save_interval_batches = hparams.training_spec.save_interval_batches + self.save_interval_val_loss = hparams.training_spec.save_interval_val_loss self.continue_training = hparams.training_spec.continue_training use_scaler = False @@ -737,6 +890,12 @@ def __init__( use_scaler = True self.scaler = GradScaler(device=self.device.split(":")[0], enabled=use_scaler) + self._resume_best_val_loss = float("inf") + self._resume_n_epochs_no_improvement = 0 + self._resume_best_model_state_dict = None + self._resume_rng_state = None + self._resume_data_loader_generator_states = None + self._data_loader_generators: dict[str, torch.Generator] = {} self._apply_layer_dtypes() @@ -744,7 +903,7 @@ def __init__( @beartype def initialize_optimizer(self, params: Any = None) -> None: - """Initializes the optimizer and scheduler.""" + """Create optimizer and scheduler from training config.""" if params is None: params = self.parameters() @@ -759,7 +918,7 @@ def initialize_optimizer(self, params: Any = None) -> None: @beartype def _apply_layer_dtypes(self) -> None: - """Casts specific layer types to configured dtypes (e.g., bfloat16, float8).""" + """Cast configured layer classes to requested dtypes.""" layer_config = self.hparams.training_spec.layer_type_dtypes if not layer_config: @@ -767,9 +926,7 @@ def _apply_layer_dtypes(self) -> None: self.logger.info(f"[INFO] Applying custom layer dtypes: {layer_config}") - # Iterate over all sub-modules and cast based on type for name, module in self.named_modules(): - # Linear Layers if isinstance(module, nn.Linear): is_decoder = any(module is m for m in self.decoder.values()) if is_decoder and "decoder" in layer_config: @@ -777,12 +934,10 @@ def _apply_layer_dtypes(self) -> None: elif "linear" in layer_config: module.to(dtype=get_torch_dtype(layer_config["linear"])) - # Embeddings elif isinstance(module, nn.Embedding) and "embedding" in layer_config: target_dtype = get_torch_dtype(layer_config["embedding"]) module.to(dtype=target_dtype) - # Normalization (RMSNorm, LayerNorm) elif isinstance(module, (nn.LayerNorm, RMSNorm)) and "norm" in layer_config: target_dtype = get_torch_dtype(layer_config["norm"]) module.to(dtype=target_dtype) @@ -795,15 +950,7 @@ def _apply_layer_dtypes(self) -> None: @beartype def _init_criterion(self, hparams: Any) -> ModuleDict: - """Initializes the criterion (loss function) for each target column. - - Args: - hparams: The hyperparameters for the model, used to find criterion names - and class weights. - - Returns: - A dictionary mapping target column names to their loss function instances. - """ + """Build unreduced per-target loss modules.""" criterion = ModuleDict() for target_column in self.target_columns: criterion_name = hparams.training_spec.criterion[target_column] @@ -833,19 +980,7 @@ def _get_feature_embedding_dims( categorical_columns: list[str], real_columns: list[str], ) -> dict[str, int]: - """Calculates the embedding dimension for each column. - - This attempts to distribute the total `embedding_size` across all - input columns. - - Args: - embedding_size: The total embedding dimension (initial_embedding_dim). - categorical_columns: List of categorical column names. - real_columns: List of real-valued column names. - - Returns: - A dictionary mapping column names to their calculated embedding dimension. - """ + """Allocate embedding dimensions across homogeneous input columns.""" if not (len(categorical_columns) + len(real_columns)) > 0: raise ValueError("No columns found") @@ -892,35 +1027,17 @@ def _get_feature_embedding_dims( @staticmethod def _generate_square_subsequent_mask(sz: int) -> Tensor: - """Generates an upper-triangular matrix of -inf, with zeros on diag. - - This is used as a mask to prevent attention to future tokens in the - transformer. - - Args: - sz: The size of the square mask (sequence length). - - Returns: - A square tensor of shape (sz, sz) with -inf in the upper triangle. - """ + """Return a causal attention mask.""" return torch.triu(torch.ones(sz, sz) * float("-inf"), diagonal=1) @staticmethod def _filter_key(dict_: dict[str, Any], key: str) -> dict[str, Any]: - """Filters a key from a dictionary. - - Args: - dict_: The dictionary to filter. - key: The key to remove. - - Returns: - A new dictionary without the specified key. - """ + """Return a copy without key.""" return {k: v for k, v in dict_.items() if k != key} @beartype def _init_weights(self) -> None: - """Initializes the weights of the model.""" + """Initialize trainable weights with the model default.""" init_std = 0.02 for col in self.categorical_columns: self.encoder[col].weight.data.normal_(mean=0.0, std=init_std) @@ -940,18 +1057,7 @@ def _init_weights(self) -> None: @conditional_beartype def _recursive_concat(self, srcs: list[Tensor]): - """Recursively concatenates a list of tensors. - - This is used to avoid device-specific limits on the number of tensors - that can be concatenated at once by breaking the operation into - smaller, recursive chunks. - - Args: - srcs: A list of tensors to concatenate along dimension 2. - - Returns: - A single tensor resulting from the recursive concatenation. - """ + """Concatenate tensors in chunks to avoid device concat limits.""" if len(srcs) <= self.device_max_concat_length: return torch.cat(srcs, 2) else: @@ -964,20 +1070,48 @@ def _recursive_concat(self, srcs: list[Tensor]): return self._recursive_concat(srcs_inner) @conditional_beartype - def forward_inner(self, src: dict[str, Tensor]) -> Tensor: - """The inner forward pass of the model. + def _build_attention_mask(self, valid_mask: Tensor, dtype: torch.dtype) -> Tensor: + batch_size, context_length = valid_mask.shape + device = valid_mask.device - This handles embedding lookup, positional encoding, and passing the - combined tensor through the transformer encoder. + expected_context_length = self.src_mask.shape[-1] + if context_length != expected_context_length: + raise ValueError( + f"valid_mask sequence length ({context_length}) must match " + f"model sequence length ({expected_context_length})." + ) + + base_mask = self.src_mask.to(device=device, dtype=dtype) + base_mask = base_mask.view(1, 1, context_length, context_length) + + invalid_keys = ~valid_mask.bool() + + padding_mask = torch.zeros( + batch_size, + 1, + 1, + context_length, + device=device, + dtype=dtype, + ) + + padding_mask = padding_mask.masked_fill( + invalid_keys[:, None, None, :], + torch.finfo(dtype).min, + ) + + return base_mask + padding_mask - Args: - src: A dictionary mapping column names to input tensors - (batch_size, seq_length). + @conditional_beartype + def _zero_padding_positions(self, x: Tensor, valid_mask: Tensor) -> Tensor: + """Zero padded query positions after attention/FFN layers.""" + return x * valid_mask[:, :, None].to(dtype=x.dtype) - Returns: - The raw output tensor from the TransformerEncoder - (seq_length, batch_size, dim_model). - """ + @conditional_beartype + def forward_inner( + self, src: dict[str, Tensor], metadata: dict[str, Tensor] + ) -> Tensor: + """Encode inputs into contextual hidden states.""" srcs = [] for col in self.categorical_columns: src_t = self.encoder[col](src[col].T) * math.sqrt( @@ -987,7 +1121,7 @@ def forward_inner(self, src: dict[str, Tensor]) -> Tensor: if not self.use_rope: pos = ( torch.arange( - 0, self.seq_length, dtype=torch.long, device=src_t.device + 0, self.context_length, dtype=torch.long, device=src_t.device ) .repeat(src_t.shape[1], 1) .T @@ -1015,7 +1149,7 @@ def forward_inner(self, src: dict[str, Tensor]) -> Tensor: if not self.use_rope: pos = ( torch.arange( - 0, self.seq_length, dtype=torch.long, device=src_t.device + 0, self.context_length, dtype=torch.long, device=src_t.device ) .repeat(src_t.shape[1], 1) .T @@ -1033,46 +1167,39 @@ def forward_inner(self, src: dict[str, Tensor]) -> Tensor: if self.joint_embedding_layer is not None: src2 = self.joint_embedding_layer(src2) - mask = self.src_mask.to(dtype=src2.dtype) + valid_mask = metadata["attention_valid_mask"].bool() # type: ignore + if valid_mask.shape != src2.shape[:2]: + raise ValueError( + f"Invalid attention mask shape: got {tuple(valid_mask.shape)}, " + f"expected {tuple(src2.shape[:2])} = (batch_size, context_length). " + "Check attention_valid_mask / leftPadLength construction." + ) + src2 = self._zero_padding_positions(src2, valid_mask) + + mask = self._build_attention_mask(valid_mask, dtype=src2.dtype) + for layer in self.layers: src2 = layer(src2, src_mask=mask) + src2 = self._zero_padding_positions(src2, valid_mask) src2 = self.final_norm(src2) + src2 = self._zero_padding_positions(src2, valid_mask) return src2.transpose(0, 1) @conditional_beartype - def forward_embed(self, src: dict[str, Tensor]) -> Tensor: - """Forward pass for the embedding model. - - This returns only the embedding from the *last* token in the sequence. - - Args: - src: A dictionary mapping column names to input tensors - (batch_size, seq_length). - - Returns: - The embedding tensor for the last token - (batch_size, dim_model). - """ - return self.forward_inner(src)[-self.prediction_length :, :, :] + def forward_embed( + self, src: dict[str, Tensor], metadata: dict[str, Tensor] + ) -> Tensor: + """Return final-step embeddings.""" + return self.forward_inner(src, metadata)[-self.prediction_length :, :, :] @conditional_beartype - def forward_train(self, src: dict[str, Tensor]) -> dict[str, Tensor]: - """Forward pass for training. - - This runs the inner forward pass and then applies the appropriate - decoder for each target column. - - Args: - src: A dictionary mapping column names to input tensors - (batch_size, seq_length). - - Returns: - A dictionary mapping target column names to their raw output - (logit) tensors (seq_length, batch_size, n_classes/1). - """ - output = self.forward_inner(src) + def forward_train( + self, src: dict[str, Tensor], metadata: dict[str, Tensor] + ) -> dict[str, Tensor]: + """Return raw decoded outputs for all target columns.""" + output = self.forward_inner(src, metadata) output = { target_column: self.decode(target_column, output) for target_column in self.target_columns @@ -1082,19 +1209,7 @@ def forward_train(self, src: dict[str, Tensor]) -> dict[str, Tensor]: @conditional_beartype def decode(self, target_column: str, output: Tensor) -> Tensor: - """Decodes the output of the transformer encoder. - - Applies the appropriate final linear layer for a given target column. - - Args: - target_column: The name of the target column to decode. - output: The raw output tensor from the TransformerEncoder - (seq_length, batch_size, dim_model). - - Returns: - The decoded output (logits or real value) for the target column - (seq_length, batch_size, n_classes/1). - """ + """Project hidden states through one target decoder.""" target_dtype = self.decoder[target_column].weight.dtype decoded = self.decoder[target_column](output.to(target_dtype)).to(torch.float32) @@ -1103,18 +1218,7 @@ def decode(self, target_column: str, output: Tensor) -> Tensor: @conditional_beartype def apply_softmax(self, target_column: str, output: Tensor) -> Tensor: - """Applies softmax to the output of the decoder. - - If the target is real, it returns the output unchanged. - If the target is categorical, it applies LogSoftmax. - - Args: - target_column: The name of the target column. - output: The decoded output tensor (logits or real value). - - Returns: - The output tensor, with LogSoftmax applied if categorical. - """ + """Apply LogSoftmax only for categorical targets.""" if target_column in self.real_columns: return output else: @@ -1122,24 +1226,13 @@ def apply_softmax(self, target_column: str, output: Tensor) -> Tensor: @conditional_beartype def forward( - self, src: dict[str, Tensor], return_logits: Union[bool, Tensor] = False + self, + src: dict[str, Tensor], + metadata: dict[str, Tensor], + return_logits: Union[bool, Tensor] = False, ) -> dict[str, Tensor]: - """The main forward pass of the model. - - This is typically used for inference/evaluation, returning the - probabilities/values for the *last* token in the sequence. - - Args: - src: A dictionary mapping column names to input tensors - (batch_size, seq_length). - return_logits: Return logits - - Returns: - A dictionary mapping target column names to their final - output (LogSoftmax probabilities or real values) for the - last token (batch_size, n_classes/1). - """ - output = self.forward_train(src) + """Return final-step logits or predictions for inference/eval.""" + output = self.forward_train(src, metadata) if return_logits: return output return { @@ -1173,14 +1266,7 @@ def _get_full_state_dict( @beartype def _check_and_terminate(self): - """Checks for an external pruning signal and terminates the process if required. - - This method looks for a specific `.prune` file generated by the Optuna orchestrator. - If running in a distributed setting, the rank 0 process checks for the file and - broadcasts a termination signal to all other ranks. If the signal is received, - the process cleans up its distributed process group, clears the GPU cache, and - gracefully exits with code 143 (SIGTERM) to allow Optuna to prune the trial. - """ + """Exit 143 when rank 0 broadcasts an Optuna prune sentinel.""" if os.getenv("SEQUIFIER_HYPERPARAMETER_SEARCH_RUN") is not None: should_prune = 0 if self.rank == 0: @@ -1209,6 +1295,262 @@ def _check_and_terminate(self): sys.exit(143) + @beartype + def _checkpoint_compatibility_metadata( + self, num_batches: Optional[int] + ) -> dict[str, Any]: + """Return resume-critical settings stored with each new checkpoint.""" + training_spec = self.hparams.training_spec + bert_spec = ( + training_spec.bert_spec.model_dump(mode="json") + if training_spec.bert_spec is not None + else None + ) + compatibility_settings = { + "model_name": self.model_name, + "read_format": self.hparams.read_format, + "num_batches": num_batches, + "batch_size": self.batch_size, + "accumulation_steps": self.accumulation_steps, + "learning_rate": training_spec.learning_rate, + "scheduler_step_on": self.scheduler_step_on, + "scheduler": dict(training_spec.scheduler), + "optimizer": dict(training_spec.optimizer), + "distributed": training_spec.distributed, + "data_parallelism": training_spec.data_parallelism, + "world_size": ( + dist.get_world_size(group=self._data_parallel_process_group()) + if self._distributed_is_initialized() + else training_spec.world_size + ), + "training_objective": training_spec.training_objective, + "seed": self.hparams.seed, + "dropout": training_spec.dropout, + "bert_spec": bert_spec, + "sampling_strategy": training_spec.sampling_strategy, + "criterion": training_spec.criterion, + "class_weights": training_spec.class_weights, + "loss_weights": training_spec.loss_weights, + "layer_type_dtypes": training_spec.layer_type_dtypes, + "layer_autocast": training_spec.layer_autocast, + "num_workers": training_spec.num_workers, + "load_full_data_to_ram": training_spec.load_full_data_to_ram, + "fsdp_cpu_offload": training_spec.fsdp_cpu_offload, + "storage_layout": asdict(self.storage_layout), + "window_view": asdict(self.window_view), + "column_types": self.hparams.column_types, + "categorical_columns": self.categorical_columns, + "real_columns": self.real_columns, + "input_columns": self.input_columns, + "target_columns": self.target_columns, + "target_column_types": self.target_column_types, + "n_classes": self.n_classes, + "id_maps": self.hparams.id_maps, + "special_token_ids": self.hparams.special_token_ids, + "model_spec": self.hparams.model_spec.model_dump(mode="json"), + } + provenance = { + "training_data_path": normalize_path( + self.hparams.training_data_path, self.project_root + ), + "validation_data_path": normalize_path( + self.hparams.validation_data_path, self.project_root + ), + "metadata_config_path": normalize_path( + self.hparams.metadata_config_path, self.project_root + ), + } + fingerprint_input = json.dumps( + compatibility_settings, sort_keys=True, default=str + ).encode("utf-8") + return { + "format_version": CHECKPOINT_FORMAT_VERSION, + "config_fingerprint": hashlib.sha256(fingerprint_input).hexdigest(), + "resume_settings": compatibility_settings, + "provenance": provenance, + } + + @beartype + def _validate_checkpoint_compatibility( + self, checkpoint: dict[str, Any], num_batches: int + ) -> None: + """Reject checkpoints whose resume-critical settings no longer match.""" + checkpoint_metadata = checkpoint.get("checkpoint_metadata") + if checkpoint_metadata is None: + self.logger.warning( + "[WARNING] Checkpoint has no compatibility metadata; " + "continuing with legacy resume behavior." + ) + return + if not isinstance(checkpoint_metadata, dict): + raise ValueError("Checkpoint compatibility metadata must be a dictionary.") + + format_version = checkpoint_metadata.get("format_version") + if format_version not in SUPPORTED_CHECKPOINT_FORMAT_VERSIONS: + raise ValueError( + "Unsupported checkpoint format version " + f"{format_version!r}; supported versions are " + f"{sorted(SUPPORTED_CHECKPOINT_FORMAT_VERSIONS)!r}." + ) + + saved_settings = checkpoint_metadata.get("resume_settings") + if not isinstance(saved_settings, dict): + raise ValueError( + "Checkpoint compatibility metadata is missing resume_settings." + ) + + current_metadata = self._checkpoint_compatibility_metadata(num_batches) + current_settings = current_metadata["resume_settings"] + mismatches = [] + for key, current_value in current_settings.items(): + saved_value = saved_settings.get(key) + if saved_value != current_value: + mismatches.append( + f"{key}: checkpoint={saved_value!r}, current={current_value!r}" + ) + + if mismatches: + mismatch_text = "; ".join(mismatches) + warnings.warn( + "Checkpoint is not identical with the current training configuration. " + "Ensure that this is the intended configuration. " + f"{mismatch_text}" + ) + + saved_fingerprint = checkpoint_metadata.get("config_fingerprint") + current_fingerprint = current_metadata["config_fingerprint"] + if saved_fingerprint != current_fingerprint: + warnings.warn( + "Checkpoint configuration fingerprint mismatch: " + f"checkpoint={saved_fingerprint!r}, current={current_fingerprint!r}" + ) + + @beartype + def _get_rng_state(self) -> dict[str, Any]: + """Capture Python, NumPy, Torch CPU, and CUDA RNG state for this rank.""" + device = torch.device(self.device) + return { + "python": random.getstate(), + "numpy": np.random.get_state(), + "torch": torch.get_rng_state(), + "cuda": torch.cuda.get_rng_state(device=device) + if device.type == "cuda" and torch.cuda.is_available() + else None, + } + + @beartype + def _collect_rng_states_for_checkpoint(self) -> Optional[list[Any]]: + """Gather per-rank RNG states on rank 0 for checkpointing.""" + rng_state = self._get_rng_state() + if not self.hparams.training_spec.distributed: + return [rng_state] + + rng_states = ( + [None] * dist.get_world_size(group=self._data_parallel_process_group()) + if self.rank == 0 + else None + ) + dist.gather_object( + rng_state, + object_gather_list=rng_states, + dst=0, + group=self._data_parallel_process_group(), + ) + return rng_states + + @beartype + def _select_rng_state_for_rank(self, rng_states: Any) -> Optional[dict[str, Any]]: + """Return this rank's saved RNG state from a checkpoint payload.""" + if rng_states is None: + return None + if isinstance(rng_states, dict): + return rng_states + if not isinstance(rng_states, list) or len(rng_states) == 0: + return None + + rank = self.rank or 0 + if rank < len(rng_states): + return rng_states[rank] + self.logger.warning( + "[WARNING] Checkpoint has no RNG state for this rank; " + "using rank 0 RNG state as a fallback." + ) + return rng_states[0] + + @beartype + def _get_data_loader_generator_states(self) -> dict[str, Tensor]: + """Capture dedicated DataLoader generator states.""" + return { + name: generator.get_state() + for name, generator in self._data_loader_generators.items() + } + + @beartype + def _restore_data_loader_generator_states(self) -> None: + """Restore dedicated DataLoader generator states when present.""" + states = self._resume_data_loader_generator_states + if states is None: + return + if not isinstance(states, dict): + self.logger.warning( + "[WARNING] Checkpoint DataLoader generator state is not a dictionary; " + "using freshly seeded DataLoader generators." + ) + return + + for name, generator in self._data_loader_generators.items(): + state = states.get(name) + if isinstance(state, Tensor): + generator.set_state(state) + + @beartype + def _apply_checkpoint_training_state( + self, + scaler_state_dict: Optional[dict[str, Any]], + best_val_loss: Any, + n_epochs_no_improvement: Any, + best_model_state_dict: Any, + rng_states: Any, + data_loader_generator_states: Any, + ) -> None: + """Restore non-model training state from a checkpoint payload.""" + if scaler_state_dict is not None: + self.scaler.load_state_dict(scaler_state_dict) + elif self.scaler.is_enabled(): + self.logger.warning( + "[WARNING] Checkpoint has no GradScaler state; " + "resuming with a freshly initialized scaler." + ) + + self._resume_best_val_loss = float(best_val_loss) + self._resume_n_epochs_no_improvement = int(n_epochs_no_improvement) + self._resume_best_model_state_dict = best_model_state_dict + self._resume_rng_state = self._select_rng_state_for_rank(rng_states) + self._resume_data_loader_generator_states = data_loader_generator_states + + @beartype + def _restore_rng_state(self) -> None: + """Apply the checkpoint RNG state after compile/warm-up work is finished.""" + rng_state = self._resume_rng_state + if rng_state is None: + self.logger.warning( + "[WARNING] Checkpoint has no RNG state; stochastic training will " + "continue from the current process RNG state." + ) + return + + random.setstate(rng_state["python"]) + np.random.set_state(rng_state["numpy"]) + torch.set_rng_state(rng_state["torch"]) + cuda_state = rng_state.get("cuda") + device = torch.device(self.device) + if ( + cuda_state is not None + and device.type == "cuda" + and torch.cuda.is_available() + ): + torch.cuda.set_rng_state(cuda_state, device=device) + @beartype def train_model( self, @@ -1216,38 +1558,32 @@ def train_model( valid_loader: DataLoader, ddp_model: Optional[nn.Module] = None, ) -> None: - """Trains the model. - - This method contains the main training loop, including epoch iteration, - validation, early stopping logic, and model saving/exporting. - - Args: - train_loader: DataLoader for the training dataset. - valid_loader: DataLoader for the validation dataset. - ddp_model: ddp model - """ + """Run epochs, validation, checkpointing, export, and interruption cleanup.""" self.logger.info(f"--- Starting Training for model: {self.model_name} ---") - best_val_loss = float("inf") - n_epochs_no_improvement = 0 + best_val_loss: float = float(self._resume_best_val_loss) + n_epochs_no_improvement = self._resume_n_epochs_no_improvement last_epoch = self.start_epoch - 1 - best_model_state = None + best_model_state = self._resume_best_model_state_dict try: self.last_latest_save_time = time.time() self.last_batch_save_time = time.time() + self.last_batch_save_global_step = (self.start_epoch - 1) * len( + train_loader + ) + self.start_batch if ( self.start_epoch == 1 and self.hparams.training_spec.calculate_validation_loss_on_initialization ): - total_loss, total_losses, output = self._evaluate( + total_loss, total_losses, class_counts = self._evaluate( valid_loader, ddp_model ) elapsed = 0.0 self._log_epoch_results( - 0, 0, elapsed, total_loss, total_losses, output, 0 + 0, 0, elapsed, total_loss, total_losses, class_counts, 0 ) for epoch in range(self.start_epoch, self.hparams.training_spec.epochs + 1): if ( @@ -1263,9 +1599,17 @@ def train_model( train_loader.dataset.set_epoch(epoch) valid_loader.dataset.set_epoch(epoch) - self._train_epoch(train_loader, valid_loader, epoch, ddp_model) + self._train_epoch( + train_loader, + valid_loader, + epoch, + ddp_model, + best_val_loss, + n_epochs_no_improvement, + best_model_state, + ) - total_loss, total_losses, output = self._evaluate( + total_loss, total_losses, class_counts = self._evaluate( valid_loader, ddp_model ) elapsed = time.time() - epoch_start_time @@ -1277,12 +1621,12 @@ def train_model( elapsed, total_loss, total_losses, - output, + class_counts, total_expected_batches, ) if total_loss < best_val_loss: - best_val_loss = total_loss + best_val_loss = float(total_loss) best_model_state = self._get_full_state_dict(ddp_model) n_epochs_no_improvement = 0 else: @@ -1302,6 +1646,10 @@ def train_model( total_loss, ddp_model=ddp_model, suffix=f"epoch-{epoch}", + best_val_loss=best_val_loss, + n_epochs_no_improvement=n_epochs_no_improvement, + best_model_state_dict=best_model_state, + num_batches=len(train_loader), ) last_epoch = epoch @@ -1313,10 +1661,8 @@ def train_model( if self.hparams.training_spec.distributed: dist.barrier() - # 1. Use a list to hold the answer so it can be broadcasted across ranks answer_list = ["n"] - # 2. Only Rank 0 prompts the user if self.rank == 0: try: answer = ( @@ -1331,11 +1677,9 @@ def train_model( except EOFError: # Handle non-interactive environments answer_list[0] = "n" - # 3. Broadcast the decision to all GPUs so they stay in sync if self.hparams.training_spec.distributed: dist.broadcast_object_list(answer_list, src=0) - # 4. If the decision is 'y', ALL ranks must participate in state dict extraction if answer_list[0] == "y": if self.rank == 0: self.logger.info("[INFO] User opted to export models.") @@ -1346,10 +1690,9 @@ def train_model( f"[INFO] Exporting 'last' model from epoch {last_epoch}..." ) - # ALL RANKS MUST EXECUTE THIS to prevent FSDP all_gather deadlocks + # FSDP state extraction is collective; only rank 0 writes the result. last_model_state = self._get_full_state_dict(ddp_model) - # ONLY Rank 0 executes the file I/O if self.rank == 0: self._export(last_model_state, "last", last_epoch) @@ -1379,8 +1722,6 @@ def train_model( ) best_model_state = last_model_state - # 2. Restrict the export saving to Rank 0 inside the _export method (which you already do) - # or guard the I/O specifically: if self.rank == 0: self._export(last_model_state, "last", last_epoch, clean=True) # type: ignore self._export(best_model_state, "best", last_epoch, clean=True) # type: ignore @@ -1396,32 +1737,44 @@ def _train_epoch( valid_loader: DataLoader, epoch: int, ddp_model: Optional[nn.Module] = None, + best_val_loss: float = float("inf"), + n_epochs_no_improvement: int = 0, + best_model_state: Optional[dict[str, Tensor]] = None, ) -> None: - """Trains the model for one epoch. - - Iterates through the training DataLoader, computes loss, performs - backpropagation, and updates model parameters. The DataLoader is expected - to yield tuples of (sequences_dict, targets_dict, sequence_ids, subsequence_ids, start_positions). - The IDs and positions are currently unused in this training loop. - - Args: - train_loader: DataLoader for the training dataset. - epoch: The current epoch number (used for logging). - """ - total_loss = 0.0 + """Run one train epoch with optional mid-epoch saves.""" + target_names = self._loss_target_names() + train_loss_sums, train_token_count = self._new_loss_accumulators(target_names) + batches_aggregated = 0 start_time = time.time() num_batches = len(train_loader) start_batch = self.start_batch self.start_batch = 0 + set_dataset_start_batch = getattr(train_loader.dataset, "set_start_batch", None) + dataset_handles_start_batch = callable(set_dataset_start_batch) + if dataset_handles_start_batch: + set_dataset_start_batch(start_batch) model_to_call = ddp_model if ddp_model is not None else self model_to_call.train() - for batch_count, (data, targets, _, _, _) in enumerate(train_loader): + for batch_offset, batch in enumerate(train_loader): + if not isinstance(batch, SequifierBatch): + raise TypeError( + "Training DataLoader must yield SequifierBatch objects, " + f"got {type(batch).__name__}." + ) + batch_count = ( + start_batch + batch_offset + if dataset_handles_start_batch + else batch_offset + ) if batch_count >= start_batch: + data = batch.inputs + targets = batch.targets + metadata = batch.metadata data = { k: v.to(self.device, non_blocking=True) for k, v in data.items() @@ -1432,6 +1785,13 @@ def _train_epoch( for k, v in targets.items() if k in self.target_column_types } + metadata = { + k: v.to(self.device, non_blocking=True) for k, v in metadata.items() + } + if self.hparams.training_spec.training_objective == "bert": + data, targets, metadata = apply_bert_masking( + data, targets, metadata, self.hparams + ) # Only use standard torch.autocast if FSDP MixedPrecision is NOT handling it natively if ( @@ -1448,19 +1808,52 @@ def _train_epoch( with torch.autocast( device_type=self.device.split(":")[0], dtype=amp_dtype ): - output = model_to_call(data, True) - loss, losses = self._calculate_loss(output, targets) + output = model_to_call( + data, metadata=metadata, return_logits=True + ) + ( + loss, + backward_components, + local_loss_sums, + local_token_count, + ) = self._calculate_training_loss(output, targets, metadata) + else: + output = model_to_call(data, metadata=metadata, return_logits=True) + ( + loss, + backward_components, + local_loss_sums, + local_token_count, + ) = self._calculate_training_loss(output, targets, metadata) + + if self.accumulation_steps is None: + accumulation_divisor = 1 else: - output = model_to_call(data, True) - loss, losses = self._calculate_loss(output, targets) + window_start = ( + batch_count // self.accumulation_steps + ) * self.accumulation_steps + accumulation_divisor = min( + self.accumulation_steps, + num_batches - window_start, + ) - self.scaler.scale(loss).backward() + backward_loss = loss / accumulation_divisor + self.scaler.scale(backward_loss).backward() + self._accumulate_loss_components( + train_loss_sums, + train_token_count, + local_loss_sums, + local_token_count, + ) - if ( + optimizer_step_due = ( self.accumulation_steps is None or (batch_count + 1) % self.accumulation_steps == 0 or (batch_count + 1) == num_batches - ): + ) + optimizer_step_performed = False + + if optimizer_step_due: self.scaler.unscale_(self.optimizer) torch.nn.utils.clip_grad_norm_(self.parameters(), 0.5) @@ -1468,212 +1861,413 @@ def _train_epoch( self.scaler.step(self.optimizer) self.scaler.update() self.optimizer.zero_grad() + optimizer_step_performed = True + + if optimizer_step_due: + if not optimizer_step_performed: + self.optimizer.zero_grad() - total_loss += loss.item() batches_aggregated += 1 if (batch_count + 1) % self.log_interval == 0: + avg_train_loss, _ = self._finalize_loss_components( + train_loss_sums, + train_token_count, + target_names, + "training", + raise_on_empty=False, + ) if self.rank == 0: learning_rate = self.scheduler.get_last_lr()[0] s_per_batch = (time.time() - start_time) / max( 1, batches_aggregated ) - avg_train_loss = total_loss / max(1, batches_aggregated) self.logger.info( - f"[INFO] Epoch {epoch:3d} | Batch {(batch_count+1):5d}/{num_batches:5d} | Loss: {format_number(avg_train_loss)} | LR: {format_number(learning_rate)} | S/Batch {format_number(s_per_batch)}" + f"[INFO] Epoch {epoch:3d} | Batch {(batch_count+1):5d}/{num_batches:5d} | Loss: {format_number(avg_train_loss.detach().cpu().item())} | LR: {format_number(learning_rate)} | S/Batch {format_number(s_per_batch)}" ) - total_loss = 0.0 + + train_loss_sums, train_token_count = self._new_loss_accumulators( + target_names + ) + if self.rank == 0: batches_aggregated = 0 self.start_batch = 0 start_time = time.time() self._check_and_terminate() - del data, targets, output, loss, losses + del data, targets, output, loss, backward_loss, backward_components - if self.scheduler_step_on == "batch": + if self.scheduler_step_on == "batch" and optimizer_step_performed: if ( not hasattr(self.scheduler, "total_steps") or self.scheduler.last_epoch < self.scheduler.total_steps ): self.scheduler.step() - should_save_latest = torch.tensor( - [0], dtype=torch.int32, device=self.device - ) - should_save_batch = torch.tensor( - [0], dtype=torch.int32, device=self.device - ) - val_loss_batch = torch.tensor( - [np.float32(np.nan)], dtype=torch.float32, device=self.device - ) + if optimizer_step_due: + should_save_latest = torch.tensor( + [0], dtype=torch.int32, device=self.device + ) + should_save_batch = torch.tensor( + [0], dtype=torch.int32, device=self.device + ) + val_loss_batch = torch.tensor( + [np.float32(np.nan)], dtype=torch.float32, device=self.device + ) - current_time = time.time() + current_time = time.time() + elapsed_since_batch_save = current_time - self.last_batch_save_time + current_global_step = (epoch - 1) * num_batches + (batch_count + 1) + batches_since_batch_save = ( + current_global_step - self.last_batch_save_global_step + ) - if not self.hparams.training_spec.distributed or self.rank == 0: - if self.save_latest_interval_minutes is not None and ( - current_time - self.last_latest_save_time - ) >= (self.save_latest_interval_minutes * 60): - current_time = time.time() - should_save_latest[0] = 1 - self.last_latest_save_time = current_time + if not self.hparams.training_spec.distributed or self.rank == 0: + if self.save_latest_interval_minutes is not None and ( + current_time - self.last_latest_save_time + ) >= (self.save_latest_interval_minutes * 60): + should_save_latest[0] = 1 - if self.save_batch_interval_minutes is not None and ( - current_time - self.last_batch_save_time - ) >= (self.save_batch_interval_minutes * 60): - should_save_batch[0] = 1 - self.last_batch_save_time = current_time + if self.save_interval_minutes is not None and ( + elapsed_since_batch_save + ) >= (self.save_interval_minutes * 60): + should_save_batch[0] = 1 - if self.hparams.training_spec.distributed: - dist.broadcast(should_save_latest, src=0) - dist.broadcast(should_save_batch, src=0) - dist.barrier() - - if should_save_batch.item() == 1: - if self.save_batch_interval_minutes_val_loss: - val_loss, val_losses, output = self._evaluate( - valid_loader, ddp_model - ) + if ( + self.save_interval_batches is not None + and batches_since_batch_save >= self.save_interval_batches + ): + should_save_batch[0] = 1 - if not self.hparams.training_spec.distributed or self.rank == 0: - current_global_step = (epoch - 1) * num_batches + ( - batch_count + 1 - ) - self._log_epoch_results( - 0, - batch_count + 1, - (current_time - self.last_batch_save_time), - val_loss, - val_losses, - output, - current_global_step, - ) - val_loss_batch[0] = float(val_loss) - self._check_and_terminate() - else: - val_loss_batch[0] = np.float32(np.nan) + if self.hparams.training_spec.distributed: + dist.broadcast(should_save_latest, src=0) + dist.broadcast(should_save_batch, src=0) + dist.barrier() - if self.hparams.training_spec.distributed: - dist.broadcast(val_loss_batch, src=0) + if should_save_batch.item() == 1: + if self.save_interval_val_loss: + val_loss, val_losses, class_counts = self._evaluate( + valid_loader, ddp_model + ) - if should_save_latest.item() == 1: - self._save( - epoch, - batch_count, - np.float32(np.nan), - ddp_model, - suffix="latest", - ) - if self.rank != 0: + if ( + not self.hparams.training_spec.distributed + or self.rank == 0 + ): + self._log_epoch_results( + 0, + batch_count + 1, + elapsed_since_batch_save, + val_loss, + val_losses, + class_counts, + current_global_step, + ) + val_loss_batch[0] = float(val_loss) + self._check_and_terminate() + else: + val_loss_batch.fill_(torch.nan) + + if self.hparams.training_spec.distributed: + dist.broadcast(val_loss_batch, src=0) + + if should_save_latest.item() == 1: + self._save( + epoch, + batch_count, + np.float32(np.nan), + ddp_model, + suffix="latest", + best_val_loss=best_val_loss, + n_epochs_no_improvement=n_epochs_no_improvement, + best_model_state_dict=best_model_state, + num_batches=num_batches, + ) self.last_latest_save_time = time.time() - val_loss = np.float32(val_loss_batch.item()) - if should_save_batch.item() != 0: - self._save( - epoch, - batch_count, - val_loss, # type: ignore - ddp_model, - suffix=f"epoch-{epoch}-batch-{batch_count + 1}", - ) - if self.rank != 0: + val_loss = np.float32(val_loss_batch.item()) + if should_save_batch.item() != 0: + self._save( + epoch, + batch_count, + val_loss, # type: ignore + ddp_model, + suffix=f"epoch-{epoch}-batch-{batch_count + 1}", + best_val_loss=best_val_loss, + n_epochs_no_improvement=n_epochs_no_improvement, + best_model_state_dict=best_model_state, + num_batches=num_batches, + ) self.last_batch_save_time = time.time() + self.last_batch_save_global_step = current_global_step + + if dataset_handles_start_batch: + set_dataset_start_batch(0) @beartype def _calculate_loss( - self, output: dict[str, Tensor], targets: dict[str, Tensor] + self, + output: dict[str, Tensor], + targets: dict[str, Tensor], + metadata: dict[str, Tensor], ) -> tuple[Tensor, dict[str, Tensor]]: - """Calculates the loss for the given output and targets. - - Compares the model's output (from `forward_train`) with the target - values, applying the appropriate criterion for each target column - and combining them using loss weights. - - Args: - output: A dictionary of output tensors from the model - (seq_length, batch_size, n_classes/1). - targets: A dictionary of target tensors - (batch_size, seq_length). - - Returns: - A tuple containing: - - The total combined (weighted) loss as a single Tensor. - - A dictionary of individual (unweighted) loss Tensors for each - target column. - """ - mask_col = next( - ( - col - for col in targets.keys() - if self.target_column_types[col] == "categorical" - ), - list(targets.keys())[0], + """Return backward-scaled loss and components for the current rank.""" + loss, backward_components, _, _ = self._calculate_training_loss( + output, targets, metadata ) + return loss, backward_components - if self.target_column_types[mask_col] == "real": - seq_mask_2d = (targets[mask_col] != 0.0).long().cumsum(dim=1) > 0 - else: - seq_mask_2d = targets[mask_col] != 0 + @beartype + def _calculate_training_loss( + self, + output: dict[str, Tensor], + targets: dict[str, Tensor], + metadata: dict[str, Tensor], + ) -> tuple[Tensor, dict[str, Tensor], dict[str, Tensor], Tensor]: + """Return the normalized backward loss plus local metric primitives.""" + target_names = self._loss_target_names(targets) + if not target_names: + raise RuntimeError("Loss calculation failed; no target columns were found.") + + valid_mask = metadata["target_valid_mask"].bool() # type: ignore + if "bert_mask" in metadata: + valid_mask = valid_mask & metadata["bert_mask"].bool() + + local_sums, local_count = self._calculate_local_loss_components( + output, targets, valid_mask + ) + global_count = local_count.detach().clone() + gradient_average_factor = self._gradient_reduction_factor() + + if gradient_average_factor > 1: + dist.all_reduce( + global_count, + op=dist.ReduceOp.SUM, + group=self._data_parallel_process_group(), + ) - mask = seq_mask_2d.T.contiguous().reshape(-1) + loss = None + backward_components = {} + denominator = global_count.clamp_min(1) + for target_column in target_names: + denominator_for_sum = denominator.to(dtype=local_sums[target_column].dtype) + backward_components[target_column] = ( + local_sums[target_column] + * self._loss_weight(target_column) + * gradient_average_factor + / denominator_for_sum + ) + if loss is None: + loss = backward_components[target_column].clone() + else: + loss += backward_components[target_column] - losses = {} - for target_column in targets.keys(): + if loss is None: + raise RuntimeError( + "Loss calculation failed; no loss tensors were generated." + ) + + return loss, backward_components, local_sums, local_count + + @beartype + def _calculate_local_loss_components( + self, + output: dict[str, Tensor], + targets: dict[str, Tensor], + valid_mask: Tensor, + ) -> tuple[dict[str, Tensor], Tensor]: + """Return unweighted, unnormalized local loss sums and one token count.""" + target_names = self._loss_target_names(targets) + if not target_names: + raise RuntimeError("Loss calculation failed; no target columns were found.") + + mask = valid_mask.bool().T.contiguous().reshape(-1) + token_count = mask.sum(dtype=torch.int64) + + loss_sums = {} + for target_column in target_names: target_column_type = self.target_column_types[target_column] if target_column_type == "categorical": - output[target_column] = ( + output_tensor = ( output[target_column] .float() .reshape(-1, self.n_classes[target_column]) ) elif target_column_type == "real": - output[target_column] = ( + output_tensor = ( output[target_column].to(dtype=torch.float32).reshape(-1) ) + else: + raise ValueError( + f"Target column type {target_column_type} not in ['categorical', 'real']" + ) target_tensor = targets[target_column].T.contiguous().reshape(-1) if self.target_column_types[target_column] == "real": - target_tensor = target_tensor.to(dtype=output[target_column].dtype) + target_tensor = target_tensor.to(dtype=output_tensor.dtype) + + raw_loss = self.criterion[target_column](output_tensor, target_tensor) + if raw_loss.numel() != mask.numel(): + raise RuntimeError( + "Loss/mask size mismatch for target column " + f"{target_column!r}: loss has {raw_loss.numel()} elements " + f"but mask has {mask.numel()}." + ) + current_mask = mask.to(dtype=raw_loss.dtype) - raw_loss = self.criterion[target_column]( - output[target_column], target_tensor - ) + loss_sums[target_column] = (raw_loss * current_mask).sum() - current_mask = mask.to(dtype=raw_loss.dtype) + return loss_sums, token_count - losses[target_column] = (raw_loss * current_mask).sum() / ( - current_mask.sum() + 1e-9 - ) + @beartype + def _calculate_loss_components( + self, + output: dict[str, Tensor], + targets: dict[str, Tensor], + valid_mask: Tensor, + ) -> tuple[dict[str, Tensor], Tensor]: + """Return detached local loss sums and one shared token count for metrics.""" + loss_sums, token_count = self._calculate_local_loss_components( + output, targets, valid_mask + ) + return ( + { + col: loss_sum.detach().to(dtype=self._metric_float_dtype()) + for col, loss_sum in loss_sums.items() + }, + token_count.detach(), + ) - loss = None - for target_column in targets.keys(): - losses[target_column] = losses[target_column] * ( - self.loss_weights[target_column] - if self.loss_weights is not None - else 1.0 + @beartype + def _metric_float_dtype(self) -> torch.dtype: + """Return the highest precision floating dtype supported by this device.""" + if torch.device(self.device).type == "mps": + return torch.float32 + return torch.float64 + + @beartype + def _loss_target_names( + self, targets: Optional[dict[str, Tensor]] = None + ) -> list[str]: + """Return configured target columns in stable training-config order.""" + configured_targets = getattr( + self, "target_columns", list(self.target_column_types.keys()) + ) + if targets is not None: + missing_targets = [ + col + for col in configured_targets + if col in self.target_column_types and col not in targets + ] + if missing_targets: + raise RuntimeError(f"Missing target columns: {sorted(missing_targets)}") + + return [col for col in configured_targets if col in self.target_column_types] + + @beartype + def _loss_weight(self, target_column: str) -> float: + """Return the configured scalar loss weight for a target column.""" + if self.loss_weights is None: + return 1.0 + return float(self.loss_weights[target_column]) + + @beartype + def _distributed_is_initialized(self) -> bool: + """Return whether torch.distributed collectives are currently usable.""" + return dist.is_available() and dist.is_initialized() + + @beartype + def _data_parallel_process_group(self) -> Optional[dist.ProcessGroup]: + """Return the process group used by the data-parallel reducer.""" + return getattr(self, "_data_parallel_group", None) + + @beartype + def _gradient_reduction_factor(self) -> int: + """Return the gradient multiplier needed before averaged reducers run.""" + if not self._distributed_is_initialized(): + return 1 + + training_spec = getattr(getattr(self, "hparams", None), "training_spec", None) + data_parallelism = getattr(training_spec, "data_parallelism", None) + if data_parallelism in {"DDP", "FSDP"}: + return dist.get_world_size(group=self._data_parallel_process_group()) + + return 1 + + @beartype + def _new_loss_accumulators( + self, target_names: list[str] + ) -> tuple[dict[str, Tensor], Tensor]: + """Create detached sum/count accumulators for logging or validation.""" + dtype = self._metric_float_dtype() + return ( + { + col: torch.zeros((), device=self.device, dtype=dtype) + for col in target_names + }, + torch.zeros((), device=self.device, dtype=dtype), + ) + + @beartype + def _accumulate_loss_components( + self, + sums: dict[str, Tensor], + count: Tensor, + batch_sums: dict[str, Tensor], + batch_count: Tensor, + ) -> None: + """Accumulate detached local unweighted loss sums and token counts.""" + for col in batch_sums: + sums[col] = sums[col] + batch_sums[col].detach().to( + device=sums[col].device, + dtype=sums[col].dtype, ) - if loss is None: - loss = losses[target_column].clone() - else: - loss += losses[target_column] + count += batch_count.detach().to(device=count.device, dtype=count.dtype) - if loss is None: - raise RuntimeError( - "Loss calculation failed; no loss tensors were generated." + @beartype + def _finalize_loss_components( + self, + sums: dict[str, Tensor], + count: Tensor, + target_names: list[str], + label: str, + raise_on_empty: bool = True, + ) -> tuple[Tensor, dict[str, Tensor]]: + """Reduce local loss sums/counts and return weighted token means.""" + packed = torch.stack([sums[col] for col in target_names] + [count]) + + if self._distributed_is_initialized(): + dist.all_reduce( + packed, + op=dist.ReduceOp.SUM, + group=self._data_parallel_process_group(), ) - return loss, losses + n_targets = len(target_names) + reduced_sums = dict(zip(target_names, packed[:n_targets])) + reduced_count = packed[n_targets] - @beartype - def _copy_model(self): - """Copies the model. + if reduced_count.detach().cpu().item() == 0: + if raise_on_empty: + raise RuntimeError(f"No valid {label} tokens found.") + + dtype = self._metric_float_dtype() + losses = { + col: torch.zeros((), device=self.device, dtype=dtype) + for col in target_names + } + return torch.zeros((), device=self.device, dtype=dtype), losses - This creates a deep copy of the model, typically for saving the - "best model". It temporarily removes the `log_file` attribute - before copying to avoid errors, then re-initializes it. + losses = {} + total = torch.zeros((), device=self.device, dtype=self._metric_float_dtype()) + for col in target_names: + losses[col] = reduced_sums[col] / reduced_count * self._loss_weight(col) + total = total + losses[col] + return total, losses - Returns: - A deep copy of the current TransformerModel instance. - """ + @beartype + def _copy_model(self): + """Deep-copy without copying the logger handle.""" logger_ref = self.logger del self.logger model_copy = copy.deepcopy(self) @@ -1683,20 +2277,7 @@ def _copy_model(self): @beartype def _transform_val(self, col: str, val: Tensor) -> Tensor: - """ "Transforms input data to match the format of model output. - - This is used *only* for calculating the baseline loss, where - the input (e.g., categorical indices) needs to be one-hot encoded - to be comparable to the model's (logit) output. - - Args: - col: The name of the column being transformed. - val: The input tensor (categorical indices). - - Returns: - A tensor transformed to be compatible with the loss function - (e.g., one-hot encoded). - """ + """Transform targets into baseline-loss output shape.""" if self.target_column_types[col] == "categorical": target_dtype = self.decoder[col].weight.dtype return ( @@ -1712,199 +2293,244 @@ def _transform_val(self, col: str, val: Tensor) -> Tensor: @beartype def _evaluate( self, valid_loader: DataLoader, ddp_model: Optional[nn.Module] = None - ) -> tuple[np.float32, dict[str, np.float32], dict[str, Tensor]]: - """Evaluates the model on the validation set. - - Iterates through the validation data, calculates the total loss, - and aggregates results across all processes if in distributed mode. - Also calculates a one-time baseline loss on the first call. - The DataLoader is expected to yield tuples of - (sequences_dict, targets_dict, sequence_ids, subsequence_ids, start_positions). - The IDs and positions are currently unused during evaluation. - - Args: - valid_loader: DataLoader for the validation dataset. - ddp_model: DDP model - - Returns: - A tuple containing: - - The total aggregated validation loss (float). - - A dictionary of aggregated losses for each target column (dict[str, float]). - - The output tensor dictionary from the last batch (used for class share logging). - """ - - total_loss_collect = [] - # Initialize a dict to hold lists of losses for each target - total_losses_collect = {col: [] for col in self.target_columns} - output = {} # for type checking + ) -> tuple[np.float32, dict[str, np.float32], ClassCounts]: + """Evaluate validation loss and optional class-share counts.""" model_to_call = ddp_model if ddp_model is not None else self + target_names = self._loss_target_names() + class_count_columns = list(dict.fromkeys(self.class_share_log_columns)) + + for col in class_count_columns: + missing_class_ids = [ + class_id + for class_id in range(self.n_classes[col]) + if class_id not in self.index_maps[col] + ] + if missing_class_ids: + raise ValueError( + f"Class-share column {col!r} is missing index-map entries " + f"for class IDs {missing_class_ids}." + ) + local_class_counts: ClassCounts = { + col: torch.zeros( + self.n_classes[col], + dtype=torch.int64, + device=self.device, + ) + for col in class_count_columns + } + + was_training = model_to_call.training model_to_call.eval() - with torch.no_grad(): - for data, targets, _, _, _ in valid_loader: - # Move data to the current process's assigned GPU - data = { - k: v.to(self.device, non_blocking=True) - for k, v in data.items() - if k in self.input_columns - } - targets = { - k: v.to(self.device, non_blocking=True) - for k, v in targets.items() - if k in self.target_column_types - } + try: + total_loss_sums, total_loss_count = self._new_loss_accumulators( + target_names + ) - if ( - self.hparams.training_spec.layer_autocast - and self.hparams.training_spec.data_parallelism != "FSDP" - ): - amp_dtype = get_torch_dtype( - self.hparams.training_spec.layer_type_dtypes.get( - "linear", "bfloat16" + with torch.no_grad(): + for batch_idx, batch in enumerate(valid_loader): + if not isinstance(batch, SequifierBatch): + raise TypeError( + "Validation DataLoader must yield SequifierBatch objects, " + f"got {type(batch).__name__}." + ) + data = batch.inputs + targets = batch.targets + metadata = batch.metadata + # Move data to the current process's assigned GPU + data = { + k: v.to(self.device, non_blocking=True) + for k, v in data.items() + if k in self.input_columns + } + targets = { + k: v.to(self.device, non_blocking=True) + for k, v in targets.items() + if k in self.target_column_types + } + metadata = { + k: v.to(self.device, non_blocking=True) + for k, v in metadata.items() + } + if self.hparams.training_spec.training_objective == "bert": + data, targets, metadata = apply_bert_masking( + data, + targets, + metadata, + self.hparams, + eval_seed=self.hparams.seed + batch_idx, ) - if self.hparams.training_spec.layer_type_dtypes - else "bfloat16" - ) - with torch.autocast( - device_type=self.device.split(":")[0], dtype=amp_dtype - ): - output = model_to_call(data, True) - loss, losses = self._calculate_loss(output, targets) - else: - output = model_to_call(data, True) - loss, losses = self._calculate_loss(output, targets) - - total_loss_collect.append(loss.item()) - for col, loss in losses.items(): - total_losses_collect[col].append(loss.item()) - # Free up GPU memory - del data, targets, loss, losses - if self.device == "cuda": - torch.cuda.empty_cache() + valid_mask = _get_evaluation_loss_mask(metadata) - if len(total_loss_collect) > 0: - total_loss_local = np.mean(total_loss_collect) - total_losses_local = { - col: np.mean(loss_list) - for col, loss_list in total_losses_collect.items() - } - else: - # Handle empty validation set case - total_loss_local = 0.0 - total_losses_local = {col: 0.0 for col in self.target_columns} + if ( + self.hparams.training_spec.layer_autocast + and self.hparams.training_spec.data_parallelism != "FSDP" + ): + amp_dtype = get_torch_dtype( + self.hparams.training_spec.layer_type_dtypes.get( + "linear", "bfloat16" + ) + if self.hparams.training_spec.layer_type_dtypes + else "bfloat16" + ) + with torch.autocast( + device_type=self.device.split(":")[0], dtype=amp_dtype + ): + output = model_to_call( + data, metadata=metadata, return_logits=True + ) + loss_sums, token_counts = self._calculate_loss_components( + output, targets, valid_mask + ) + else: + output = model_to_call( + data, metadata=metadata, return_logits=True + ) + loss_sums, token_counts = self._calculate_loss_components( + output, targets, valid_mask + ) - # 2. Aggregate losses across all GPUs if in distributed mode - if self.hparams.training_spec.distributed: - # Put local losses into tensors for reduction - total_loss_tensor = torch.tensor( - total_loss_local, device=self.device, dtype=torch.float32 - ) + self._accumulate_loss_components( + total_loss_sums, + total_loss_count, + loss_sums, + token_counts, + ) + accumulate_class_counts( + local_class_counts, + output, + valid_mask, + self.n_classes, + ) - # Ensure consistent order for the losses tensor - loss_keys = sorted(total_losses_local.keys()) - losses_values = [total_losses_local[k] for k in loss_keys] - losses_tensor = torch.tensor( - losses_values, device=self.device, dtype=torch.float32 + total_loss_global, total_losses_global = self._finalize_loss_components( + total_loss_sums, total_loss_count, target_names, "validation" ) - # Sum losses from all processes. The result is broadcast back to all processes. - dist.all_reduce(total_loss_tensor, op=dist.ReduceOp.SUM) - dist.all_reduce(losses_tensor, op=dist.ReduceOp.SUM) - - world_size = dist.get_world_size() - total_loss_tensor /= world_size - losses_tensor /= world_size - - # Update local variables with the aggregated global results - total_loss_global = total_loss_tensor.cpu().numpy() - losses_global_values = losses_tensor.cpu().numpy() - total_losses_global = dict(zip(loss_keys, losses_global_values)) - else: - # If not distributed, local losses are the global losses - total_loss_global = total_loss_local - total_losses_global = total_losses_local - - # 3. Handle one-time baseline loss calculation (must also be synchronized) - if not hasattr(self, "baseline_loss"): - baseline_loss_local_collect = [] - baseline_losses_local_collect = {col: [] for col in self.target_columns} - - # Iterate over the sharded validation loader - for data, targets, _, _, _ in valid_loader: - data = { - k: v.to(self.device, non_blocking=True) - for k, v in data.items() - if k in self.input_columns - } - targets = { - k: v.to(self.device, non_blocking=True) - for k, v in targets.items() - if k in self.target_column_types - } - - pseudo_output = {} - targets_for_baseline = {} - for col in self.target_columns: - if col in data: - pseudo_output[col] = self._transform_val( - col, data[col].transpose(0, 1) - ) - targets_for_baseline[col] = targets[col] - - if len(pseudo_output) > 0: - loss, losses = self._calculate_loss( - pseudo_output, targets_for_baseline + if self._distributed_is_initialized(): + for col in class_count_columns: + dist.all_reduce( + local_class_counts[col], + op=dist.ReduceOp.SUM, + group=self._data_parallel_process_group(), ) - baseline_loss_local_collect.append(loss.item()) - for col, loss_ in losses.items(): - baseline_losses_local_collect[col].append(loss_.item()) - - # Sum the losses for the local shard - if len(baseline_loss_local_collect): - baseline_loss_local = np.mean(baseline_loss_local_collect) - baseline_losses_local = { - col: np.mean(loss_list) - for col, loss_list in baseline_losses_local_collect.items() - } - else: - baseline_loss_local = -1.0 - baseline_losses_local = {col: -1.0 for col in self.target_columns} - # Broadcast the baseline values from the main process to all others - if self.hparams.training_spec.distributed: - total_loss_tensor = torch.tensor( - baseline_loss_local, device=self.device, dtype=torch.float32 + # Handle one-time baseline loss calculation with the same aggregation semantics. + if not hasattr(self, "baseline_loss"): + baseline_loss_sums, baseline_loss_count = self._new_loss_accumulators( + target_names ) - dist.all_reduce(total_loss_tensor, op=dist.ReduceOp.SUM) - loss_keys = sorted(baseline_losses_local.keys()) - losses_values = [baseline_losses_local[k] for k in loss_keys] - losses_tensor = torch.tensor( - losses_values, device=self.device, dtype=torch.float32 - ) - dist.all_reduce(losses_tensor, op=dist.ReduceOp.SUM) - world_size = dist.get_world_size() - total_loss_tensor /= world_size - losses_tensor /= world_size + with torch.no_grad(): + for batch_idx, batch in enumerate(valid_loader): + if not isinstance(batch, SequifierBatch): + raise TypeError( + "Validation DataLoader must yield SequifierBatch objects, " + f"got {type(batch).__name__}." + ) + data = batch.inputs + targets = batch.targets + metadata = batch.metadata + data = { + k: v.to(self.device, non_blocking=True) + for k, v in data.items() + if k in self.input_columns + } + targets = { + k: v.to(self.device, non_blocking=True) + for k, v in targets.items() + if k in self.target_column_types + } + metadata = { + k: v.to(self.device, non_blocking=True) + for k, v in metadata.items() + } + + if self.hparams.training_spec.training_objective == "bert": + _, _, metadata = apply_bert_masking( + data, + targets, + metadata, + self.hparams, + eval_seed=self.hparams.seed + batch_idx, + ) - self.baseline_loss = total_loss_tensor.item() - self.baseline_losses = dict(zip(loss_keys, losses_tensor.cpu().numpy())) - else: - # If not distributed, local is global - self.baseline_loss = baseline_loss_local - self.baseline_losses = baseline_losses_local + valid_mask = _get_evaluation_loss_mask(metadata) + + pseudo_output = {} + targets_for_baseline = {} + for col in self.target_columns: + if col in targets: + if ( + self.hparams.training_spec.training_objective + == "causal" + ): + pseudo_output[col] = self._transform_val( + col, data[col].transpose(0, 1) + ) + elif ( + self.hparams.training_spec.training_objective + == "bert" + ): + shifted_targets = torch.roll( + targets[col], shifts=1, dims=1 + ) + + if self.target_column_types[col] == "categorical": + shifted_targets[:, 0] = ( + SPECIAL_TOKEN_IDS.unknown + ) + else: + shifted_targets[:, 0] = 0.0 + pseudo_output[col] = self._transform_val( + col, shifted_targets.transpose(0, 1) + ) + else: + raise ValueError("Impossible") + targets_for_baseline[col] = targets[col] + + if len(pseudo_output) > 0: + loss_sums, token_counts = self._calculate_loss_components( + pseudo_output, + targets_for_baseline, + valid_mask, + ) + self._accumulate_loss_components( + baseline_loss_sums, + baseline_loss_count, + loss_sums, + token_counts, + ) - model_to_call.train() - torch.clear_autocast_cache() + baseline_loss, baseline_losses = self._finalize_loss_components( + baseline_loss_sums, + baseline_loss_count, + target_names, + "baseline validation", + ) + self.baseline_loss = baseline_loss.detach().cpu().item() + self.baseline_losses = { + col: loss.detach().cpu().item() + for col, loss in baseline_losses.items() + } - return ( - np.float32(total_loss_global), - {k: np.float32(v) for k, v in total_losses_global.items()}, - output, - ) + return ( + np.float32(total_loss_global.detach().cpu().item()), + { + k: np.float32(v.detach().cpu().item()) + for k, v in total_losses_global.items() + }, + { + col: counts.detach().cpu() + for col, counts in local_class_counts.items() + }, + ) + finally: + model_to_call.train(was_training) + torch.clear_autocast_cache() @beartype def _export( @@ -1914,16 +2540,7 @@ def _export( epoch: int, clean: bool = False, ) -> None: - """Exports the model. - - This is a wrapper function that handles exporting the model (and - optionally the embedding-only model) on rank 0 only. - - Args: - state_dict: The state dict of the model instance to export (e.g., best model or last model). - suffix: A string suffix to append to the model filename (e.g., "best", "last"). - epoch: The current epoch number, included in the filename. - """ + """Export configured model variants from rank 0.""" if self.rank != 0: return @@ -1953,16 +2570,9 @@ def _export_model( suffix: str, epoch: int, ) -> None: - """Exports the model to ONNX and/or PyTorch format. - - Saves the model weights as a .pt file and/or exports the model - graph and weights as an .onnx file based on the config. + """Write one model as ONNX and/or PT.""" + os.makedirs(os.path.join(self.project_root, "models"), exist_ok=True) - Args: - model: The model instance (TransformerModel or TransformerEmbeddingModel). - suffix: A string suffix for the filename (e.g., "best", "last-embedding"). - epoch: The current epoch number, included in the filename. - """ if self.export_onnx: is_different_type = any( p.dtype in [torch.float16, torch.bfloat16, torch.float64] @@ -1981,28 +2591,38 @@ def _export_model( x_cat = { col: torch.randint( - 0, self.n_classes[col], (self.inference_batch_size, self.seq_length) + 0, + self.n_classes[col], + (self.inference_batch_size, self.context_length), ).to(export_device, non_blocking=True) for col in self.categorical_columns } dtype_real = torch.float32 if is_different_type else None x_real = { - col: torch.rand(self.inference_batch_size, self.seq_length).to( + col: torch.rand(self.inference_batch_size, self.context_length).to( export_device, non_blocking=True, dtype=dtype_real ) for col in self.real_columns } input_dict = {**x_cat, **x_real} + attention_valid_mask = torch.ones( + self.inference_batch_size, + self.context_length, + dtype=torch.bool, + device=export_device, + ) + attention_valid_mask[0, 0] = False - # Wrap in a tuple with an empty dict to prevent PyTorch from treating input_dict as kwargs - x = (input_dict, {}) + feature_columns = list(input_dict.keys()) + x = tuple(input_dict[col] for col in feature_columns) + ( + attention_valid_mask, + ) + export_wrapper = _OnnxExportWrapper(model_to_export, feature_columns) - # PyTree flattening sorts dictionary keys automatically, so we sort names to match - input_names = [ - f"{col}_in" if col in sorted(list(input_dict.keys())) else col - for col in sorted(self.target_columns) + input_names = [f"{col}_in" for col in input_dict.keys()] + [ + "attention_valid_mask" ] # Determine output names based on the model type @@ -2032,7 +2652,6 @@ def _export_model( logging.getLogger("torch.onnx").setLevel(logging.ERROR) except (ImportError, AttributeError): torch.onnx.disable_log() # Fallback for older PyTorch versions - # 2. Catch and ignore standard Python warnings temporarily with warnings.catch_warnings(), open( os.devnull, "w" ) as fnull, contextlib.redirect_stdout(fnull), contextlib.redirect_stderr( @@ -2047,7 +2666,7 @@ def _export_model( warnings.filterwarnings("ignore", category=FutureWarning) torch.onnx.export( - model_to_export, + export_wrapper, x, export_path, export_params=True, @@ -2080,17 +2699,12 @@ def _save( val_loss: np.float32, ddp_model: Optional[nn.Module] = None, suffix: Optional[str] = None, + best_val_loss: float = float("inf"), + n_epochs_no_improvement: int = 0, + best_model_state_dict: Optional[dict[str, Tensor]] = None, + num_batches: Optional[int] = None, ) -> None: - """Saves the model checkpoint. - - Saves the model state, optimizer state, and epoch number to a .pt - file in the checkpoints directory. Only runs on rank 0. - - Args: - val_loss: The validation loss at the current epoch. - ddp_model: DDP model - suffix: Checkpoint file suffix. - """ + """Save rank-0 checkpoint state.""" model_to_extract = ddp_model if ddp_model is not None else self if self.hparams.training_spec.data_parallelism == "FSDP": @@ -2112,7 +2726,10 @@ def _save( model_state_dict = { k.replace("_orig_mod.", ""): v for k, v in self.state_dict().items() } - optim_state_dict = self.optimizer.state_dict() + optim_state_dict = copy.deepcopy(self.optimizer.state_dict()) + + rng_state = self._collect_rng_states_for_checkpoint() + data_loader_generator_states = self._get_data_loader_generator_states() if self.rank != 0: return @@ -2127,33 +2744,39 @@ def _save( file_name, ) - torch.save( - { - "epoch": epoch, - "batch": batch, - "model_state_dict": model_state_dict, - "optimizer_state_dict": optim_state_dict, - "scheduler_state_dict": self.scheduler.state_dict(), - "loss": val_loss, - }, - output_path, + checkpoint = { + "checkpoint_metadata": self._checkpoint_compatibility_metadata(num_batches), + "epoch": epoch, + "batch": batch, + "model_state_dict": model_state_dict, + "optimizer_state_dict": optim_state_dict, + "scheduler_state_dict": self.scheduler.state_dict(), + "scaler_state_dict": self.scaler.state_dict(), + "rng_state": rng_state, + "data_loader_generator_states": data_loader_generator_states, + "best_val_loss": float(best_val_loss), + "n_epochs_no_improvement": int(n_epochs_no_improvement), + "best_model_state_dict": best_model_state_dict, + "loss": val_loss, + } + + temp_path = os.path.join( + self.project_root, + "checkpoints", + f".{file_name}.{uuid.uuid4().hex}.tmp", ) + try: + torch.save(checkpoint, temp_path) + os.replace(temp_path, output_path) + except Exception: + with contextlib.suppress(OSError): + os.remove(temp_path) + raise self.logger.info(f"[INFO] Saved checkpoint to {output_path}") @beartype def _get_optimizer(self, params: Any, **kwargs): - """Gets the optimizer. - - Initializes the optimizer specified in the hyperparameters. - - Args: - params: params - **kwargs: Additional arguments to pass to the optimizer constructor - (e.g., weight_decay). - - Returns: - An initialized torch.optim.Optimizer instance. - """ + """Instantiate the configured optimizer.""" optimizer_class = get_optimizer_class(self.hparams.training_spec.optimizer.name) return optimizer_class( params, lr=self.hparams.training_spec.learning_rate, **kwargs @@ -2161,17 +2784,7 @@ def _get_optimizer(self, params: Any, **kwargs): @beartype def _get_scheduler(self, **kwargs): - """Gets the scheduler. - - Initializes the learning rate scheduler specified in the hyperparameters. - - Args: - **kwargs: Additional arguments to pass to the scheduler constructor - (e.g., step_size). - - Returns: - An initialized torch.optim.lr_scheduler._LRScheduler instance. - """ + """Instantiate the configured LR scheduler.""" scheduler_name = self.hparams.training_spec.scheduler.name if hasattr(torch.optim.lr_scheduler, scheduler_name): scheduler_class = getattr(torch.optim.lr_scheduler, scheduler_name) @@ -2183,29 +2796,27 @@ def _get_scheduler(self, **kwargs): @beartype def _initialize_log_file(self): - """Initializes the log file.""" - # Replaces old LogFile class instantiation + """Attach the configured logger.""" self.logger = configure_logger(self.project_root, self.model_name, self.rank) @beartype def _get_latest_model_name(self) -> Optional[str]: - """Gets the name of the latest model checkpoint. - - Scans the checkpoints directory for files matching the current - `model_name` and returns the path to the most recently modified one. - - Returns: - The file path (str) to the latest checkpoint, or None if no - checkpoint is found. - """ - checkpoint_path = os.path.join(self.project_root, "checkpoints", "*") + """Return the newest checkpoint path for this model name.""" + checkpoint_path = os.path.join( + self.project_root, "checkpoints", f"{glob.escape(self.model_name)}-*.pt" + ) + checkpoint_name_re = re.compile( + rf"^{re.escape(self.model_name)}-(?:latest|epoch-\d+(?:-batch-\d+)?)\.pt$" + ) files = glob.glob(checkpoint_path) files = [ - file for file in files if os.path.split(file)[1].startswith(self.model_name) + file + for file in files + if checkpoint_name_re.fullmatch(os.path.split(file)[1]) ] if files: - return max(files, key=os.path.getctime) + return max(files, key=os.path.getmtime) else: return None @@ -2217,24 +2828,10 @@ def _log_epoch_results( elapsed: float, total_loss: np.float32, total_losses: dict[str, np.float32], - output: dict[str, Tensor], + class_counts: ClassCounts, global_step: int, ) -> None: - """Logs the results of an epoch. - - Writes validation loss, individual losses, learning rate, and - class share statistics (if configured) to the log file. - Only runs on rank 0. - - Args: - epoch: Current epoch number. - elapsed: Time taken for the epoch (in seconds). - total_loss: The total aggregated validation loss. - total_losses: A dictionary of aggregated losses for each target. - output: The output tensor dictionary from the last validation batch, - used for class share logging. - batch: Current batch number. - """ + """Log validation metrics and class shares from rank 0.""" if self.rank == 0: learning_rate = self.optimizer.state_dict()["param_groups"][0]["lr"] @@ -2270,22 +2867,31 @@ class share statistics (if configured) to the log file. self.logger.info("[INFO] - " + ", ".join(loss_strs)) for categorical_column in self.class_share_log_columns: - output_values = ( - output[categorical_column].argmax(1).cpu().detach().numpy() - ) - output_counts_df = ( - pl.Series("values", output_values).value_counts().sort("values") + counts = class_counts[categorical_column].to(torch.int64) + total = counts.sum() + + if total.item() == 0: + self.logger.warning( + "[WARNING] No valid predictions available for " + f"class-share column {categorical_column!r}." + ) + continue + + share_dtype = ( + torch.float32 if counts.device.type == "mps" else torch.float64 ) - output_counts = output_counts_df.get_column("count") + shares = counts.to(share_dtype) / total - output_counts = output_counts / output_counts.sum() value_shares = " | ".join( - [ - f"{self.index_maps[categorical_column][row['values']]}: {row['count']:5.5f}" - for row in output_counts_df.iter_rows(named=True) - ] + f"{self.index_maps[categorical_column][class_id]}: " + f"{shares[class_id].item():5.5f}" + for class_id in range(counts.numel()) + if counts[class_id].item() > 0 + ) + + self.logger.info( + f"[INFO] {categorical_column} (n={total.item()}): {value_shares}" ) - self.logger.info(f"[INFO] {categorical_column}: {value_shares}") self.logger.info("-" * 89) @@ -2299,21 +2905,7 @@ def load_inference_model( device: str, infer_with_dropout: bool, ) -> torch.nn.Module: - """Loads a trained model for inference. - - Args: - model_type: "generative" or "embedding". - model_path: Path to the saved .pt model file. - training_config_path: Path to the .yaml config file used for training. - args_config: A dictionary of override configurations. - device: The device to load the model onto (e.g., "cuda", "cpu"). - infer_with_dropout: Whether to force dropout layers to be active - during inference. - - Returns: - The loaded and compiled torch.nn.Module (TransformerModel or - TransformerEmbeddingModel) in evaluation mode. - """ + """Load a PT checkpoint as a generative or embedding inference module.""" skip_metadata = args_config.get("skip_metadata", False) args_config_subset = { k: v for k, v in args_config.items() if k not in ["model_path", "data_path"] @@ -2366,25 +2958,15 @@ def infer_with_embedding_model( device: str, size: int, target_columns: list[str], + metadata: list[dict[str, np.ndarray]], ) -> np.ndarray: - """Performs inference with an embedding model. - - Args: - model: The loaded TransformerEmbeddingModel. - x: A list of input data dictionaries (batched). - device: The device to run inference on. - size: The total number of samples (unused in this function). - target_columns: List of target column names (unused in this function). - - Returns: - A NumPy array containing the concatenated embeddings from all batches. - """ + """Run batched embedding inference and concatenate CPU outputs.""" outs0 = [] categorical_cols = set(model.transformer_model.categorical_columns) with torch.no_grad(): - for x_sub in x: + for batch_idx, x_sub in enumerate(x): layer_types = ( model.transformer_model.hparams.training_spec.layer_type_dtypes or {} ) @@ -2396,8 +2978,16 @@ def infer_with_embedding_model( data_gpu[col] = torch.from_numpy(x_).to(device, dtype=torch.int64) else: data_gpu[col] = torch.from_numpy(x_).to(device, dtype=ref_dtype) + metadata_gpu = ( + { + col: torch.from_numpy(x_).to(device) + for col, x_ in metadata[batch_idx].items() + } + if metadata + else {} + ) - output_gpu = model.forward(data_gpu) + output_gpu = model.forward(data_gpu, metadata=metadata_gpu) output_cpu = output_gpu.cpu().detach().float().numpy() output_cpu = output_cpu.transpose(1, 0, 2).reshape( output_cpu.shape[0] * output_cpu.shape[1], output_cpu.shape[2] @@ -2417,26 +3007,15 @@ def infer_with_generative_model( device: str, size: int, target_columns: list[str], + metadata: list[dict[str, np.ndarray]], ) -> dict[str, np.ndarray]: - """Performs inference with a generative model. - - Args: - model: The loaded TransformerModel. - x: A list of input data dictionaries (batched). - device: The device to run inference on. - size: The total number of samples to trim the final output to. - target_columns: List of target column names to extract from the output. - - Returns: - A dictionary mapping target column names to their concatenated - output NumPy arrays, trimmed to `size`. - """ + """Run batched generative inference and trim CPU outputs.""" outs0 = [] categorical_cols = set(model.categorical_columns) with torch.no_grad(): - for x_sub in x: + for batch_idx, x_sub in enumerate(x): layer_types = model.hparams.training_spec.layer_type_dtypes or {} dtype_str = layer_types.get("linear", "float32") ref_dtype = get_torch_dtype(dtype_str) @@ -2446,8 +3025,16 @@ def infer_with_generative_model( data_gpu[col] = torch.from_numpy(x_).to(device, dtype=torch.int64) else: data_gpu[col] = torch.from_numpy(x_).to(device, dtype=ref_dtype) + metadata_gpu = ( + { + col: torch.from_numpy(x_).to(device) + for col, x_ in metadata[batch_idx].items() + } + if metadata + else {} + ) - output_gpu = model.forward(data_gpu) + output_gpu = model.forward(data_gpu, metadata=metadata_gpu) output_cpu = {k: v.cpu().detach() for k, v in output_gpu.items()} outs0.append(output_cpu) if device == "cuda": diff --git a/src/sequifier/visualize_training.py b/src/sequifier/visualize_training.py index fb459ced..c888a0f3 100644 --- a/src/sequifier/visualize_training.py +++ b/src/sequifier/visualize_training.py @@ -6,19 +6,14 @@ from typing import Any, Optional import numpy as np -import plotly.colors as pc # Added to fetch consistent colors +import plotly.colors as pc import plotly.graph_objects as go from beartype import beartype - -# Import Loguru and your custom logger config from loguru import logger from plotly.subplots import make_subplots from sequifier.helpers import configure_logger -# ------------------------------------------------------------------------- -# Configuration & Setup -# ------------------------------------------------------------------------- VAL_PATTERN = re.compile( r"\[INFO\] Validation\s+\|\s*Epoch:\s*(\d+)\s+\|\s*Batch:\s*(\d+)\s+\|\s*Loss:\s*([^\s\|]+)\s+\|\s*Baseline Loss:\s*([^\s\|]+)" ) @@ -28,24 +23,21 @@ ) -# ------------------------------------------------------------------------- -# Custom Exceptions & Dataclasses -# ------------------------------------------------------------------------- class LogParsingError(Exception): - """Raised when a log line does not conform to the expected regex pattern.""" + """Malformed training log line.""" pass class DataContinuityError(Exception): - """Raised when training batches or epochs violate chronological order.""" + """Non-monotonic training batch or epoch sequence.""" pass @dataclass class TrainingMetrics: - """Encapsulates all extracted metrics to avoid returning massive generic tuples.""" + """Parsed validation, baseline, variable, and training losses.""" val_losses: dict[float, float] = field(default_factory=dict) baseline_losses: dict[float, float] = field(default_factory=dict) @@ -55,18 +47,15 @@ class TrainingMetrics: ) def clear_state(self) -> None: - """Clears all metrics; used when a sequence run restarts.""" + """Clear parsed metrics after a detected run restart.""" self.val_losses.clear() self.baseline_losses.clear() self.var_losses.clear() self.train_losses.clear() -# ------------------------------------------------------------------------- -# Core Parsing Logic -# ------------------------------------------------------------------------- class LogParser: - """Handles line-by-line log parsing, encapsulating state to reduce complexity.""" + """Stateful parser for sequifier training logs.""" def __init__(self, model_name: str): self.model = model_name @@ -90,7 +79,7 @@ def parse_file(self, log_file: str) -> TrainingMetrics: @beartype def _process_line(self, line: str) -> None: - """Routes the line to the appropriate sub-parser based on strict string matching.""" + """Dispatch one log line to the matching parser.""" if "[INFO] Validation | Epoch:" in line: self._process_validation(line) elif self.pending_var_loss_epoch is not None and "[INFO] - " in line: @@ -111,7 +100,6 @@ def _process_validation(self, line: str) -> None: val_loss = parse_number(match.group(3)) baseline = parse_number(match.group(4)) - # Check for restart (epoch 0, batch 0) or standard jump back if (epoch == 0 and batch == 0) or ( self.current_epoch is not None and epoch < self.current_epoch and epoch != 0 ): @@ -120,17 +108,14 @@ def _process_validation(self, line: str) -> None: self.current_batch = None self.expected_num_batches = None - # Determine precise x-coordinate for plotting if ( epoch == 0 and batch > 0 and self.current_epoch is not None and self.expected_num_batches is not None ): - # Mid-epoch validation saves pass epoch as 0 in train.py calc_epoch = self.current_epoch - 1 + (batch / self.expected_num_batches) elif self.expected_num_batches is not None and batch > 0: - # End-of-epoch validation calc_epoch = epoch - 1 + (batch / self.expected_num_batches) else: calc_epoch = float(epoch) @@ -215,7 +200,7 @@ def _validate_chronology(self, epoch: int, batch: int, num_batches: int) -> None ) def _handle_epoch_1_restart(self) -> None: - """Handles edge cases where a sequence restarts at Epoch 1 skipping Epoch 0.""" + """Handle restarts that resume at epoch 1 without epoch 0 logs.""" if 0.0 not in self.metrics.val_losses: self.metrics.clear_state() else: @@ -243,19 +228,16 @@ def _validate_final_metrics(self) -> None: raise DataContinuityError(f"[{self.model}]: No baseline loss data found.") -# ------------------------------------------------------------------------- -# Utility Functions -# ------------------------------------------------------------------------- @beartype def parse_number(val: str) -> float: - """Strictly parse numbers, explicitly handling the 'NaN' strings.""" + """Parse finite floats and literal NaN.""" val = val.strip() return np.nan if val == "NaN" else float(val) @beartype def parse_args_to_models(args: argparse.Namespace) -> list[str]: - """Extracts the list of models from a file or comma-separated string.""" + """Read model names from a file or comma-separated argument.""" if os.path.isfile(args.models) and args.models.endswith(".txt"): with open(args.models, "r") as f: content = f.read() @@ -266,7 +248,7 @@ def parse_args_to_models(args: argparse.Namespace) -> list[str]: @beartype def get_log_filepath(args: argparse.Namespace, model: str) -> str: - """Finds the appropriate log file for a given model.""" + """Return the rank-0 log path for a model.""" log_pattern = os.path.join( args.project_root, "logs", f"sequifier-{model}-rank0-3.txt" ) @@ -290,7 +272,7 @@ def get_log_filepath(args: argparse.Namespace, model: str) -> str: def format_plot_data( metrics: TrainingMetrics, bucket_batches: Optional[int], model: str ) -> dict[str, Any]: - """Formats raw parsed dataclass metrics into chronological arrays for Plotly.""" + """Convert parsed metrics into Plotly-ready arrays.""" val_x = sorted(list(metrics.val_losses.keys())) val_y = [metrics.val_losses[e] for e in val_x] base_y = [metrics.baseline_losses[e] for e in val_x] @@ -347,14 +329,11 @@ def format_plot_data( } -# ------------------------------------------------------------------------- -# Plotting & Reporting -# ------------------------------------------------------------------------- @beartype def _generate_single_model_plot( model: str, data: dict[str, Any], yaxis_type: str, out_path: str ) -> None: - """Handles subplot logic specifically for a single model.""" + """Write a single-model training report.""" has_var_losses = bool(data.get("var_losses")) subplot_titles = ( ("Global Losses", "Normalized Variable Validation Losses") @@ -446,18 +425,17 @@ def _generate_single_model_plot( def _generate_multi_model_plot( models: list[str], all_data: dict[str, Any], yaxis_type: str, out_path: str ) -> None: - """Handles subplot logic for comparing multiple models side-by-side.""" + """Write a multi-model training report.""" fig = make_subplots( rows=1, cols=2, subplot_titles=("Validation Losses", "Training Losses") ) baseline_val = None - colors = pc.qualitative.Plotly # Load Plotly's default distinct color array + colors = pc.qualitative.Plotly for i, model in enumerate(models): data = all_data[model] - color = colors[i % len(colors)] # Cycle colors if models exceed palette limit + color = colors[i % len(colors)] - # Validation trace fig.add_trace( go.Scatter( x=data["val_x"], @@ -466,14 +444,13 @@ def _generate_multi_model_plot( name=model, legendgroup=model, line=dict(color=color), - showlegend=True, # Only show validation trace in legend to prevent duplicates + showlegend=True, hovertemplate=f"{model}
Val Loss: %{{y}}
Epoch: %{{x}}", ), row=1, col=1, ) - # Training trace fig.add_trace( go.Scatter( x=data["train_x"], @@ -482,7 +459,7 @@ def _generate_multi_model_plot( name=model, legendgroup=model, line=dict(color=color), - showlegend=False, # Hidden from legend, but linked via legendgroup + showlegend=False, hovertemplate=f"{model}
Train Loss: %{{y}}
Epoch: %{{x}}", ), row=1, @@ -504,7 +481,6 @@ def _generate_multi_model_plot( ) if baseline_val is not None: - # Plot baseline on the Validation subplot (col=1) max_val_x = max( [max(all_data[m]["val_x"]) for m in models if all_data[m]["val_x"]] + [0] ) @@ -534,7 +510,7 @@ def _generate_multi_model_plot( def generate_html_report( all_data: dict[str, Any], models: list[str], args: argparse.Namespace ) -> None: - """Router function to generate the appropriate HTML report based on model count.""" + """Write the model-count-appropriate HTML report.""" output_dir = os.path.join(args.project_root, "outputs", "visualization") os.makedirs(output_dir, exist_ok=True) @@ -549,12 +525,9 @@ def generate_html_report( _generate_multi_model_plot(models, all_data, yaxis_type, out_path) -# ------------------------------------------------------------------------- -# Orchestrator -# ------------------------------------------------------------------------- @beartype def visualize_training(args: argparse.Namespace) -> None: - """Main orchestrator function.""" + """Parse logs and write training visualization HTML.""" models = parse_args_to_models(args) if not models: raise ValueError("No models provided to visualize.") diff --git a/tests/configs/hyperparameter-search-bayesian.yaml b/tests/configs/hyperparameter-search-bayesian.yaml deleted file mode 100644 index 990869c7..00000000 --- a/tests/configs/hyperparameter-search-bayesian.yaml +++ /dev/null @@ -1,67 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-5.json -hp_search_name: test-hp-search-bayesian -model_config_write_path: configs - -read_format: pt -target_columns: [itemId] -target_column_types: - itemId: categorical -seq_length: [8] -inference_batch_size: 10 - -# Search Strategy -search_strategy: bayesian -n_samples: 4 - -# Configuration Loading Overrides (set to null to use values from metadata) -input_columns: null -# Export Settings -export_embedding_model: false -export_generative_model: true -export_onnx: false -export_pt: true -export_with_dropout: false - -# Model Hyperparameter Search Space -model_hyperparameter_sampling: - initial_embedding_dim: [40, 80] - joint_embedding_dim: [null, null] - feature_embedding_dims: null - dim_model: [40, 80] - n_head: [2, 4] - dim_feedforward: [10, 12] - num_layers: [2] - activation_fn: ["swiglu"] - normalization: ["rmsnorm"] - positional_encoding: ["rope"] - attention_type: ["mqa", "gqa"] - norm_first: [ true] - n_kv_heads: [1] - rope_theta: [10000.0] - prediction_length: 1 - -# Training Hyperparameter Search Space -training_hyperparameter_sampling: - device: cpu - epochs: [1, 1] - save_interval_epochs: 10 - batch_size: [5, 10] - learning_rate: [0.001, 0.01] - criterion: - itemId: CrossEntropyLoss - accumulation_steps: [1] - dropout: [0.0] - optimizer: - - name: Adam - scheduler: - - name: StepLR - step_size: 1 - gamma: 0.99 - - name: StepLR - step_size: 1 - gamma: 0.99 - log_interval: 5 - continue_training: false - -override_input: true diff --git a/tests/configs/hyperparameter-search-custom-eval-inference.yaml b/tests/configs/hyperparameter-search-custom-eval-inference.yaml deleted file mode 100644 index 7c11e091..00000000 --- a/tests/configs/hyperparameter-search-custom-eval-inference.yaml +++ /dev/null @@ -1,40 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: configs/metadata_configs/test-data-categorical-5.json - -model_type: generative -model_path: models/sequifier-test-hp-search-custom-eval-run-0-best-1.pt - -data_path: data/test-data-categorical-5-split2 -read_format: pt -write_format: csv - -input_columns: -- itemId -- supCat1 -- supCat2 -- supCat3 -- supCat4 -target_columns: -- itemId -- supCat1 -- supCat2 -- supCat3 -- supCat4 -target_column_types: - itemId: categorical - supCat1: categorical - supCat2: categorical - supCat3: categorical - supCat4: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -prediction_length: 1 -inference_batch_size: 10 -enforce_determinism: true - -# Autoregression -autoregression: true -autoregression_total_steps: 30 diff --git a/tests/configs/hyperparameter-search-custom-eval.yaml b/tests/configs/hyperparameter-search-custom-eval.yaml deleted file mode 100644 index 88a16baf..00000000 --- a/tests/configs/hyperparameter-search-custom-eval.yaml +++ /dev/null @@ -1,90 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-5.json -hp_search_name: test-hp-search-custom-eval -model_config_write_path: configs - -read_format: pt -target_columns: -- itemId -- supCat1 -- supCat2 -- supCat3 -- supCat4 -target_column_types: - itemId: categorical - supCat1: categorical - supCat2: categorical - supCat3: categorical - supCat4: categorical -seq_length: [8] -inference_batch_size: 10 - -# Search Strategy -search_strategy: bayesian -n_samples: 4 - -# Configuration Loading Overrides (set to null to use values from metadata) -input_columns: null -# Export Settings -export_embedding_model: false -export_generative_model: true -export_onnx: true -export_pt: false -export_with_dropout: false - -# Model Hyperparameter Search Space -model_hyperparameter_sampling: - initial_embedding_dim: [40, 80] - joint_embedding_dim: [null, null] - feature_embedding_dims: null - dim_model: [40, 80] - n_head: [2, 4] - dim_feedforward: [10, 12] - num_layers: [2] - activation_fn: ["swiglu"] - normalization: ["rmsnorm"] - positional_encoding: ["rope"] - attention_type: ["mqa", "gqa"] - norm_first: [ true] - n_kv_heads: [1] - rope_theta: [10000.0] - prediction_length: 1 - -# Training Hyperparameter Search Space -training_hyperparameter_sampling: - device: cpu - epochs: [1, 1] - save_interval_epochs: 10 - batch_size: [5, 10] - learning_rate: [0.001, 0.01] - criterion: - itemId: CrossEntropyLoss - supCat1: CrossEntropyLoss - supCat2: CrossEntropyLoss - supCat3: CrossEntropyLoss - supCat4: CrossEntropyLoss - accumulation_steps: [1] - dropout: [0.0] - optimizer: - - name: Adam - scheduler: - - name: StepLR - step_size: 1 - gamma: 0.99 - - name: StepLR - step_size: 1 - gamma: 0.99 - log_interval: 5 - continue_training: false - - -evaluation_metric_directions: - - minimize - - maximize -evaluation_metrics: - - max - - stdev -evaluation_inference_config: tests/configs/hyperparameter-search-custom-eval-inference.yaml -evaluation_script: scripts/hp_search_eval_script.py - -override_input: true diff --git a/tests/configs/hyperparameter-search-grid.yaml b/tests/configs/hyperparameter-search-grid.yaml deleted file mode 100644 index 625d2538..00000000 --- a/tests/configs/hyperparameter-search-grid.yaml +++ /dev/null @@ -1,69 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-5.json -hp_search_name: test-hp-search-grid -model_config_write_path: configs - -read_format: pt -target_columns: [itemId] -target_column_types: - itemId: categorical -seq_length: [8] -inference_batch_size: 10 - -# Search Strategy -search_strategy: grid -n_samples: 4 - -# Configuration Loading Overrides (set to null to use values from metadata) -input_columns: null -# Export Settings -export_embedding_model: false -export_generative_model: true -export_onnx: false -export_pt: true -export_with_dropout: false - -# Model Hyperparameter Search Space -model_hyperparameter_sampling: - initial_embedding_dim: [20] - feature_embedding_dims: null - joint_embedding_dim: [null] - dim_model: [20] - n_head: [2] - dim_feedforward: [10] - num_layers: [2] - activation_fn: ["relu", "swiglu"] - normalization: ["layer_norm"] - positional_encoding: ["learned", "rope"] - attention_type: ["mqa"] - norm_first: [false] - n_kv_heads: [1] - rope_theta: [10000.0] - prediction_length: 1 - -# Training Hyperparameter Search Space -training_hyperparameter_sampling: - device: cpu - epochs: [2] - save_interval_epochs: 10 - batch_size: [5] - learning_rate: [0.001] - criterion: - itemId: CrossEntropyLoss - accumulation_steps: [1] - dropout: [0.0] - optimizer: - - name: Adam - scheduler: - - name: StepLR - step_size: 1 - gamma: 0.99 - log_interval: 5 - continue_training: false - layer_type_dtypes: - embedding: bfloat16 - linear: bfloat16 - norm: bfloat16 - - -override_input: true diff --git a/tests/configs/hyperparameter-search-sample.yaml b/tests/configs/hyperparameter-search-sample.yaml deleted file mode 100644 index 87bf2db6..00000000 --- a/tests/configs/hyperparameter-search-sample.yaml +++ /dev/null @@ -1,85 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-5.json -hp_search_name: test-hp-search-sample -model_config_write_path: configs - -read_format: pt -target_columns: [itemId] -target_column_types: - itemId: categorical -seq_length: [8] -inference_batch_size: 10 - -# Search Strategy -search_strategy: sample -n_samples: 4 - -# Configuration Loading Overrides -input_columns: null -export_embedding_model: false -export_generative_model: true -export_onnx: false -export_pt: true -export_with_dropout: false - -# Model Hyperparameter Search Space using Distributions -model_hyperparameter_sampling: - initial_embedding_dim: [40] - joint_embedding_dim: [null] - feature_embedding_dims: null - dim_model: [40] - n_head: [2] - # IntDistribution test with step - dim_feedforward: - low: 10 - high: 20 - step: 2 - # IntDistribution test without step - num_layers: - low: 1 - high: 3 - activation_fn: ["swiglu"] - normalization: ["rmsnorm"] - positional_encoding: ["rope"] - attention_type: ["mqa"] - norm_first: [true] - n_kv_heads: [1] - # FloatDistribution test with log - rope_theta: - low: 1000.0 - high: 10000.0 - log: true - prediction_length: 1 - -# Training Hyperparameter Search Space using Distributions -training_hyperparameter_sampling: - device: cpu - epochs: [1] - save_interval_epochs: 10 - # IntDistribution test - batch_size: - low: 5 - high: 15 - step: 5 - learning_rate: [0.001] - criterion: - itemId: CrossEntropyLoss - # IntDistribution test - accumulation_steps: - low: 1 - high: 2 - # FloatDistribution test without log - dropout: - low: 0.1 - high: 0.5 - log: true - optimizer: - - name: Adam - scheduler: - - name: StepLR - step_size: 1 - gamma: 0.99 - log_interval: 5 - continue_training: false - -override_input: true diff --git a/tests/configs/infer-test-categorical-autoregression.yaml b/tests/configs/infer-test-categorical-autoregression.yaml deleted file mode 100644 index 59db37ad..00000000 --- a/tests/configs/infer-test-categorical-autoregression.yaml +++ /dev/null @@ -1,24 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-categorical.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-5.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-categorical-1-best-3-autoregression.onnx -data_path: tests/project_folder/data/test-data-categorical-1-split2 -read_format: pt -write_format: csv - -input_columns: itemId -target_columns: [itemId] -target_column_types: - itemId: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: true -autoregression_total_steps: 20 diff --git a/tests/configs/infer-test-categorical-embedding.yaml b/tests/configs/infer-test-categorical-embedding.yaml deleted file mode 100644 index a302b6e3..00000000 --- a/tests/configs/infer-test-categorical-embedding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-categorical.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-1.json -model_type: embedding -model_path: tests/project_folder/models/sequifier-model-categorical-1-best-embedding-3.pt -data_path: tests/project_folder/data/test-data-categorical-1-split2 -read_format: pt -write_format: csv - -input_columns: null -target_columns: [itemId] -target_column_types: - itemId: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: false diff --git a/tests/configs/infer-test-categorical-inf-size-1.yaml b/tests/configs/infer-test-categorical-inf-size-1.yaml deleted file mode 100644 index 724226ea..00000000 --- a/tests/configs/infer-test-categorical-inf-size-1.yaml +++ /dev/null @@ -1,23 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-1.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-categorical-1-inf-size-best-3.onnx -data_path: tests/project_folder/data/test-data-categorical-1-split2 -read_format: pt -write_format: csv - -input_columns: [itemId] -target_columns: [itemId] -target_column_types: - itemId: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -prediction_length: 3 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: false diff --git a/tests/configs/infer-test-categorical-inf-size-3-embedding.yaml b/tests/configs/infer-test-categorical-inf-size-3-embedding.yaml deleted file mode 100644 index d26322e3..00000000 --- a/tests/configs/infer-test-categorical-inf-size-3-embedding.yaml +++ /dev/null @@ -1,26 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-categorical-inf-size-3.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-3.json -model_type: embedding -model_path: tests/project_folder/models/sequifier-model-categorical-3-inf-size-best-embedding-3.pt -data_path: tests/project_folder/data/test-data-categorical-3-split2 -read_format: pt -write_format: csv - -input_columns: [itemId, supCat1, supCat2] -target_columns: [itemId, supCat1, supCat2] -target_column_types: - itemId: categorical - supCat1: categorical - supCat2: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -prediction_length: 3 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: false diff --git a/tests/configs/infer-test-categorical-inf-size-3.yaml b/tests/configs/infer-test-categorical-inf-size-3.yaml deleted file mode 100644 index 8cf3c83d..00000000 --- a/tests/configs/infer-test-categorical-inf-size-3.yaml +++ /dev/null @@ -1,26 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-categorical-inf-size-3.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-3.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-categorical-3-inf-size-best-3.pt -data_path: tests/project_folder/data/test-data-categorical-3-split2 -read_format: pt -write_format: csv - -input_columns: [itemId, supCat1, supCat2] -target_columns: [itemId, supCat1, supCat2] -target_column_types: - itemId: categorical - supCat1: categorical - supCat2: categorical - -output_probabilities: true -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -prediction_length: 3 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: false diff --git a/tests/configs/infer-test-categorical-multitarget.yaml b/tests/configs/infer-test-categorical-multitarget.yaml deleted file mode 100644 index d65fd107..00000000 --- a/tests/configs/infer-test-categorical-multitarget.yaml +++ /dev/null @@ -1,25 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-categorical-multitarget.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-multitarget-5.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-categorical-multitarget-5-best-3.onnx -data_path: tests/project_folder/data/test-data-categorical-multitarget-5-split2 -read_format: parquet -write_format: csv - -input_columns: null -target_columns: [itemId, supCat1, supReal3] -target_column_types: - itemId: categorical - supCat1: categorical - supReal3: real - -output_probabilities: true -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: true - -sample_from_distribution_columns: ['itemId'] -autoregression: false diff --git a/tests/configs/infer-test-categorical.yaml b/tests/configs/infer-test-categorical.yaml deleted file mode 100644 index 7f89e1e4..00000000 --- a/tests/configs/infer-test-categorical.yaml +++ /dev/null @@ -1,23 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-categorical.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-5.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-categorical-5-best-3.pt -data_path: tests/project_folder/data/test-data-categorical5-split2 -read_format: pt -write_format: csv - -input_columns: null -target_columns: [itemId] -target_column_types: - itemId: categorical - -output_probabilities: true -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: false diff --git a/tests/configs/infer-test-distributed-parquet.yaml b/tests/configs/infer-test-distributed-parquet.yaml deleted file mode 100644 index 67935b4a..00000000 --- a/tests/configs/infer-test-distributed-parquet.yaml +++ /dev/null @@ -1,24 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-categorical-multitarget-5.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-categorical-multitarget-5-last-3.onnx -data_path: tests/project_folder/data/test-data-categorical-multitarget-5-split2 -read_format: parquet -write_format: csv - -input_columns: null -target_columns: [itemId, supCat1, supReal3] -target_column_types: - itemId: categorical - supCat1: categorical - supReal3: real - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: true - -sample_from_distribution_columns: null -autoregression: false diff --git a/tests/configs/infer-test-distributed.yaml b/tests/configs/infer-test-distributed.yaml deleted file mode 100644 index 3a7f7faa..00000000 --- a/tests/configs/infer-test-distributed.yaml +++ /dev/null @@ -1,22 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: configs/metadata_configs/test-data-categorical-3.json - -# Point to the model generated by the distributed training test -model_path: models/sequifier-model-categorical-distributed-best-3.onnx -model_type: generative - -# Use the split2 data generated by preprocessing -data_path: data/test-data-categorical-3-split2 -read_format: pt -write_format: csv - -input_columns: [itemId, supCat1] -target_columns: [itemId] -target_column_types: - itemId: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 2 diff --git a/tests/configs/infer-test-lazy.yaml b/tests/configs/infer-test-lazy.yaml deleted file mode 100644 index 1c8f4137..00000000 --- a/tests/configs/infer-test-lazy.yaml +++ /dev/null @@ -1,20 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: configs/metadata_configs/test-data-categorical-3.json - -model_path: models/sequifier-model-categorical-lazy-best-3.onnx -model_type: generative - -data_path: data/test-data-categorical-3-split2 -read_format: pt -write_format: csv - -input_columns: [itemId, supCat1] -target_columns: [itemId] -target_column_types: - itemId: categorical - -output_probabilities: false -map_to_id: true -device: cpu -seq_length: 8 -inference_batch_size: 2 diff --git a/tests/configs/infer-test-real-autoregression.yaml b/tests/configs/infer-test-real-autoregression.yaml deleted file mode 100644 index c965b6f5..00000000 --- a/tests/configs/infer-test-real-autoregression.yaml +++ /dev/null @@ -1,25 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-real.yaml -metadata_config_path: tests/project_folder/configs/metadata_configs/test-data-real-1.json -model_type: generative -model_path: tests/project_folder/models/sequifier-model-real-1-best-3-autoregression.pt -data_path: tests/project_folder/data/test-data-real-1-split1-autoregression.csv -read_format: csv -write_format: csv - -input_columns: null -target_columns: [itemValue] -target_column_types: - itemValue: real - -output_probabilities: false -map_to_id: false -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: false - -sample_from_distribution_columns: [itemValue] -infer_with_dropout: true -autoregression: true -autoregression_total_steps: 20 diff --git a/tests/configs/infer-test-real.yaml b/tests/configs/infer-test-real.yaml deleted file mode 100644 index 0fac3579..00000000 --- a/tests/configs/infer-test-real.yaml +++ /dev/null @@ -1,20 +0,0 @@ -project_root: tests/project_folder -training_config_path: tests/configs/train-test-real.yaml -metadata_config_path: configs/metadata_configs/test-data-real-5.json -model_type: generative -model_path: models/sequifier-model-real-5-best-3.pt -data_path: data/test-data-real5-split2.csv - -input_columns: null -target_columns: [itemValue] -target_column_types: - itemValue: real - -output_probabilities: false -map_to_id: false -device: cpu -seq_length: 8 -inference_batch_size: 10 -enforce_determinism: true - -autoregression: false diff --git a/tests/configs/preprocess-test-categorical-exact-pt.yaml b/tests/configs/preprocess-test-categorical-exact-pt.yaml deleted file mode 100644 index cea9f758..00000000 --- a/tests/configs/preprocess-test-categorical-exact-pt.yaml +++ /dev/null @@ -1,14 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-3-equal.parquet -merge_output: false -read_format: parquet -write_format: pt -selected_columns: null - -split_ratios: -- 1.0 -seq_length: 5 -stride_by_split: -- 5 -max_rows: null -subsequence_start_mode: exact diff --git a/tests/configs/preprocess-test-categorical-exact.yaml b/tests/configs/preprocess-test-categorical-exact.yaml deleted file mode 100644 index 09720cde..00000000 --- a/tests/configs/preprocess-test-categorical-exact.yaml +++ /dev/null @@ -1,14 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-3-equal.csv -merge_output: true -read_format: csv -write_format: parquet -selected_columns: null - -split_ratios: -- 1.0 -seq_length: 5 -stride_by_split: -- 5 -max_rows: null -subsequence_start_mode: exact diff --git a/tests/configs/preprocess-test-categorical-interrupted.yaml b/tests/configs/preprocess-test-categorical-interrupted.yaml deleted file mode 100644 index 5e9ddbab..00000000 --- a/tests/configs/preprocess-test-categorical-interrupted.yaml +++ /dev/null @@ -1,18 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-1-interrupted.csv -merge_output: false -read_format: csv -write_format: pt -selected_columns: null -continue_preprocessing: true -split_ratios: -- 0.6 -- 0.2 -- 0.2 -seq_length: 8 -stride_by_split: -- 1 -- 1 -- 1 -max_rows: null -subsequence_start_mode: distribute diff --git a/tests/configs/preprocess-test-categorical-multitarget.yaml b/tests/configs/preprocess-test-categorical-multitarget.yaml deleted file mode 100644 index aee30ff6..00000000 --- a/tests/configs/preprocess-test-categorical-multitarget.yaml +++ /dev/null @@ -1,19 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-multitarget-5.csv -merge_output: false -read_format: csv -write_format: parquet -selected_columns: null - -split_ratios: -- 0.6 -- 0.2 -- 0.2 -seq_length: 8 -stride_by_split: -- 1 -- 1 -- 1 -max_rows: null -use_precomputed_maps: -- "itemId" diff --git a/tests/configs/preprocess-test-categorical-precomputed-stats-negative.yaml b/tests/configs/preprocess-test-categorical-precomputed-stats-negative.yaml deleted file mode 100644 index b7e38c7a..00000000 --- a/tests/configs/preprocess-test-categorical-precomputed-stats-negative.yaml +++ /dev/null @@ -1,14 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-precomputed-stats-negative.csv -read_format: csv - -write_format: parquet -merge_output: true -selected_columns: null - -split_ratios: -- 1.0 -seq_length: 8 -stride_by_split: -- 1 -max_rows: null diff --git a/tests/configs/preprocess-test-categorical-precomputed-stats.yaml b/tests/configs/preprocess-test-categorical-precomputed-stats.yaml deleted file mode 100644 index 15adf0e8..00000000 --- a/tests/configs/preprocess-test-categorical-precomputed-stats.yaml +++ /dev/null @@ -1,14 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-precomputed-stats.csv -read_format: csv -write_format: parquet -merge_output: true -selected_columns: null - -split_ratios: -- 1.0 -seq_length: 8 -stride_by_split: -- 1 -max_rows: null -metadata_config_path: configs/metadata_configs/test-data-categorical-multitarget-5.json diff --git a/tests/configs/preprocess-test-categorical.yaml b/tests/configs/preprocess-test-categorical.yaml deleted file mode 100644 index 4571cfcd..00000000 --- a/tests/configs/preprocess-test-categorical.yaml +++ /dev/null @@ -1,18 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-5.csv -merge_output: false -read_format: csv -write_format: pt -selected_columns: null - -split_ratios: -- 0.6 -- 0.2 -- 0.2 -seq_length: 8 -stride_by_split: -- 1 -- 1 -- 1 -max_rows: null -subsequence_start_mode: distribute diff --git a/tests/configs/preprocess-test-multi-file.yaml b/tests/configs/preprocess-test-multi-file.yaml deleted file mode 100644 index 106e21c8..00000000 --- a/tests/configs/preprocess-test-multi-file.yaml +++ /dev/null @@ -1,20 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-categorical-multi-file -merge_output: false -read_format: csv -process_by_file: false -write_format: pt -selected_columns: null - -batches_per_file: 1 - -split_ratios: -- 0.8 -- 0.1 -- 0.1 -seq_length: 8 -stride_by_split: -- 1 -- 1 -- 1 -max_rows: null diff --git a/tests/configs/preprocess-test-real.yaml b/tests/configs/preprocess-test-real.yaml deleted file mode 100644 index b5593b45..00000000 --- a/tests/configs/preprocess-test-real.yaml +++ /dev/null @@ -1,16 +0,0 @@ -project_root: tests/project_folder -data_path: tests/resources/source_data/test-data-real-5.csv -merge_output: true -read_format: csv -write_format: parquet -selected_columns: null - -split_ratios: -- 0.5 -- 0.5 -seq_length: 8 -stride_by_split: -- 1 -- 1 -max_rows: null -n_cores: 1 diff --git a/tests/configs/train-test-categorical-inf-size-1.yaml b/tests/configs/train-test-categorical-inf-size-1.yaml deleted file mode 100644 index 540dc963..00000000 --- a/tests/configs/train-test-categorical-inf-size-1.yaml +++ /dev/null @@ -1,60 +0,0 @@ -project_root: tests/project_folder -model_name: model-categorical-1-inf-size -read_format: pt -metadata_config_path: configs/metadata_configs/test-data-categorical-1.json - -input_columns: [itemId] -target_columns: [itemId] -target_column_types: - itemId: categorical - -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true -export_onnx: true -export_pt: false - -model_spec: - initial_embedding_dim: 200 - dim_model: 200 - n_head: 2 - dim_feedforward: 12 - num_layers: 2 - prediction_length: 3 - activation_fn: swiglu - normalization: rmsnorm - positional_encoding: learned - attention_type: mha - norm_first: false - n_kv_heads: 2 - rope_theta: 10000.0 -training_spec: - device: cpu - epochs: 3 - save_interval_epochs: 1 - batch_size: 5 - log_interval: 1 - class_share_log_columns: ["itemId"] - learning_rate: 0.003 - accumulation_steps: 2 - dropout: 0.3 - criterion: - itemId: CrossEntropyLoss - loss_weights: - itemId: 1.0 - optimizer: - name: QHAdam - scheduler: - name: StepLR - step_size: 1.0 - gamma: 0.99 - scheduler_step_on: epoch - continue_training: false - enforce_determinism: false - layer_type_dtypes: - embedding: bfloat16 - linear: bfloat16 - norm: bfloat16 - decoder: bfloat16 diff --git a/tests/configs/train-test-categorical-inf-size-3.yaml b/tests/configs/train-test-categorical-inf-size-3.yaml deleted file mode 100644 index 8a8575a0..00000000 --- a/tests/configs/train-test-categorical-inf-size-3.yaml +++ /dev/null @@ -1,67 +0,0 @@ -project_root: tests/project_folder -model_name: model-categorical-3-inf-size -read_format: pt -metadata_config_path: configs/metadata_configs/test-data-categorical-3.json - -input_columns: [itemId, supCat1, supCat2] -target_columns: [itemId, supCat1, supCat2] -target_column_types: - itemId: categorical - supCat1: categorical - supCat2: categorical - -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true -export_onnx: false -export_pt: true - -model_spec: - initial_embedding_dim: 100 - feature_embedding_dims: - itemId: 50 - supCat1: 25 - supCat2: 25 - joint_embedding_dim: 200 - dim_model: 200 - n_head: 2 - dim_feedforward: 12 - num_layers: 2 - prediction_length: 3 - activation_fn: swiglu - normalization: layer_norm - positional_encoding: rope - attention_type: mqa - norm_first: false - n_kv_heads: 1 - rope_theta: 10000.0 -training_spec: - device: cpu - epochs: 3 - save_interval_epochs: 1 - batch_size: 5 - log_interval: 1 - class_share_log_columns: ["itemId"] - learning_rate: 0.003 - accumulation_steps: 2 - dropout: 0.3 - criterion: - itemId: CrossEntropyLoss - supCat1: CrossEntropyLoss - supCat2: CrossEntropyLoss - optimizer: - name: QHAdam - scheduler: - name: StepLR - step_size: 1.0 - gamma: 0.99 - scheduler_step_on: epoch - continue_training: false - enforce_determinism: true - layer_autocast: false - layer_type_dtypes: - embedding: bfloat16 - linear: bfloat16 - norm: bfloat16 diff --git a/tests/configs/train-test-categorical-multitarget-eager.yaml b/tests/configs/train-test-categorical-multitarget-eager.yaml deleted file mode 100644 index 65e93add..00000000 --- a/tests/configs/train-test-categorical-multitarget-eager.yaml +++ /dev/null @@ -1,77 +0,0 @@ -project_root: tests/project_folder -model_name: model-categorical-multitarget-5-eager -read_format: parquet -metadata_config_path: configs/metadata_configs/test-data-categorical-multitarget-5.json - -input_columns: null -target_columns: [itemId, supCat1, supReal3] -target_column_types: - itemId: categorical - supCat1: categorical - supReal3: real -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true - -model_spec: - initial_embedding_dim: 16 - feature_embedding_dims: - itemId: 6 - supCat1: 4 - supReal2: 1 - supReal3: 1 - supCat4: 4 - dim_model: 16 - n_head: 2 - dim_feedforward: 10 - num_layers: 2 - prediction_length: 1 - - activation_fn: gelu - normalization: rmsnorm - positional_encoding: rope - attention_type: gqa - norm_first: true - n_kv_heads: 1 - rope_theta: 10000.0 - -training_spec: - device: cpu - epochs: 3 - save_interval_epochs: 1 - batch_size: 10 - learning_rate: 0.003 - log_interval: 1 - accumulation_steps: 2 - dropout: 0.3 - criterion: - itemId: CrossEntropyLoss - supCat1: CrossEntropyLoss - supReal3: MSELoss - loss_weights: - itemId: 1.0 - supCat1: 0.5 - supReal3: 0.5 - optimizer: - name: AdamW - scheduler: - name: OneCycleLR - max_lr: 0.001 - pct_start: 0.03 - div_factor: 1000 - final_div_factor: 1000 - anneal_strategy: cos - total_steps: 100 - three_phase: false - scheduler_step_on: 'batch' - continue_training: false - enforce_determinism: true - layer_autocast: true - layer_type_dtypes: - linear: bfloat16 - decoder: bfloat16 - embedding: float32 - norm: float32 - load_full_data_to_ram: true diff --git a/tests/configs/train-test-categorical-multitarget.yaml b/tests/configs/train-test-categorical-multitarget.yaml deleted file mode 100644 index 395fb71b..00000000 --- a/tests/configs/train-test-categorical-multitarget.yaml +++ /dev/null @@ -1,78 +0,0 @@ -project_root: tests/project_folder -model_name: model-categorical-multitarget-5 -read_format: parquet -metadata_config_path: configs/metadata_configs/test-data-categorical-multitarget-5.json - - -input_columns: null -target_columns: [itemId, supCat1, supReal3] -target_column_types: - itemId: categorical - supCat1: categorical - supReal3: real -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true - -model_spec: - initial_embedding_dim: 16 - feature_embedding_dims: - itemId: 6 - supCat1: 4 - supReal2: 1 - supReal3: 1 - supCat4: 4 - dim_model: 16 - n_head: 2 - dim_feedforward: 10 - num_layers: 2 - prediction_length: 1 - - activation_fn: gelu - normalization: rmsnorm - positional_encoding: rope - attention_type: gqa - norm_first: true - n_kv_heads: 1 - rope_theta: 10000.0 - -training_spec: - device: cpu - epochs: 3 - save_interval_epochs: 1 - batch_size: 10 - learning_rate: 0.003 - log_interval: 1 - accumulation_steps: 2 - dropout: 0.3 - criterion: - itemId: CrossEntropyLoss - supCat1: CrossEntropyLoss - supReal3: MSELoss - loss_weights: - itemId: 1.0 - supCat1: 0.5 - supReal3: 0.5 - optimizer: - name: AdamW - scheduler: - name: OneCycleLR - max_lr: 0.001 - pct_start: 0.03 - div_factor: 1000 - final_div_factor: 1000 - anneal_strategy: cos - total_steps: 100 - three_phase: false - scheduler_step_on: 'batch' - continue_training: false - enforce_determinism: true - layer_autocast: true - layer_type_dtypes: - linear: bfloat16 - decoder: bfloat16 - embedding: float32 - norm: float32 - load_full_data_to_ram: false diff --git a/tests/configs/train-test-categorical.yaml b/tests/configs/train-test-categorical.yaml deleted file mode 100644 index 2da9eace..00000000 --- a/tests/configs/train-test-categorical.yaml +++ /dev/null @@ -1,59 +0,0 @@ -project_root: tests/project_folder -model_name: default -read_format: pt -metadata_config_path: configs/metadata_configs/test-data-categorical-5.json - -input_columns: null -target_columns: [itemId] -target_column_types: - itemId: categorical - -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true -export_onnx: true -export_pt: true - -model_spec: - initial_embedding_dim: 100 - joint_embedding_dim: 200 - dim_model: 200 - n_head: 2 - dim_feedforward: 12 - num_layers: 2 - prediction_length: 1 - activation_fn: relu - normalization: rmsnorm - positional_encoding: rope - attention_type: mqa - norm_first: true - n_kv_heads: 1 - rope_theta: 1000.0 -training_spec: - device: cpu - torch_compile: "outer" - epochs: 3 - save_interval_epochs: 1 - batch_size: 5 - log_interval: 1 - class_share_log_columns: ["itemId"] - learning_rate: 0.003 - accumulation_steps: 2 - dropout: 0.3 - criterion: - itemId: CrossEntropyLoss - loss_weights: - itemId: 1.0 - class_weights: - itemId: [1.0, 1.0, 1.5, 0.5, 0.6, 1.2, 0.66666667, 1.5, 1.2, 0.75, 0.85714286, 0.75, 0.85714286, 0.75, 0.6, 2.,1.5, 1.5, 1.0, 1.0, 0.66666667, 0.75, 0.5, 0.75, 2.0, 1.2, 3.0, 1.0, 0.75, 1.0, 0.85714286, 1.0] - optimizer: - name: QHAdam - scheduler: - name: StepLR - step_size: 1.0 - gamma: 0.99 - scheduler_step_on: epoch - continue_training: false - enforce_determinism: true diff --git a/tests/configs/train-test-distributed-lazy-parquet.yaml b/tests/configs/train-test-distributed-lazy-parquet.yaml deleted file mode 100644 index 3ac5fa17..00000000 --- a/tests/configs/train-test-distributed-lazy-parquet.yaml +++ /dev/null @@ -1,51 +0,0 @@ -project_root: tests/project_folder -model_name: model-categorical-distributed-lazy-parquet -read_format: parquet -metadata_config_path: configs/metadata_configs/test-data-categorical-multitarget-5.json - -input_columns: [itemId, supCat1] -target_columns: [itemId] -target_column_types: - itemId: categorical - -seq_length: 8 -inference_batch_size: 2 - -export_generative_model: true -export_embedding_model: false -export_onnx: true -export_pt: true - -model_spec: - initial_embedding_dim: 16 - dim_model: 16 - n_head: 2 - dim_feedforward: 16 - num_layers: 1 - prediction_length: 1 - -training_spec: - device: cpu - epochs: 3 - log_interval: 1 - save_interval_epochs: 1 - batch_size: 5 - learning_rate: 0.001 - criterion: - itemId: CrossEntropyLoss - optimizer: - name: Adam - scheduler: - name: StepLR - step_size: 1 - gamma: 0.1 - - # --- The Magic Combination --- - distributed: true # Triggers mp.spawn + gloo - data_parallelism: 'DDP' - world_size: 2 - backend: gloo - sampling_strategy: 'oversampling' - num_workers: 2 # Triggers thread contention - load_full_data_to_ram: false # Triggers SequifierDatasetFromFolderParquetLazy - continue_training: false diff --git a/tests/configs/train-test-distributed.yaml b/tests/configs/train-test-distributed.yaml deleted file mode 100644 index 1cd9872e..00000000 --- a/tests/configs/train-test-distributed.yaml +++ /dev/null @@ -1,51 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: configs/metadata_configs/test-data-categorical-3.json -model_name: model-categorical-distributed -training_data_path: data/test-data-categorical-3-split0 # Generated by existing preprocess tests -validation_data_path: data/test-data-categorical-3-split1 -read_format: pt - -input_columns: [itemId, supCat1] -target_columns: [itemId] -target_column_types: - itemId: categorical - -seq_length: 8 -inference_batch_size: 2 - -export_generative_model: true -export_embedding_model: false -export_onnx: true -export_pt: true - -model_spec: - initial_embedding_dim: 16 - dim_model: 16 - n_head: 2 - dim_feedforward: 16 - num_layers: 1 - prediction_length: 1 - -training_spec: - device: cpu - epochs: 3 - log_interval: 1 - save_interval_epochs: 1 - batch_size: 5 - learning_rate: 0.001 - criterion: - itemId: CrossEntropyLoss - optimizer: - name: Adam - scheduler: - name: StepLR - step_size: 1 - gamma: 0.1 - - # --- Mac Distributed Settings --- - distributed: true - data_parallelism: 'DDP' - world_size: 2 - backend: gloo - load_full_data_to_ram: true - continue_training: false diff --git a/tests/configs/train-test-lazy.yaml b/tests/configs/train-test-lazy.yaml deleted file mode 100644 index c771a614..00000000 --- a/tests/configs/train-test-lazy.yaml +++ /dev/null @@ -1,47 +0,0 @@ -project_root: tests/project_folder -metadata_config_path: configs/metadata_configs/test-data-categorical-3.json -model_name: model-categorical-lazy -training_data_path: data/test-data-categorical-3-split0 -validation_data_path: data/test-data-categorical-3-split1 -read_format: pt - -input_columns: [itemId, supCat1] -target_columns: [itemId] -target_column_types: - itemId: categorical - -seq_length: 8 -inference_batch_size: 2 - -export_generative_model: true -export_embedding_model: false -export_onnx: true -export_pt: true - -model_spec: - initial_embedding_dim: 16 - dim_model: 16 - n_head: 2 - dim_feedforward: 16 - num_layers: 1 - prediction_length: 1 - -training_spec: - device: cpu - epochs: 3 - log_interval: 1 - save_interval_epochs: 1 - batch_size: 5 - learning_rate: 0.001 - criterion: - itemId: CrossEntropyLoss - optimizer: - name: Adam - scheduler: - name: StepLR - step_size: 1 - gamma: 0.1 - - # --- Lazy Loading Setting --- - load_full_data_to_ram: false - continue_training: false diff --git a/tests/configs/train-test-real.yaml b/tests/configs/train-test-real.yaml deleted file mode 100644 index fd1a4e00..00000000 --- a/tests/configs/train-test-real.yaml +++ /dev/null @@ -1,59 +0,0 @@ -project_root: tests/project_folder -model_name: default -read_format: parquet -metadata_config_path: configs/metadata_configs/test-data-real-1.json - -input_columns: null -target_columns: [itemValue] -target_column_types: - itemValue: real - -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true -export_onnx: true -export_pt: true -export_with_dropout: true - -model_spec: - initial_embedding_dim: 100 - dim_model: 100 - n_head: 2 - dim_feedforward: 10 - num_layers: 2 - activation_fn: relu - normalization: layer_norm - positional_encoding: learned - attention_type: mha - norm_first: false - n_kv_heads: null - rope_theta: 10000.0 - prediction_length: 1 -training_spec: - device: cpu - torch_compile: "inner" - epochs: 3 - save_interval_epochs: 1 - save_latest_interval_minutes: 0 - save_batch_interval_minutes: 0 - batch_size: 20 - log_interval: 1 - learning_rate: 0.003 - accumulation_steps: null - dropout: 0.3 - criterion: - itemValue: MSELoss - optimizer: - name: AdEMAMix - scheduler: - name: StepLR - step_size: 1.0 - gamma: 0.99 - continue_training: false - enforce_determinism: true - layer_type_dtypes: - embedding: bfloat16 - linear: bfloat16 - norm: bfloat16 diff --git a/tests/configs/train-test-resume-epoch.yaml b/tests/configs/train-test-resume-epoch.yaml deleted file mode 100644 index dbaef582..00000000 --- a/tests/configs/train-test-resume-epoch.yaml +++ /dev/null @@ -1,58 +0,0 @@ -project_root: tests/project_folder -model_name: model-real-1-from-epoch-checkpoint -read_format: parquet -metadata_config_path: configs/metadata_configs/test-data-real-1.json - -input_columns: null -target_columns: [itemValue] -target_column_types: - itemValue: real - -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: false -export_embedding_model: true -export_onnx: true -export_pt: true -export_with_dropout: false - -model_spec: - initial_embedding_dim: 100 - dim_model: 100 - n_head: 2 - dim_feedforward: 10 - num_layers: 2 - activation_fn: relu - normalization: layer_norm - positional_encoding: learned - attention_type: mha - norm_first: false - n_kv_heads: null - rope_theta: 10000.0 - prediction_length: 1 -training_spec: - device: cpu - epochs: 3 - save_interval_epochs: 1 - save_latest_interval_minutes: null - save_batch_interval_minutes: null - batch_size: 20 - log_interval: 1 - learning_rate: 0.003 - accumulation_steps: null - dropout: 0.3 - criterion: - itemValue: MSELoss - optimizer: - name: AdEMAMix - scheduler: - name: StepLR - step_size: 1.0 - gamma: 0.99 - continue_training: true - enforce_determinism: true - layer_type_dtypes: - embedding: bfloat16 - linear: bfloat16 - norm: bfloat16 diff --git a/tests/configs/train-test-resume-mid-epoch.yaml b/tests/configs/train-test-resume-mid-epoch.yaml deleted file mode 100644 index 17ec8f9e..00000000 --- a/tests/configs/train-test-resume-mid-epoch.yaml +++ /dev/null @@ -1,60 +0,0 @@ -project_root: tests/project_folder -model_name: model-categorical-3-from-mid-epoch-checkpoint -read_format: pt -metadata_config_path: configs/metadata_configs/test-data-categorical-3.json - -input_columns: [itemId, supCat1] -target_columns: [itemId] -target_column_types: - itemId: categorical - -seq_length: 8 -inference_batch_size: 10 - -export_generative_model: true -export_embedding_model: true -export_onnx: true -export_pt: true - -model_spec: - initial_embedding_dim: 100 - joint_embedding_dim: 200 - dim_model: 200 - n_head: 2 - dim_feedforward: 12 - num_layers: 2 - prediction_length: 1 - activation_fn: relu - normalization: rmsnorm - positional_encoding: rope - attention_type: mqa - norm_first: true - n_kv_heads: 1 - rope_theta: 1000.0 -training_spec: - device: cpu - torch_compile: "outer" - epochs: 3 - save_interval_epochs: 1 - batch_size: 5 - log_interval: 1 - class_share_log_columns: ["itemId"] - learning_rate: 0.003 - accumulation_steps: 2 - dropout: 0.3 - criterion: - itemId: CrossEntropyLoss - loss_weights: - itemId: 1.0 - supCat1: 1.0 - class_weights: - itemId: [1.0, 1.0, 1.5, 0.5, 0.6, 1.2, 0.66666667, 1.5, 1.2, 0.75, 0.85714286, 0.75, 0.85714286, 0.75, 0.6, 2.,1.5, 1.5, 1.0, 1.0, 0.66666667, 0.75, 0.5, 0.75, 2.0, 1.2, 3.0, 1.0, 0.75, 1.0, 0.85714286, 1.0] - optimizer: - name: QHAdam - scheduler: - name: StepLR - step_size: 1.0 - gamma: 0.99 - scheduler_step_on: epoch - continue_training: true - enforce_determinism: true diff --git a/tests/integration-test-log.txt b/tests/integration-test-log.txt deleted file mode 100644 index ef9fa309..00000000 --- a/tests/integration-test-log.txt +++ /dev/null @@ -1,72 +0,0 @@ -sequifier preprocess --config-path tests/configs/preprocess-test-categorical.yaml --data-path tests/resources/source_data/test-data-categorical-1.csv --selected-columns None -sequifier preprocess --config-path tests/configs/preprocess-test-real.yaml --data-path tests/resources/source_data/test-data-real-1.csv --selected-columns itemValue -sequifier preprocess --config-path tests/configs/preprocess-test-categorical.yaml --data-path tests/resources/source_data/test-data-categorical-3.csv --selected-columns None -sequifier preprocess --config-path tests/configs/preprocess-test-real.yaml --data-path tests/resources/source_data/test-data-real-3.csv --selected-columns itemValue supReal1 supReal2 -sequifier preprocess --config-path tests/configs/preprocess-test-categorical.yaml --data-path tests/resources/source_data/test-data-categorical-5.csv --selected-columns None -sequifier preprocess --config-path tests/configs/preprocess-test-real.yaml --data-path tests/resources/source_data/test-data-real-5.csv --selected-columns itemValue supReal1 supReal2 supReal3 supReal4 -sequifier preprocess --config-path tests/configs/preprocess-test-categorical.yaml --data-path tests/resources/source_data/test-data-categorical-50.csv --selected-columns None -sequifier preprocess --config-path tests/configs/preprocess-test-real.yaml --data-path tests/resources/source_data/test-data-real-50.csv --selected-columns itemValue supReal1 supReal2 supReal3 supReal4 supReal5 supReal6 supReal7 supReal8 supReal9 supReal10 supReal11 supReal12 supReal13 supReal14 supReal15 supReal16 supReal17 supReal18 supReal19 supReal20 supReal21 supReal22 supReal23 supReal24 supReal25 supReal26 supReal27 supReal28 supReal29 supReal30 supReal31 supReal32 supReal33 supReal34 supReal35 supReal36 supReal37 supReal38 supReal39 supReal40 supReal41 supReal42 supReal43 supReal44 supReal45 supReal46 supReal47 supReal48 supReal49 -sequifier preprocess --config-path tests/configs/preprocess-test-categorical-multitarget.yaml -sequifier preprocess --config-path tests/configs/preprocess-test-multi-file.yaml -sequifier preprocess --config-path tests/configs/preprocess-test-categorical-interrupted.yaml -sequifier preprocess --config-path tests/configs/preprocess-test-categorical-exact.yaml -sequifier preprocess --config-path tests/configs/preprocess-test-categorical-exact-pt.yaml -sequifier hyperparameter-search --config-path tests/configs/hyperparameter-search-grid.yaml -sequifier hyperparameter-search --config-path tests/configs/hyperparameter-search-sample.yaml -sequifier hyperparameter-search --config-path tests/configs/hyperparameter-search-bayesian.yaml -sequifier hyperparameter-search --config-path tests/configs/hyperparameter-search-custom-eval.yaml -sequifier train --config-path tests/configs/train-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-1.json --model-name model-categorical-1 --input-columns itemId -sequifier train --config-path tests/configs/train-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-1.json --model-name model-real-1 --input-columns None -sequifier train --config-path tests/configs/train-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-3.json --model-name model-categorical-3 --input-columns itemId supCat1 -sequifier train --config-path tests/configs/train-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-3.json --model-name model-real-3 --input-columns None -sequifier train --config-path tests/configs/train-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-5.json --model-name model-categorical-5 --input-columns itemId supCat1 supCat2 supCat4 -sequifier train --config-path tests/configs/train-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-5.json --model-name model-real-5 --input-columns None -sequifier train --config-path tests/configs/train-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-50.json --model-name model-categorical-50 --input-columns itemId supCat1 supCat2 supCat3 supCat4 supCat5 supCat6 supCat7 supCat8 supCat9 supCat10 supCat11 supCat12 supCat13 supCat14 supCat15 supCat16 supCat17 supCat18 supCat19 supCat20 supCat21 supCat22 supCat23 supCat24 supCat25 supCat26 supCat27 supCat28 supCat29 supCat30 supCat31 supCat32 supCat33 supCat34 supCat35 supCat36 supCat37 supCat38 supCat39 supCat40 supCat41 supCat42 supCat43 supCat44 supCat45 supCat46 supCat47 supCat48 supCat49 -sequifier train --config-path tests/configs/train-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-50.json --model-name model-real-50 --input-columns None -sequifier train --config-path tests/configs/train-test-categorical-inf-size-1.yaml -sequifier train --config-path tests/configs/train-test-categorical-inf-size-3.yaml -sequifier train --config-path tests/configs/train-test-categorical-multitarget.yaml -sequifier train --config-path tests/configs/train-test-categorical-multitarget-eager.yaml -sequifier train --config-path tests/configs/train-test-distributed.yaml -sequifier train --config-path tests/configs/train-test-distributed-lazy-parquet.yaml -sequifier train --config-path tests/configs/train-test-lazy.yaml -sequifier infer --config-path tests/configs/infer-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-1.json --model-path models/sequifier-model-categorical-1-best-3.onnx --data-path data/test-data-categorical-1-split2 --input-columns itemId -sequifier infer --config-path tests/configs/infer-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-1.json --model-path models/sequifier-model-real-1-best-3.pt --data-path data/test-data-real-1-split1.parquet --input-columns None -sequifier infer --config-path tests/configs/infer-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-3.json --model-path models/sequifier-model-categorical-3-best-3.onnx --data-path data/test-data-categorical-3-split2 --input-columns itemId supCat1 -sequifier infer --config-path tests/configs/infer-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-3.json --model-path models/sequifier-model-real-3-best-3.pt --data-path data/test-data-real-3-split1.parquet --input-columns None -sequifier infer --config-path tests/configs/infer-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-5.json --model-path models/sequifier-model-categorical-5-best-3.onnx --data-path data/test-data-categorical-5-split2 --input-columns itemId supCat1 supCat2 supCat4 -sequifier infer --config-path tests/configs/infer-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-5.json --model-path models/sequifier-model-real-5-best-3.pt --data-path data/test-data-real-5-split1.parquet --input-columns None -sequifier infer --config-path tests/configs/infer-test-categorical.yaml --metadata-config-path configs/metadata_configs/test-data-categorical-50.json --model-path models/sequifier-model-categorical-50-best-3.onnx --data-path data/test-data-categorical-50-split2 --input-columns itemId supCat1 supCat2 supCat3 supCat4 supCat5 supCat6 supCat7 supCat8 supCat9 supCat10 supCat11 supCat12 supCat13 supCat14 supCat15 supCat16 supCat17 supCat18 supCat19 supCat20 supCat21 supCat22 supCat23 supCat24 supCat25 supCat26 supCat27 supCat28 supCat29 supCat30 supCat31 supCat32 supCat33 supCat34 supCat35 supCat36 supCat37 supCat38 supCat39 supCat40 supCat41 supCat42 supCat43 supCat44 supCat45 supCat46 supCat47 supCat48 supCat49 -sequifier infer --config-path tests/configs/infer-test-real.yaml --metadata-config-path configs/metadata_configs/test-data-real-50.json --model-path models/sequifier-model-real-50-best-3.pt --data-path data/test-data-real-50-split1.parquet --input-columns None -sequifier infer --config-path tests/configs/infer-test-categorical-multitarget.yaml -sequifier infer --config-path tests/configs/infer-test-real-autoregression.yaml --input-columns itemValue --randomize -sequifier infer --config-path tests/configs/infer-test-categorical-inf-size-1.yaml -sequifier infer --config-path tests/configs/infer-test-categorical-inf-size-3.yaml -sequifier infer --config-path tests/configs/infer-test-distributed.yaml -sequifier infer --config-path tests/configs/infer-test-distributed-parquet.yaml -sequifier infer --config-path tests/configs/infer-test-lazy.yaml -sequifier infer --config-path tests/configs/infer-test-categorical-autoregression.yaml --input-columns itemId -sequifier infer --config-path tests/configs/infer-test-categorical-embedding.yaml --input-columns itemId -sequifier infer --config-path tests/configs/infer-test-categorical-inf-size-3-embedding.yaml -sequifier preprocess --config-path tests/configs/preprocess-test-categorical-precomputed-stats.yaml -sequifier preprocess --config-path tests/configs/preprocess-test-categorical-precomputed-stats-negative.yaml -sequifier train --config-path tests/configs/train-test-resume-epoch.yaml -sequifier train --config-path tests/configs/train-test-resume-mid-epoch.yaml -sequifier visualize-training model-categorical-1 --project-root tests/project_folder -sequifier visualize-training model-categorical-1-inf-size --project-root tests/project_folder -sequifier visualize-training model-categorical-3 --project-root tests/project_folder -sequifier visualize-training model-categorical-3-from-mid-epoch-checkpoint --project-root tests/project_folder -sequifier visualize-training model-categorical-3-inf-size --project-root tests/project_folder -sequifier visualize-training model-categorical-5 --project-root tests/project_folder -sequifier visualize-training model-categorical-50 --project-root tests/project_folder -sequifier visualize-training model-categorical-distributed --project-root tests/project_folder -sequifier visualize-training model-categorical-distributed-lazy-parquet --project-root tests/project_folder -sequifier visualize-training model-categorical-lazy --project-root tests/project_folder -sequifier visualize-training model-categorical-multitarget-5 --project-root tests/project_folder -sequifier visualize-training model-categorical-multitarget-5-eager --project-root tests/project_folder -sequifier visualize-training model-real-1 --project-root tests/project_folder -sequifier visualize-training model-real-1-from-epoch-checkpoint --project-root tests/project_folder -sequifier visualize-training model-real-3 --project-root tests/project_folder -sequifier visualize-training model-real-5 --project-root tests/project_folder -sequifier visualize-training model-real-50 --project-root tests/project_folder -sequifier visualize-training test-hp-search-grid-run-0,test-hp-search-grid-run-1,test-hp-search-grid-run-2,test-hp-search-grid-run-3 --project-root tests/project_folder --log-scale --bucket-training-batches 5 diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py deleted file mode 100644 index 9b193a7b..00000000 --- a/tests/integration/conftest.py +++ /dev/null @@ -1,815 +0,0 @@ -import os -import shutil -import subprocess -import time - -import polars as pl -import pytest -import yaml - -SELECTED_COLUMNS = { - "categorical": { - 1: "itemId", - 3: "itemId supCat1", - 5: "itemId supCat1 supCat2 supCat4", - 50: "itemId " + " ".join([f"supCat{i}" for i in range(1, 50)]), - }, - "real": { - 1: "itemValue", - 3: "itemValue supReal1 supReal2", - 5: "itemValue supReal1 supReal2 supReal3 supReal4", - 50: "itemValue " + " ".join([f"supReal{i}" for i in range(1, 50)]), - }, -} - -TARGET_VARIABLE_DICT = {"categorical": "itemId", "real": "itemValue"} - - -def run_and_log(command: str) -> None: - subprocess.run(command, shell=True, check=True) - - with open(os.path.join("tests", "integration-test-log.txt"), "a+") as f: - f.write(f"{command}\n") - - -def pytest_configure(config): - os.environ["SEQUIFIER_TESTING"] = "1" - - -@pytest.fixture(scope="session") -def split_groups(): - return {"categorical": 3, "real": 2} - - -@pytest.fixture(scope="session") -def project_root(): - return os.path.join("tests", "project_folder") - - -@pytest.fixture(scope="session") -def preprocessing_config_path_cat(): - return os.path.join("tests", "configs", "preprocess-test-categorical.yaml") - - -@pytest.fixture(scope="session") -def preprocessing_config_path_cat_multitarget(): - return os.path.join( - "tests", "configs", "preprocess-test-categorical-multitarget.yaml" - ) - - -@pytest.fixture(scope="session") -def preprocessing_config_path_multi_file(): - return os.path.join("tests", "configs", "preprocess-test-multi-file.yaml") - - -@pytest.fixture(scope="session") -def preprocessing_config_path_interrupted(): - return os.path.join( - "tests", "configs", "preprocess-test-categorical-interrupted.yaml" - ) - - -@pytest.fixture(scope="session") -def preprocessing_config_path_exact(): - return os.path.join("tests", "configs", "preprocess-test-categorical-exact.yaml") - - -@pytest.fixture(scope="session") -def preprocessing_config_path_exact_pt(): - return os.path.join("tests", "configs", "preprocess-test-categorical-exact-pt.yaml") - - -@pytest.fixture(scope="session") -def preprocessing_config_path_real(): - return os.path.join("tests", "configs", "preprocess-test-real.yaml") - - -@pytest.fixture(scope="session") -def preprocessing_config_path_cat_precomputed_stats(): - return os.path.join( - "tests", "configs", "preprocess-test-categorical-precomputed-stats.yaml" - ) - - -@pytest.fixture(scope="session") -def preprocessing_config_path_cat_precomputed_stats_negative(): - return os.path.join( - "tests", - "configs", - "preprocess-test-categorical-precomputed-stats-negative.yaml", - ) - - -@pytest.fixture(scope="session") -def training_config_path_cat(): - return os.path.join("tests", "configs", "train-test-categorical.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_cat_multitarget(): - return os.path.join("tests", "configs", "train-test-categorical-multitarget.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_cat_multitarget_eager(): - return os.path.join( - "tests", "configs", "train-test-categorical-multitarget-eager.yaml" - ) - - -@pytest.fixture(scope="session") -def training_config_path_real(): - return os.path.join("tests", "configs", "train-test-real.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_cat_inf_size_1(): - return os.path.join("tests", "configs", "train-test-categorical-inf-size-1.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_cat_inf_size_3(): - return os.path.join("tests", "configs", "train-test-categorical-inf-size-3.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_distributed(): - return os.path.join("tests", "configs", "train-test-distributed.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_distributed_lazy_parquet(): - return os.path.join("tests", "configs", "train-test-distributed-lazy-parquet.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_lazy(): - return os.path.join("tests", "configs", "train-test-lazy.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_resume_epoch(): - return os.path.join("tests", "configs", "train-test-resume-epoch.yaml") - - -@pytest.fixture(scope="session") -def training_config_path_resume_mid_epoch(): - return os.path.join("tests", "configs", "train-test-resume-mid-epoch.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_cat(): - return os.path.join("tests", "configs", "infer-test-categorical.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_cat_multitarget(): - return os.path.join("tests", "configs", "infer-test-categorical-multitarget.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_real(): - return os.path.join("tests", "configs", "infer-test-real.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_cat_inf_size_1(): - return os.path.join("tests", "configs", "infer-test-categorical-inf-size-1.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_cat_inf_size_3(): - return os.path.join("tests", "configs", "infer-test-categorical-inf-size-3.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_real_autoregression(): - return os.path.join("tests", "configs", "infer-test-real-autoregression.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_categorical_autoregression(): - return os.path.join( - "tests", "configs", "infer-test-categorical-autoregression.yaml" - ) - - -@pytest.fixture(scope="session") -def inference_config_path_embedding(): - return os.path.join("tests", "configs", "infer-test-categorical-embedding.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_cat_inf_size_3_embedding(): - return os.path.join( - "tests", "configs", "infer-test-categorical-inf-size-3-embedding.yaml" - ) - - -@pytest.fixture(scope="session") -def inference_config_path_distributed(): - return os.path.join("tests", "configs", "infer-test-distributed.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_distributed_parquet(): - return os.path.join("tests", "configs", "infer-test-distributed-parquet.yaml") - - -@pytest.fixture(scope="session") -def inference_config_path_lazy(): - return os.path.join("tests", "configs", "infer-test-lazy.yaml") - - -@pytest.fixture(scope="session") -def remove_project_root_contents(project_root): - if os.path.exists(project_root): - shutil.rmtree(project_root) - os.makedirs(project_root) - - log_file_path = os.path.join("tests", "integration-test-log.txt") - if os.path.exists(log_file_path): - os.remove(log_file_path) - - time.sleep(1) - - -@pytest.fixture(scope="session") -def hp_search_configs(): - return { - "grid": os.path.join("tests", "configs", "hyperparameter-search-grid.yaml"), - "sample": os.path.join("tests", "configs", "hyperparameter-search-sample.yaml"), - "bayesian": os.path.join( - "tests", "configs", "hyperparameter-search-bayesian.yaml" - ), - "custom-eval": os.path.join( - "tests", "configs", "hyperparameter-search-custom-eval.yaml" - ), - } - - -def reformat_parameter(attr, param, type): - if attr.endswith("_path"): - if type == "linux->local": - return os.path.join(*param.split("/")) - elif type == "local->linux": - return "/".join(os.path.split(param)) - else: - return param - - -@pytest.fixture(scope="session", autouse=True) -def format_configs_locally( - preprocessing_config_path_cat, - preprocessing_config_path_cat_multitarget, - preprocessing_config_path_real, - preprocessing_config_path_multi_file, - preprocessing_config_path_interrupted, - training_config_path_cat, - training_config_path_cat_multitarget, - training_config_path_real, - training_config_path_cat_inf_size_1, - training_config_path_cat_inf_size_3, - training_config_path_distributed, - training_config_path_distributed_lazy_parquet, - training_config_path_lazy, - training_config_path_resume_epoch, - training_config_path_resume_mid_epoch, - inference_config_path_cat, - inference_config_path_cat_multitarget, - training_config_path_cat_multitarget_eager, - inference_config_path_real, - inference_config_path_real_autoregression, - inference_config_path_categorical_autoregression, - inference_config_path_cat_inf_size_1, - inference_config_path_cat_inf_size_3, - inference_config_path_distributed, - inference_config_path_distributed_parquet, - inference_config_path_lazy, - hp_search_configs, -): - from sys import platform - - if platform == "windows": - config_paths = [ - preprocessing_config_path_cat, - preprocessing_config_path_cat_multitarget, - preprocessing_config_path_real, - preprocessing_config_path_multi_file, - preprocessing_config_path_interrupted, - training_config_path_cat, - training_config_path_cat_multitarget, - training_config_path_real, - training_config_path_cat_inf_size_1, - training_config_path_cat_inf_size_3, - training_config_path_distributed, - training_config_path_distributed_lazy_parquet, - training_config_path_lazy, - training_config_path_resume_epoch, - training_config_path_resume_mid_epoch, - inference_config_path_cat, - inference_config_path_cat_multitarget, - training_config_path_cat_multitarget_eager, - inference_config_path_real, - inference_config_path_real_autoregression, - inference_config_path_categorical_autoregression, - inference_config_path_cat_inf_size_1, - inference_config_path_cat_inf_size_3, - inference_config_path_distributed, - inference_config_path_distributed_parquet, - inference_config_path_lazy, - hp_search_configs["grid"], - hp_search_configs["sample"], - hp_search_configs["bayesian"], - hp_search_configs["custom-eval"], - ] - for config_path in config_paths: - with open(config_path, "r") as f: - config = yaml.safe_load(f) - - assert config is not None, config_path - - config_formatted = { - attr: reformat_parameter(attr, param, "linux->local") - for attr, param in config.items() - } - - with open(config_path, "w") as f: - yaml.dump( - config_formatted, f, default_flow_style=False, sort_keys=False - ) - - yield - - for config_path in config_paths: - with open(config_path, "r") as f: - config = yaml.safe_load(f) - - config_formatted = { - attr: reformat_parameter(attr, param, "local->linux") - for attr, param in config.items() - } - - with open(config_path, "w") as f: - yaml.dump( - config_formatted, f, default_flow_style=False, sort_keys=False - ) - else: - yield - - -@pytest.fixture(scope="session") -def copy_interrupted_data(project_root, remove_project_root_contents): - os.makedirs(os.path.join(project_root, "data"), exist_ok=True) - - source_path = os.path.join( - "tests", "resources", "source_data", "test-data-categorical-1-interrupted-temp" - ) - target_path = os.path.join( - project_root, "data", "test-data-categorical-1-interrupted-temp" - ) - - shutil.copytree(source_path, target_path) - - -@pytest.fixture(scope="session") -def run_preprocessing( - project_root, - preprocessing_config_path_cat, - preprocessing_config_path_cat_multitarget, - preprocessing_config_path_real, - preprocessing_config_path_multi_file, - preprocessing_config_path_interrupted, - preprocessing_config_path_exact, - preprocessing_config_path_exact_pt, - format_configs_locally, - remove_project_root_contents, - copy_interrupted_data, -): - for data_number in [1, 3, 5, 50]: - data_path_cat = os.path.join( - "tests", - "resources", - "source_data", - f"test-data-categorical-{data_number}.csv", - ) - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_cat} --data-path {data_path_cat} --selected-columns None" - ) - - data_path_real = os.path.join( - "tests", "resources", "source_data", f"test-data-real-{data_number}.csv" - ) - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_real} --data-path {data_path_real} --selected-columns {SELECTED_COLUMNS['real'][data_number]}" - ) - - source_path = os.path.join("tests", "resources", "source_configs", "id_maps") - target_path = os.path.join(project_root, "configs", "id_maps") - shutil.copytree(source_path, target_path) - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_cat_multitarget}" - ) - shutil.rmtree(target_path) - - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_multi_file}" - ) - - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_interrupted}" - ) - - run_and_log(f"sequifier preprocess --config-path {preprocessing_config_path_exact}") - - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_exact_pt}" - ) - - source_path = os.path.join( - "tests", - "resources", - "source_data", - "test-data-real-1-split1-autoregression.csv", - ) - - target_path = os.path.join( - "tests", "project_folder", "data", "test-data-real-1-split1-autoregression.csv" - ) - - shutil.copyfile(source_path, target_path) - - os.makedirs(os.path.join(project_root, "scripts")) - source_path = os.path.join( - "tests", "resources", "source_scripts", "hp_search_eval_script.py" - ) - target_path = os.path.join(project_root, "scripts", "hp_search_eval_script.py") - shutil.copyfile(source_path, target_path) - - source_path = os.path.join( - "tests", "configs", "hyperparameter-search-custom-eval-inference.yaml" - ) - target_path = os.path.join( - project_root, "configs", "hyperparameter-search-custom-eval-inference.yaml" - ) - shutil.copyfile(source_path, target_path) - - -@pytest.fixture(scope="session") -def run_training( - run_preprocessing, - project_root, - training_config_path_cat, - training_config_path_real, - training_config_path_cat_inf_size_1, - training_config_path_cat_inf_size_3, - training_config_path_distributed, - training_config_path_distributed_lazy_parquet, - training_config_path_lazy, - training_config_path_cat_multitarget, - training_config_path_cat_multitarget_eager, -): - for model_number in [1, 3, 5, 50]: - metadata_config_path_cat = os.path.join( - "configs", "metadata_configs", f"test-data-categorical-{model_number}.json" - ) - model_name_cat = f"model-categorical-{model_number}" - run_and_log( - f"sequifier train --config-path {training_config_path_cat} --metadata-config-path {metadata_config_path_cat} --model-name {model_name_cat} --input-columns {SELECTED_COLUMNS['categorical'][model_number]}" - ) - - metadata_config_path_real = os.path.join( - "configs", "metadata_configs", f"test-data-real-{model_number}.json" - ) - model_name_real = f"model-real-{model_number}" - run_and_log( - f"sequifier train --config-path {training_config_path_real} --metadata-config-path {metadata_config_path_real} --model-name {model_name_real} --input-columns None" - ) - - run_and_log(f"sequifier train --config-path {training_config_path_cat_inf_size_1}") - - run_and_log(f"sequifier train --config-path {training_config_path_cat_inf_size_3}") - - run_and_log(f"sequifier train --config-path {training_config_path_cat_multitarget}") - - run_and_log( - f"sequifier train --config-path {training_config_path_cat_multitarget_eager}" - ) - - run_and_log(f"sequifier train --config-path {training_config_path_distributed}") - - run_and_log( - f"sequifier train --config-path {training_config_path_distributed_lazy_parquet}" - ) - - run_and_log(f"sequifier train --config-path {training_config_path_lazy}") - - source_path = os.path.join( - project_root, "models", "sequifier-model-real-1-best-3.pt" - ) - target_path = os.path.join( - project_root, "models", "sequifier-model-real-1-best-3-autoregression.pt" - ) - - shutil.copy(source_path, target_path) - - -@pytest.fixture(scope="session") -def copy_checkpoints(run_training, project_root): - src_ckpt = os.path.join(project_root, "checkpoints", "model-real-1-epoch-1.pt") - dst_ckpt = os.path.join( - project_root, "checkpoints", "model-real-1-from-epoch-checkpoint-epoch-1.pt" - ) - shutil.copy(src_ckpt, dst_ckpt) - - src_ckpt = os.path.join( - project_root, "checkpoints", "model-categorical-3-epoch-1.pt" - ) - dst_ckpt = os.path.join( - project_root, - "checkpoints", - "model-categorical-3-from-mid-epoch-checkpoint-epoch-1.pt", - ) - shutil.copy(src_ckpt, dst_ckpt) - - -@pytest.fixture(scope="session") -def run_training_from_checkpoint( - copy_checkpoints, - training_config_path_resume_epoch, - training_config_path_resume_mid_epoch, -): - run_and_log(f"sequifier train --config-path {training_config_path_resume_epoch}") - - run_and_log( - f"sequifier train --config-path {training_config_path_resume_mid_epoch}" - ) - - -@pytest.fixture(scope="session") -def run_hp_search( - project_root, hp_search_configs, format_configs_locally, run_preprocessing -): - run_and_log( - f"sequifier hyperparameter-search --config-path {hp_search_configs['grid']}" - ) - - run_and_log( - f"sequifier hyperparameter-search --config-path {hp_search_configs['sample']}" - ) - - run_and_log( - f"sequifier hyperparameter-search --config-path {hp_search_configs['bayesian']}" - ) - - run_and_log( - f"sequifier hyperparameter-search --config-path {hp_search_configs['custom-eval']}" - ) - - -@pytest.fixture(scope="session") -def copy_autoregression_model(project_root, run_training): - model_path = os.path.join( - project_root, "models", "sequifier-model-categorical-1-best-3.onnx" - ) - target_path = os.path.join( - project_root, - "models", - "sequifier-model-categorical-1-best-3-autoregression.onnx", - ) - shutil.copyfile(model_path, target_path) - - -@pytest.fixture(scope="session") -def run_inference( - project_root, - run_training, - copy_autoregression_model, - inference_config_path_cat, - inference_config_path_cat_multitarget, - inference_config_path_real, - inference_config_path_real_autoregression, - inference_config_path_categorical_autoregression, - inference_config_path_embedding, - inference_config_path_cat_inf_size_1, - inference_config_path_cat_inf_size_3, - inference_config_path_distributed, - inference_config_path_distributed_parquet, - inference_config_path_lazy, - inference_config_path_cat_inf_size_3_embedding, -): - for model_number in [1, 3, 5, 50]: - model_path_cat = os.path.join( - "models", f"sequifier-model-categorical-{model_number}-best-3.onnx" - ) - data_path_cat = os.path.join( - "data", f"test-data-categorical-{model_number}-split2" - ) - metadata_config_path_cat = os.path.join( - "configs", "metadata_configs", f"test-data-categorical-{model_number}.json" - ) - run_and_log( - f"sequifier infer --config-path {inference_config_path_cat} --metadata-config-path {metadata_config_path_cat} --model-path {model_path_cat} --data-path {data_path_cat} --input-columns {SELECTED_COLUMNS['categorical'][model_number]}" - ) - - model_path_real = os.path.join( - "models", f"sequifier-model-real-{model_number}-best-3.pt" - ) - data_path_real = os.path.join( - "data", f"test-data-real-{model_number}-split1.parquet" - ) - metadata_config_path_real = os.path.join( - "configs", "metadata_configs", f"test-data-real-{model_number}.json" - ) - run_and_log( - f"sequifier infer --config-path {inference_config_path_real} --metadata-config-path {metadata_config_path_real} --model-path {model_path_real} --data-path {data_path_real} --input-columns None" - ) - - run_and_log( - f"sequifier infer --config-path {inference_config_path_cat_multitarget}" - ) - - run_and_log( - f"sequifier infer --config-path {inference_config_path_real_autoregression} --input-columns {SELECTED_COLUMNS['real'][1]} --randomize" - ) - - run_and_log(f"sequifier infer --config-path {inference_config_path_cat_inf_size_1}") - - run_and_log(f"sequifier infer --config-path {inference_config_path_cat_inf_size_3}") - - run_and_log(f"sequifier infer --config-path {inference_config_path_distributed}") - - run_and_log( - f"sequifier infer --config-path {inference_config_path_distributed_parquet}" - ) - - run_and_log(f"sequifier infer --config-path {inference_config_path_lazy}") - - run_and_log( - f"sequifier infer --config-path {inference_config_path_categorical_autoregression} --input-columns itemId" - ) - - run_and_log( - f"sequifier infer --config-path {inference_config_path_embedding} --input-columns itemId" - ) - - run_and_log( - f"sequifier infer --config-path {inference_config_path_cat_inf_size_3_embedding}" - ) - - -@pytest.fixture() -def model_names_preds(): - model_names_preds = [ - f"model-{variant}-{model_number}-best-3" - for variant in ["categorical", "real"] - for model_number in [1, 3, 5, 50] - ] - model_names_preds += [ - "model-categorical-multitarget-5-best-3", - "model-categorical-multitarget-5-last-3", - "model-real-1-best-3-autoregression", - "model-categorical-1-best-3-autoregression", - "model-categorical-1-inf-size-best-3", - "model-categorical-3-inf-size-best-3", - "model-categorical-distributed-best-3", - "model-categorical-lazy-best-3", - ] - - return model_names_preds - - -@pytest.fixture() -def model_names_probs(): - model_names_probs = [ - f"model-categorical-{model_number}-best-3-itemId" - for model_number in [1, 3, 5, 50] - ] - model_names_probs += [ - f"model-categorical-multitarget-5-best-3-{col}" for col in ["itemId", "supCat1"] - ] - model_names_probs += [ - f"model-categorical-3-inf-size-best-3-{col}" - for col in ["itemId", "supCat1", "supCat2"] - ] - return model_names_probs - - -@pytest.fixture() -def model_names_embeddings(): - model_names_embeddings = [ - "model-categorical-1-best-embedding-3", - "model-categorical-3-inf-size-best-embedding-3", - ] - return model_names_embeddings - - -@pytest.fixture() -def targets(model_names_preds, model_names_probs, model_names_embeddings): - target_dict = {"preds": {}, "probs": {}, "embeds": {}} - for model_name in model_names_preds: - target_type = "categorical" if "categorical" in model_name else "real" - file_name = f"sequifier-{model_name}-predictions" - target_path = os.path.join( - "tests", "resources", "target_outputs", "predictions", file_name - ) - target_dict["preds"][model_name] = read_multi_file_preds( - target_path, target_type - ) - - for model_name in model_names_probs: - target_type = "categorical" if "categorical" in model_name else "real" - file_name = f"sequifier-{model_name}-probabilities" - target_path = os.path.join( - "tests", "resources", "target_outputs", "probabilities", file_name - ) - target_dict["probs"][model_name] = read_multi_file_preds( - target_path, target_type - ) - - for model_name in model_names_embeddings: - target_type = "categorical" if "categorical" in model_name else "real" - file_name = f"sequifier-{model_name}-embeddings" - target_path = os.path.join( - "tests", "resources", "target_outputs", "embeddings", file_name - ) - target_dict["embeds"][model_name] = read_multi_file_preds( - target_path, target_type - ) - - return target_dict - - -def read_multi_file_preds(path, target_type, file_suffix=None): - dtype = ( - { - **{TARGET_VARIABLE_DICT[target_type]: str}, - **{f"supCat{i+1}": str for i in range(50)}, - } - if target_type == "categorical" - else None - ) - if target_type == "categorical": - contents = [] - for root, dirs, files in os.walk(path): - for file in sorted(list(files)): - if file_suffix is None or file.endswith(file_suffix): - contents.append( - pl.read_csv(os.path.join(root, file), schema_overrides=dtype) - ) - assert len(contents) > 0, f"no files found for {path}" - return pl.concat(contents, how="vertical") - else: - return pl.read_csv(f"{path}.csv", separator=",", schema_overrides=dtype) - - -@pytest.fixture() -def predictions(run_inference, model_names_preds, project_root): - preds = {} - for model_name in model_names_preds: - target_type = "categorical" if "categorical" in model_name else "real" - - prediction_path = os.path.join( - project_root, - "outputs", - "predictions", - f"sequifier-{model_name}-predictions", - ) - - preds[model_name] = read_multi_file_preds(prediction_path, target_type) - - return preds - - -@pytest.fixture() -def probabilities(run_inference, model_names_probs, project_root): - probs = {} - for model_name in model_names_probs: - probabilities_path = os.path.join( - project_root, - "outputs", - "probabilities", - f"sequifier-{model_name}-probabilities", - ) - probs[model_name] = read_multi_file_preds( - probabilities_path, "categorical", "csv" - ) - - return probs - - -@pytest.fixture() -def embeddings(run_inference, model_names_embeddings, project_root): - embeds = {} - for model_name in model_names_embeddings: - embeddings_path = os.path.join( - project_root, - "outputs", - "embeddings", - f"sequifier-{model_name}-embeddings", - ) - embeds[model_name] = read_multi_file_preds( - embeddings_path, "categorical", "csv" - ) - return embeds diff --git a/tests/integration/test_hyperparameter_search.py b/tests/integration/test_hyperparameter_search.py deleted file mode 100644 index 00f42d25..00000000 --- a/tests/integration/test_hyperparameter_search.py +++ /dev/null @@ -1,66 +0,0 @@ -import glob -import json -import os - - -def test_hp_search_grid_outputs(run_hp_search, project_root): - hp_name = "test-hp-search-grid" - config_dir = os.path.join(project_root, "configs") - - generated_configs = glob.glob(os.path.join(config_dir, f"{hp_name}-run-*.yaml")) - assert ( - len(generated_configs) == 4 - ), f"Expected 4 grid configs, found {len(generated_configs)}" - - -def test_hp_search_sample_outputs(run_hp_search, project_root): - hp_name = "test-hp-search-sample" - config_dir = os.path.join(project_root, "configs") - - generated_configs = glob.glob(os.path.join(config_dir, f"{hp_name}-run-*.yaml")) - assert ( - len(generated_configs) == 4 - ), f"Expected 4 sample configs, found {len(generated_configs)}" - - -def test_hp_search_bayesian_outputs(run_hp_search, project_root): - hp_name = "test-hp-search-bayesian" - config_dir = os.path.join(project_root, "configs") - - generated_configs = glob.glob(os.path.join(config_dir, f"{hp_name}-run-*.yaml")) - assert ( - len(generated_configs) == 4 - ), f"Expected 4 bayesian configs, found {len(generated_configs)}" - - -def test_hp_search_state(run_hp_search, project_root): - state_dir = os.path.join(project_root, "state", "optuna") - - assert os.path.exists(os.path.join(state_dir, "test-hp-search-sample.db")) - assert os.path.exists(os.path.join(state_dir, "test-hp-search-grid.db")) - assert os.path.exists(os.path.join(state_dir, "test-hp-search-bayesian.db")) - assert os.path.exists(os.path.join(state_dir, "test-hp-search-custom-eval.db")) - - -def test_hp_search_inference_feedback_loop(run_hp_search, project_root): - # Verify that the evaluations directory was populated - eval_dir = os.path.join(project_root, "outputs", "evaluations") - assert os.path.exists(eval_dir), f"Evaluation directory {eval_dir} was not created." - - eval_files = [ - f - for f in os.listdir(eval_dir) - if f.startswith("test-hp-search-custom-eval-run-") and f.endswith(".json") - ] - - assert len(eval_files) == 4, f"Expected 4 evaluation JSONs, found {len(eval_files)}" - - for f in eval_files: - with open(os.path.join(eval_dir, f), "r") as fp: - metrics = json.load(fp) - assert "max" in metrics, f"'max' missing in {f}" - assert "stdev" in metrics, f"'stdev' missing in {f}" - - # Sanity check that metrics were actually calculated - assert isinstance(metrics["max"], int) - assert isinstance(metrics["stdev"], float) diff --git a/tests/integration/test_identities.py b/tests/integration/test_identities.py deleted file mode 100644 index 0495a56e..00000000 --- a/tests/integration/test_identities.py +++ /dev/null @@ -1,55 +0,0 @@ -import numpy as np -import pytest - - -@pytest.mark.optional -def test_identities(targets, predictions, probabilities, embeddings): - failed_models = [] - for model_name, preds in predictions.items(): - equal = preds.to_numpy() == targets["preds"][model_name].to_numpy() - mean_equal = np.mean(equal.astype(int)) - if model_name != "model-real-1-best-3-autoregression": - if not mean_equal == 1.0: - failed_models.append( - ( - model_name, - equal, - f"{model_name} preds are not identical to target: {preds.to_numpy() = } != {targets['preds'][model_name].to_numpy() = }: {equal = }, {mean_equal = }", - ) - ) - else: - if mean_equal == 1.0: - failed_models.append( - ( - model_name, - equal, - f"{model_name} preds are not randomized, {preds.to_numpy() = } == {targets['preds'][model_name].to_numpy() = }: {equal = }, {mean_equal = }", - ) - ) - - for model_name, probs in probabilities.items(): - equal = probs.to_numpy() == targets["probs"][model_name].to_numpy() - all_equal = np.all(equal) - if not all_equal: - failed_models.append( - (model_name, equal, f"{model_name} probs are not identical to target") - ) - - for model_name, embeds in embeddings.items(): - equal = embeds.to_numpy() == targets["embeds"][model_name].to_numpy() - all_equal = np.all(equal) - if not all_equal: - failed_models.append( - ( - model_name, - equal, - f"{model_name} embeddings are not identical to target", - ) - ) - - if len(failed_models): - print(failed_models) - failed_models_subset = [(model, message) for model, _, message in failed_models] - assert ( - len(failed_models) == 0 - ), f"{len(failed_models) = } - {failed_models_subset}" diff --git a/tests/integration/test_inference.py b/tests/integration/test_inference.py deleted file mode 100644 index 10f885c7..00000000 --- a/tests/integration/test_inference.py +++ /dev/null @@ -1,195 +0,0 @@ -import numpy as np -import polars as pl - -TARGET_VARIABLE_DICT = {"categorical": "itemId", "real": "itemValue"} - - -def test_predictions_real(predictions): - for model_name, model_predictions in predictions.items(): - if "categorical" not in model_name or "multitarget" in model_name: - if "multitarget" not in model_name: - assert np.all( - [ - v > -10.0 and v < 10.0 - for v in model_predictions[ - TARGET_VARIABLE_DICT["real"] - ].to_numpy() - ] - ) - else: - assert np.all( - [ - v > -10.0 and v < 10.0 - for v in model_predictions["supReal3"].to_numpy() - ] - ), model_predictions - - -def test_predictions_cat(predictions): - valid_values = [str(x) for x in np.arange(100, 130)] + ["unknown"] - for model_name, model_predictions in predictions.items(): - if "categorical" in model_name or "multitarget" in model_name: - assert np.all( - [ - v in valid_values - for v in model_predictions[ - TARGET_VARIABLE_DICT["categorical"] - ].to_numpy() - ] - ), model_predictions - - if "multitarget" in model_name: - admssible_vals = [str(x) for x in np.arange(0, 10)] + [ - "unknown", - "other", - ] - assert np.all( - [ - v in admssible_vals - for v in model_predictions["supCat1"].to_numpy() - ] - ), model_predictions - - if "inf" in model_name: - prediction_length = 3 - n_test_rows = model_predictions.height - baseline_preds = predictions["model-categorical-1-best-3"] - n_baseline_rows = baseline_preds.height - - # 3. Assert the number of rows is scaled by prediction_length - assert n_test_rows == n_baseline_rows * prediction_length, ( - f"Expected {n_baseline_rows * prediction_length} rows for prediction_length={prediction_length}, " - f"but found {n_test_rows} rows." - ) - - # 4. Assert correct number of predictions per sequence - baseline_rows_per_seq = ( - baseline_preds.group_by("sequenceId").len().height - ) - test_rows_per_seq_groups = model_predictions.group_by( - "sequenceId" - ).len() - - assert baseline_rows_per_seq == test_rows_per_seq_groups.height - assert ( - test_rows_per_seq_groups["len"] == prediction_length - ).all(), ( - f"Test should have {prediction_length} predictions per sequence" - ) - - -def test_probabilities(probabilities): - for model_name, model_probabilities in probabilities.items(): - if "itemId" in model_name: - assert model_probabilities.shape[1] == 32 - elif "supCat1" in model_name: - assert model_probabilities.shape[1] == 12 - - np.testing.assert_almost_equal( - model_probabilities.sum_horizontal(), - np.ones(model_probabilities.shape[0]), - decimal=5, - ) - - -def test_multi_pred(predictions): - multitarget_models = [name for name in predictions.keys() if "multitarget" in name] - - for model_name in multitarget_models: - preds = predictions[model_name] - - assert preds.shape[0] > 0, f"{model_name} has no predictions" - assert preds.shape[1] == 5, f"{model_name} should have 5 columns" - - admssible_vals = [str(x) for x in np.arange(0, 10)] + ["unknown", "other"] - - assert np.all( - [v in admssible_vals for v in preds["supCat1"]] - ), f"Invalid supCat1 values in {model_name}" - assert np.all(preds["supReal3"].to_numpy() > -4.0) and np.all( - preds["supReal3"].to_numpy() < 4.0 - ), f"supReal3 out of bounds in {model_name}" - - -def test_embeddings(embeddings): - for model_name, model_embeddings in embeddings.items(): - if "categorical-1" in model_name: - assert model_embeddings.shape[0] == 10 - assert model_embeddings.shape[1] == 203 - assert np.abs(model_embeddings[:, 1:].to_numpy().mean()) < 0.3 - if "categorical-3" in model_name: - assert model_embeddings.shape[0] == 30 - assert model_embeddings.shape[1] == 203 - assert np.abs(model_embeddings[:, 1:].to_numpy().mean()) < 0.3 - - -def test_predictions_item_position(predictions): - """ - Checks if itemPosition increments correctly within each sequenceId. - """ - for model_name, preds_df in predictions.items(): - # Ensure correct sorting for comparison - preds_df_sorted = preds_df.sort("sequenceId", "itemPosition") - - # Calculate differences and sequence changes - preds_with_diffs = preds_df_sorted.with_columns( - (pl.col("itemPosition") - pl.col("itemPosition").shift(1)).alias( - "pos_diff" - ), - (pl.col("sequenceId") == pl.col("sequenceId").shift(1)).alias("same_seq"), - ) - - # Filter for rows within the same sequence (excluding the first row of each sequence) - within_sequence_diffs = preds_with_diffs.filter(pl.col("same_seq")) - - # Check if all position differences within sequences are 1 - incorrect_increments = within_sequence_diffs.filter(pl.col("pos_diff") != 1) - - assert incorrect_increments.height == 0, ( - f"Model '{model_name}': Found incorrect itemPosition increments within sequences:\n" - f"{incorrect_increments}" - ) - - -def test_embeddings_subsequence_id(embeddings): - """ - Checks if subsequenceId increments correctly within each sequenceId - and starts at 0 for each new sequence. - """ - for model_name, embeds_df in embeddings.items(): - # Ensure correct sorting - embeds_df_sorted = embeds_df.sort("sequenceId", "subsequenceId") - - shift_val = 0 - if "categorical-1" in model_name: - shift_val = 1 - if "categorical-3" in model_name: - shift_val = 3 - - # Calculate differences and sequence changes - embeds_with_diffs = embeds_df_sorted.with_columns( - (pl.col("subsequenceId") - pl.col("subsequenceId").shift(shift_val)).alias( - "subseq_diff" - ), - (pl.col("sequenceId") == pl.col("sequenceId").shift(shift_val)).alias( - "same_seq" - ), - ) - - # 1. Check if subsequenceId starts at 0 for each new sequence - first_subsequences = embeds_with_diffs.filter( - pl.col("same_seq") == False # noqa: E712 - ) # First row of each sequence - incorrect_starts = first_subsequences.filter(pl.col("subsequenceId") != 0) - assert incorrect_starts.height == 0, ( - f"Model '{model_name}': Found sequences where subsequenceId does not start at 0:\n" - f"{incorrect_starts}" - ) - - # 2. Check if subsequenceId increments by 1 within sequences - within_sequence_diffs = embeds_with_diffs.filter(pl.col("same_seq")) - incorrect_increments = within_sequence_diffs.filter(pl.col("subseq_diff") != 1) - assert incorrect_increments.height == 0, ( - f"Model '{model_name}': Found incorrect subsequenceId increments within sequences:\n" - f"{incorrect_increments}" - ) diff --git a/tests/integration/test_make.py b/tests/integration/test_make.py deleted file mode 100644 index d4b3cd26..00000000 --- a/tests/integration/test_make.py +++ /dev/null @@ -1,185 +0,0 @@ -import os -import shutil -import time - -import pytest -import yaml -from conftest import reformat_parameter - -test_project_name = os.path.join("tests", "sequifier-make-test-project") - - -@pytest.fixture -def setup_for_test_make(): - if os.path.exists(test_project_name): - shutil.rmtree(test_project_name) - time.sleep(1) - os.system(f"sequifier make {test_project_name}") - - -@pytest.fixture -def config_strings(setup_for_test_make): - def load_config_string(path): - with open(path, "r") as f: - config_string = f.read() - - return config_string - - config_strings = { - config_name: load_config_string( - os.path.join(test_project_name, "configs", f"{config_name}.yaml") - ) - for config_name in ["preprocess", "train", "infer"] - } - return config_strings - - -@pytest.fixture -def adapt_configs(config_strings): - preprocess_config_path = os.path.join( - test_project_name, "configs", "preprocess.yaml" - ) - with open(preprocess_config_path, "r") as f: - preprocess_config_string = f.read() - - preprocess_config_string = ( - preprocess_config_string.replace( - "project_root: .", f"project_root: {test_project_name}" - ) - .replace( - "data_path: PLEASE FILL", - "data_path: tests/resources/source_data/test-data-categorical-1.csv", - ) - .replace( - "selected_columns: [EXAMPLE_INPUT_COLUMN_NAME]", "selected_columns: " - ) - .replace("input_columns: [EXAMPLE_INPUT_COLUMN_NAME]", "input_columns: ") - .replace("seq_length: 48", "seq_length: 10") - .replace("max_rows: null", "max_rows: null\nn_cores: 1") - ) - - with open(preprocess_config_path, "w") as f: - f.write(preprocess_config_string) - - train_config_path = os.path.join(test_project_name, "configs", "train.yaml") - with open(train_config_path, "r") as f: - train_config_string = f.read() - - train_config_string = ( - train_config_string.replace( - "project_root: .", f"project_root: {test_project_name}" - ) - .replace("model_name: PLEASE FILL", "model_name: default") - .replace( - "metadata_config_path: PLEASE FILL", - f"metadata_config_path: {test_project_name}/configs/metadata_configs/test-data-categorical-1.json", - ) - .replace( - "export_generative_model: PLEASE FILL", "export_generative_model: true" - ) - .replace( - "export_embedding_model: PLEASE FILL", "export_embedding_model: false" - ) - .replace("[EXAMPLE_INPUT_COLUMN_NAME]", "[itemId]") - .replace("[EXAMPLE_TARGET_COLUMN_NAME]", "[itemId]") - .replace("EXAMPLE_TARGET_COLUMN_NAME: real", "itemId: categorical") - .replace("EXAMPLE_INPUT_COLUMN_NAME:", "itemId: 128") - .replace("EXAMPLE_TARGET_COLUMN_NAME: MSELoss", "itemId: CrossEntropyLoss") - .replace("epochs: 10", "epochs: 3") - .replace("device: cuda", "device: cpu") - .replace("seq_length: 48", "seq_length: 10") - .replace("total_steps: PLEASE FILL", "total_steps: 10000") - ) - - with open(train_config_path, "w") as f: - f.write(train_config_string) - - infer_config_path = os.path.join(test_project_name, "configs", "infer.yaml") - with open(infer_config_path, "r") as f: - infer_config_string = f.read() - - infer_config_string = ( - infer_config_string.replace( - "project_root: .", f"project_root: {test_project_name}" - ) - .replace("model_type: PLEASE FILL", "model_type: generative") - .replace( - "metadata_config_path: PLEASE FILL", - f"metadata_config_path: {test_project_name}/configs/metadata_configs/test-data-categorical-1.json", - ) - .replace( - "model_path: PLEASE FILL", - f"model_path: {test_project_name}/models/sequifier-default-best-3.onnx", - ) - .replace( - "data_path: PLEASE FILL", - f"data_path: {test_project_name}/data/test-data-categorical-1-split2.parquet", - ) - .replace("[EXAMPLE_INPUT_COLUMN_NAME]", "[itemId]") - .replace("[EXAMPLE_TARGET_COLUMN_NAME]", "[itemId]") - .replace("seq_length: 48", "seq_length: 10") - .replace("autoregression: true", "autoregression: false") - .replace("EXAMPLE_TARGET_COLUMN_NAME: real", "itemId: categorical") - ) - - with open(infer_config_path, "w") as f: - f.write(infer_config_string) - - from sys import platform - - if platform == "windows": - for config_path in [ - preprocess_config_path, - train_config_path, - infer_config_path, - ]: - with open(config_path, "r") as f: - config = yaml.safe_load(f) - - config_formatted = { - attr: reformat_parameter(attr, param, "linux->local") - for attr, param in config.items() - } - - with open(config_path, "w") as f: - yaml.dump( - config_formatted, f, default_flow_style=False, sort_keys=False - ) - - -def test_make(adapt_configs): - return_code = os.system( - f"sequifier preprocess --config-path {test_project_name}/configs/preprocess.yaml" - ) - if return_code == 0: - return_code = os.system( - f"sequifier train --config-path {test_project_name}/configs/train.yaml" - ) - if return_code == 0: - return_code = os.system( - f"sequifier infer --config-path {test_project_name}/configs/infer.yaml" - ) - assert ( - return_code == 0 - ), f"Inference for 'sequifier infer --config-path {test_project_name}/configs/infer.yaml' was unsuccessful" - else: - assert False, f"Training for 'sequifier train --config-path {test_project_name}/configs/train.yaml' was unsuccessful" - else: - assert False, f"Preprocessing for 'sequifier preprocess --config-path {test_project_name}/configs/train.yaml' was unsuccessful" - - # clean up, only if tests didn't fail - shutil.rmtree(test_project_name) - - -def test_config_folder(config_strings): - from sequifier.make import ( - infer_config_string, - preprocess_config_string, - train_config_string, - ) - - assert config_strings["preprocess"].strip() == preprocess_config_string.strip() - - assert config_strings["train"].strip() == train_config_string.strip() - - assert config_strings["infer"].strip() == infer_config_string.strip() diff --git a/tests/integration/test_preprocessing.py b/tests/integration/test_preprocessing.py deleted file mode 100644 index 209ad49c..00000000 --- a/tests/integration/test_preprocessing.py +++ /dev/null @@ -1,450 +0,0 @@ -import json -import os - -import numpy as np -import polars as pl -import pytest -import torch -from conftest import run_and_log - - -@pytest.fixture() -def metadata_configs(run_preprocessing, project_root): - metadata_configs = {} - for data_number in [1, 3, 5, 50]: - for variant in ["categorical", "real"]: - file_name = f"test-data-{variant}-{data_number}.json" - with open( - os.path.join(project_root, "configs", "metadata_configs", file_name), - "r", - ) as f: - dd_conf = json.loads(f.read()) - metadata_configs[file_name] = dd_conf - return metadata_configs - - -def test_metadata_config(metadata_configs): - for file_name, metadata_config in metadata_configs.items(): - print(f"Verifying metadata_config for: {file_name}") - assert np.all( - np.array(list(metadata_config.keys())) - == np.array( - [ - "n_classes", - "id_maps", - "split_paths", - "column_types", - "selected_columns_statistics", - ] - ) - ), list(metadata_config.keys()) - - assert metadata_config["split_paths"][0].endswith( - "split0.parquet" - ) or metadata_config["split_paths"][0].endswith("split0") - - if "itemId" in metadata_config["n_classes"]: - assert len(metadata_config["id_maps"]["itemId"]) == 30 - assert metadata_config["n_classes"]["itemId"] == 32 - - id_map_keys = np.array( - sorted(list(metadata_config["id_maps"]["itemId"].keys())) - ) - # assert False, np.array([str(x) for x in range(100, 130)]) - assert np.all(id_map_keys == np.array([str(x) for x in range(100, 130)])) - - for col in metadata_config["id_maps"].keys(): - id_map_values = np.array( - sorted(list(metadata_config["id_maps"][col].values())) - ) - # assert False, id_map_values - assert np.all( - id_map_values == np.arange(2, len(id_map_values) + 2) - ), id_map_values - - if "itemValue" in metadata_config["selected_columns_statistics"]: - assert "std" in metadata_config["selected_columns_statistics"]["itemValue"] - assert "mean" in metadata_config["selected_columns_statistics"]["itemValue"] - - -def load_parquet_folder_outputs(path): - """Reads a directory of Parquet chunks into a single sorted Polars DataFrame.""" - # Polars natively supports reading all matching files via glob patterns - data = pl.read_parquet(os.path.join(path, "*.parquet")) - - other_cols = [ - col - for col in data.columns - if col not in ["sequenceId", "subsequenceId", "startItemPosition", "inputCol"] - ] - - return data[ - ["sequenceId", "subsequenceId", "startItemPosition", "inputCol"] + other_cols - ].sort(["sequenceId", "subsequenceId", "startItemPosition", "inputCol"]) - - -def load_pt_outputs(path): - contents = [] - for root, _, files in os.walk(path): - for file in sorted(list(files)): - if file.endswith("pt"): - ( - sequences, - sequence_id, - subsequence_id, - start_item_position, - ) = torch.load(os.path.join(root, file)) - sequences2 = {} - for col, vals in sequences.items(): - vals2 = vals.numpy() - - for offset in range(vals2.shape[1] - 1, -1, -1): - sequences2[str(offset)] = np.concatenate( - [sequences2.get(str(offset), []), vals2[:, -(offset + 1)]], - axis=0, - ) - - sequences2["sequenceId"] = np.concatenate( - [ - sequences2.get("sequenceId", []), - sequence_id.numpy().astype(int), - ], - axis=0, - ) - sequences2["inputCol"] = np.concatenate( - [ - sequences2.get("inputCol", []), - np.repeat(col, vals2.shape[0]), - ], - axis=0, - ) - sequences2["subsequenceId"] = np.concatenate( - [sequences2.get("subsequenceId", []), subsequence_id], - axis=0, - ) - sequences2["startItemPosition"] = np.concatenate( - [ - sequences2.get("startItemPosition", []), - start_item_position, - ] - ) - - content = pl.DataFrame(sequences2) - contents.append(content) - - assert len(contents) > 0, f"no files found for {path}" - data = pl.concat(contents, how="vertical") - other_cols = [ - col - for col in data.columns - if col not in ["sequenceId", "subsequenceId", "startItemPosition", "inputCol"] - ] - return data[ - ["sequenceId", "subsequenceId", "startItemPosition", "inputCol"] + other_cols - ].sort(["sequenceId", "subsequenceId", "startItemPosition", "inputCol"]) - - -def read_preprocessing_outputs(path, variant): - if variant == "real": - return pl.read_parquet(f"{path}.parquet") - elif variant == "categorical": - if os.path.isdir(path) and any( - f.endswith(".parquet") for f in os.listdir(path) - ): - return load_parquet_folder_outputs(path) - return load_pt_outputs(path) - - -@pytest.fixture() -def data_splits(project_root, split_groups): - data_split_values = { - f"{j}-{variant}": [ - read_preprocessing_outputs( - os.path.join(project_root, "data", f"test-data-{variant}-{j}-split{i}"), - variant, - ) - for i in range(split_groups[variant]) - ] - for variant in ["categorical", "real"] - for j in [1, 3, 5, 50] - } - - return data_split_values - - -def test_preprocessed_data_real(data_splits): - for j in [1, 3, 5, 50]: - name = f"{j}-real" - assert len(data_splits[name]) == 2 - - for i, data in enumerate(data_splits[name]): - number_expected_columns = 13 - assert data.shape[1] == ( - number_expected_columns - ), f"{name = } - {i = }: {data.shape = } - {data.columns = }" - for sequenceId, group in data.group_by("sequenceId"): - # offset by j in either direction as that is the number of columns in the input - # data, thus an offset by 1 'observation' requires an offset by j values - assert np.all((group["1"].to_numpy()[:-j] == group["2"].to_numpy()[j:])) - assert np.all((group["5"].to_numpy()[:-j] == group["6"].to_numpy()[j:])) - - -def test_preprocessed_data_categorical(data_splits): - for j in [1, 3, 5, 50]: - name = f"{j}-categorical" - assert len(data_splits[name]) == 3 - - for i, data in enumerate(data_splits[name]): - number_expected_columns = 13 - assert data.shape[1] == ( - number_expected_columns - ), f"{name = } - {i = }: {data.shape = } - {data.columns = }" - - for sequenceId, group in data.group_by("sequenceId"): - # offset by j in either direction as that is the number of columns in the input - # data, thus an offset by 1 'observation' requires an offset by j values - assert np.all( - np.abs(group["1"].to_numpy()[:-j] - group["2"].to_numpy()[j:]) - < 0.0001 - ), f'{list(group["1"].to_numpy()[:-j]) = } != {list(group["2"].to_numpy()[j:]) = }' - assert np.all( - np.abs(group["5"].to_numpy()[:-j] - group["6"].to_numpy()[j:]) - < 0.0001 - ), f'{list(group["5"].to_numpy()[:-j]) = } != {list(group["6"].to_numpy()[j:]) = }' - - -def unnest(list_var): - return [x for y in list_var for x in y] - - -def test_preprocessed_data_multi_file(run_preprocessing): - for split in range(3): - file_list = [] - for root, _, files in os.walk( - os.path.join( - "tests", - "project_folder", - "data", - f"test-data-categorical-multi-file-split{split}", - ) - ): - for file in files: - file_list.append(file) - - file_list = sorted(file_list) - - expected_file_list = sorted( - ["metadata.json"] - + unnest( - [ - [ - f"test-data-categorical-multi-file-{source_file}-0-split{split}-0-{str(seq_id).zfill(2)}.pt" - ] - for source_file in range(3) - for seq_id in range(13) - ] - ) - ) - assert len(file_list) == len( - expected_file_list - ), f"{file_list = }, {expected_file_list = }" - assert np.all( - np.array(file_list) == np.array(expected_file_list) - ), f"for split: {split}:\n{set(file_list).difference(set(expected_file_list))} not found\n{set(expected_file_list).difference(set(file_list))} extra" - - -def test_preprocessed_data_exact(run_preprocessing): - parquet_out_path = os.path.join( - "tests", - "project_folder", - "data", - "test-data-categorical-3-equal-split0.parquet", - ) - pt_out_path = os.path.join( - "tests", "project_folder", "data", "test-data-categorical-3-equal-split0" - ) - - parquet_output = pl.read_parquet(parquet_out_path) - pt_output = load_pt_outputs(pt_out_path) - - assert np.all( - parquet_output.to_numpy()[:, [0, 1, 2, 4, 5, 6, 7, 8, 9]] - == pt_output.to_numpy()[:, [0, 1, 2, 4, 5, 6, 7, 8, 9]].astype(int) - ), f"{np.sum(parquet_output.to_numpy()[:,[0,1,2,4,5,6,7,8,9]] == pt_output.to_numpy()[:,[0,1,2,4,5,6,7,8,9]].astype(int)) = }" - - assert np.all( - parquet_output["sequenceId"].to_numpy() == np.repeat(np.arange(10), 9) - ) - - assert np.all( - parquet_output["subsequenceId"].to_numpy() - == np.tile(np.repeat(np.arange(3), 3), 10) - ) - - -def test_preprocessing_interrupted(run_preprocessing, metadata_configs): - with open( - os.path.join( - "tests", - "project_folder", - "configs", - "metadata_configs", - "test-data-categorical-1-interrupted.json", - ), - "r", - ) as f: - interrupted_metadata_config = json.loads(f.read()) - baseline_metadata_config = metadata_configs["test-data-categorical-1.json"] - - interrupted_metadata_config_adapted = interrupted_metadata_config - interrupted_metadata_config_adapted["split_paths"] = [ - path.replace("categorical-1-interrupted", "categorical-1") - for path in interrupted_metadata_config_adapted["split_paths"] - ] - - assert str(interrupted_metadata_config_adapted) == str( - baseline_metadata_config - ), f"{interrupted_metadata_config_adapted = } != {baseline_metadata_config = }" - - baseline_output = { - split: load_pt_outputs( - os.path.join( - "tests", - "project_folder", - "data", - f"test-data-categorical-1-split{split}", - ) - ) - for split in range(3) - } - interrupted_output = { - split: load_pt_outputs( - os.path.join( - "tests", - "project_folder", - "data", - f"test-data-categorical-1-interrupted-split{split}", - ) - ) - for split in range(3) - } - - for split in range(3): - assert np.all( - interrupted_output[split].to_numpy() == baseline_output[split].to_numpy() - ), f"interrupted output != baseline output for split {split}" - - -def test_preprocessing_from_precomputed_stats( - run_preprocessing, - project_root, - preprocessing_config_path_cat_precomputed_stats, - preprocessing_config_path_cat_precomputed_stats_negative, -): - """ - Tests that providing a preexisting metadata config produces identical - outputs to the standard run, bypassing metadata computation. - """ - - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_cat_precomputed_stats}" - ) - - run_and_log( - f"sequifier preprocess --config-path {preprocessing_config_path_cat_precomputed_stats_negative}" - ) - - preprocessing_output_path = os.path.join( - "tests", - "project_folder", - "data", - "test-data-categorical-precomputed-stats-split0.parquet", - ) - - preprocessing_output = pl.read_parquet(preprocessing_output_path) - - preprocessing_output_negative_path = os.path.join( - "tests", - "project_folder", - "data", - "test-data-categorical-precomputed-stats-negative-split0.parquet", - ) - - preprocessing_output_negative = pl.read_parquet(preprocessing_output_negative_path) - - assert np.all( - preprocessing_output[ - ["sequenceId", "subsequenceId", "startItemPosition"] - ].to_numpy() - == preprocessing_output_negative[ - ["sequenceId", "subsequenceId", "startItemPosition"] - ].to_numpy() - ) - - metadata_cols = ["sequenceId", "subsequenceId", "startItemPosition", "inputCol"] - - assert ( - np.mean( - np.isclose( - preprocessing_output.filter(pl.col("inputCol") == "supReal2") - .drop(metadata_cols) - .to_numpy() - * 2, - preprocessing_output_negative.filter(pl.col("inputCol") == "supReal2") - .drop(metadata_cols) - .to_numpy(), - rtol=1e-01, - ) - ) - > 0.5 - ) - - assert ( - np.mean( - np.isclose( - preprocessing_output.filter(pl.col("inputCol") == "supReal3") - .drop(metadata_cols) - .to_numpy() - / 2, - preprocessing_output_negative.filter(pl.col("inputCol") == "supReal3") - .drop(metadata_cols) - .to_numpy(), - rtol=1e-01, - ) - ) - > 0.5 - ) - - assert ( - np.mean( - preprocessing_output.filter(pl.col("inputCol") == "itemId") - .drop(metadata_cols) - .to_numpy() - != preprocessing_output_negative.filter(pl.col("inputCol") == "itemId") - .drop(metadata_cols) - .to_numpy() - ) - > 0.1 - ) - assert ( - np.mean( - preprocessing_output.filter(pl.col("inputCol") == "supCat1") - .drop(metadata_cols) - .to_numpy() - != preprocessing_output_negative.filter(pl.col("inputCol") == "supCat1") - .drop(metadata_cols) - .to_numpy() - ) - > 0.1 - ) - assert ( - np.mean( - preprocessing_output.filter(pl.col("inputCol") == "supCat4") - .drop(metadata_cols) - .to_numpy() - != preprocessing_output_negative.filter(pl.col("inputCol") == "supCat4") - .drop(metadata_cols) - .to_numpy() - ) - > 0.1 - ) diff --git a/tests/integration/test_training.py b/tests/integration/test_training.py deleted file mode 100644 index 1fb9fc51..00000000 --- a/tests/integration/test_training.py +++ /dev/null @@ -1,150 +0,0 @@ -import os - -import numpy as np - - -def test_checkpoint_files_exists( - run_training, run_training_from_checkpoint, project_root -): - found_items = np.array( - sorted(list(os.listdir(os.path.join(project_root, "checkpoints")))) - ) - expected_items = np.array( - sorted( - [ - f"model-{model_type}-{j}-epoch-{i}.pt" - for model_type in ["categorical", "real"] - for j in [1, 3, 5, 50] - for i in range(1, 4) - ] - + [ - f"model-real-{j}-epoch-{i}-batch-1.pt" - for j in [1, 3, 5, 50] - for i in range(1, 4) - ] - + [f"model-real-{j}-latest.pt" for j in [1, 3, 5, 50]] - + [f"model-real-1-from-epoch-checkpoint-epoch-{i}.pt" for i in range(1, 4)] - + [ - f"model-categorical-3-from-mid-epoch-checkpoint-epoch-{i}.pt" - for i in range(1, 4) - ] - + [ - f"model-categorical-{j}-inf-size-epoch-{i}.pt" - for j in [1, 3] - for i in range(1, 4) - ] - + [f"model-categorical-multitarget-5-epoch-{i}.pt" for i in range(1, 4)] - + [ - f"model-categorical-multitarget-5-eager-epoch-{i}.pt" - for i in range(1, 4) - ] - + [f"model-categorical-distributed-epoch-{i}.pt" for i in range(1, 4)] - + [ - f"model-categorical-distributed-lazy-parquet-epoch-{i}.pt" - for i in range(1, 4) - ] - + [f"model-categorical-lazy-epoch-{i}.pt" for i in range(1, 4)] - ) - ) - - print(f"{expected_items = }") - print(f"{found_items = }") - - assert np.all( - found_items == expected_items - ), f"{found_items = } != {expected_items = }" - - -def test_model_files_exists(run_training, run_training_from_checkpoint, project_root): - model_type_formats = {"categorical": ["onnx", "pt"], "real": ["onnx", "pt"]} - found_items = np.array( - sorted( - [ - f - for f in os.listdir(os.path.join(project_root, "models")) - if not f.endswith(".onnx.data") - ] - ) - ) - - expected_items = np.array( - sorted( - [ - f"sequifier-model-{model_type2}-{j}-{kind}{model_type}-3.{model_type_format}" - for model_type2 in ["categorical", "real"] - for model_type in ["", "-embedding"] - for model_type_format in model_type_formats[model_type2] - for j in [1, 3, 5, 50] - for kind in ["best", "last"] - ] - + [ - f"sequifier-model-categorical-3-from-mid-epoch-checkpoint-{kind}{model_type}-3.{model_type_format}" - for model_type in ["", "-embedding"] - for kind in ["best", "last"] - for model_type_format in ["pt", "onnx"] - ] - + [ - f"sequifier-model-real-1-from-epoch-checkpoint-{kind}-embedding-3.{model_type_format}" - for kind in ["best", "last"] - for model_type_format in ["pt", "onnx"] - ] - + [ - "sequifier-model-categorical-multitarget-5-best-3.onnx", - "sequifier-model-categorical-multitarget-5-last-3.onnx", - "sequifier-model-categorical-multitarget-5-best-embedding-3.onnx", - "sequifier-model-categorical-multitarget-5-last-embedding-3.onnx", - "sequifier-model-categorical-multitarget-5-eager-best-3.onnx", - "sequifier-model-categorical-multitarget-5-eager-last-3.onnx", - "sequifier-model-categorical-multitarget-5-eager-best-embedding-3.onnx", - "sequifier-model-categorical-multitarget-5-eager-last-embedding-3.onnx", - "sequifier-model-real-1-best-3-autoregression.pt", - "sequifier-model-categorical-1-best-3-autoregression.onnx", - "sequifier-model-categorical-1-inf-size-best-3.onnx", - "sequifier-model-categorical-1-inf-size-last-3.onnx", - "sequifier-model-categorical-1-inf-size-best-embedding-3.onnx", - "sequifier-model-categorical-1-inf-size-last-embedding-3.onnx", - "sequifier-model-categorical-3-inf-size-best-3.pt", - "sequifier-model-categorical-3-inf-size-last-3.pt", - "sequifier-model-categorical-3-inf-size-best-embedding-3.pt", - "sequifier-model-categorical-3-inf-size-last-embedding-3.pt", - "sequifier-model-categorical-distributed-best-3.pt", - "sequifier-model-categorical-distributed-best-3.onnx", - "sequifier-model-categorical-distributed-last-3.pt", - "sequifier-model-categorical-distributed-last-3.onnx", - "sequifier-model-categorical-distributed-lazy-parquet-best-3.pt", - "sequifier-model-categorical-distributed-lazy-parquet-best-3.onnx", - "sequifier-model-categorical-distributed-lazy-parquet-last-3.pt", - "sequifier-model-categorical-distributed-lazy-parquet-last-3.onnx", - "sequifier-model-categorical-lazy-best-3.pt", - "sequifier-model-categorical-lazy-best-3.onnx", - "sequifier-model-categorical-lazy-last-3.pt", - "sequifier-model-categorical-lazy-last-3.onnx", - ] - + [ - f"sequifier-test-hp-search-sample-run-{i}-{suffix}-1.pt" - for i in range(4) - for suffix in ["best", "last"] - ] - + [ - f"sequifier-test-hp-search-grid-run-{i}-{suffix}-2.pt" - for i in range(4) - for suffix in ["best", "last"] - ] - + [ - f"sequifier-test-hp-search-bayesian-run-{i}-{suffix}-1.pt" - for i in range(4) - for suffix in ["best", "last"] - ] - + [ - f"sequifier-test-hp-search-custom-eval-run-{i}-{suffix}-1.onnx" - for i in range(4) - for suffix in ["best", "last"] - ] - ) - ) - - print(f"{expected_items = }") - print(f"{found_items = }") - assert np.all( - found_items == expected_items - ), f"{found_items = } != {expected_items = }" diff --git a/tests/integration/test_visualize_training.py b/tests/integration/test_visualize_training.py deleted file mode 100644 index 5190d7a2..00000000 --- a/tests/integration/test_visualize_training.py +++ /dev/null @@ -1,57 +0,0 @@ -import glob -import os - -from conftest import run_and_log - - -def test_visualize_training( - run_training, run_training_from_checkpoint, run_hp_search, project_root -): - # Dynamically find all models that were trained and logged - log_dir = os.path.join(project_root, "logs") - log_files = glob.glob(os.path.join(log_dir, "sequifier-*-rank0-*.txt")) - - models = set() - for lf in log_files: - filename = os.path.basename(lf) - # Extract model name by stripping known prefix and suffix - name = filename[len("sequifier-") :] - name = name.rsplit("-rank0-", 1)[0] - models.add(name) - - single_models = sorted([m for m in models if "categorical" in m or "real" in m]) - assert len(single_models) > 0, "No single models found in logs directory" - - hp_models_grid = sorted([m for m in models if "hp-search-grid-run" in m]) - assert len(hp_models_grid) > 0, "No hp grid models found in logs directory" - - # 1. Test running visualize-training for each model individually - # model_outputs = {} - for model in single_models: - # visualize_training.py expects to find "logs/" relative to the working directory - command = f"sequifier visualize-training {model} --project-root {project_root}" - run_and_log(command) - - output_path = os.path.join( - project_root, - "outputs", - "visualization", - f"{model}-training-visualization.html", - ) - assert os.path.exists( - output_path - ), f"Visualization output not found for {model}" - - # 2. Test running visualize-training for all models jointly - models_str = ",".join(hp_models_grid) - command_joint = f"sequifier visualize-training {models_str} --project-root {project_root} --log-scale --bucket-training-batches 5" - run_and_log(command_joint) - - output_path_joint = os.path.join( - project_root, - "outputs", - "visualization", - "multi-model-training-visualization.html", - ) - - assert os.path.exists(output_path_joint), "Joint visualization output not found" diff --git a/tests/resources/source_configs/id_maps/itemId.json b/tests/resources/source_configs/id_maps/itemId.json deleted file mode 100644 index 20ff05d6..00000000 --- a/tests/resources/source_configs/id_maps/itemId.json +++ /dev/null @@ -1 +0,0 @@ -{"100": 2, "101": 3, "102": 4, "103": 5, "104": 6, "105": 7, "106": 8, "107": 9, "108": 10, "109": 11, "110": 12, "111": 13, "112": 14, "113": 15, "114": 16, "115": 17, "116": 18, "117": 19, "118": 20, "119": 21, "120": 22, "121": 23, "122": 24, "123": 25, "124": 26, "125": 27, "126": 28, "127": 29, "128": 30, "129": 31} diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-0-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-0-0.pt deleted file mode 100644 index f796d2f4..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-0-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-1-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-1-0.pt deleted file mode 100644 index 04c99a99..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-1-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-2-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-2-0.pt deleted file mode 100644 index 97a48607..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-2-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-3-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-3-0.pt deleted file mode 100644 index 1099e78d..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split0-3-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-0-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-0-0.pt deleted file mode 100644 index 82d2dd60..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-0-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-1-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-1-0.pt deleted file mode 100644 index 85a4f29e..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-1-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-2-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-2-0.pt deleted file mode 100644 index f57e27bb..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-2-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-3-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-3-0.pt deleted file mode 100644 index 39785a59..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split1-3-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-0-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-0-0.pt deleted file mode 100644 index 28153cd6..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-0-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-1-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-1-0.pt deleted file mode 100644 index 10e60e18..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-1-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-2-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-2-0.pt deleted file mode 100644 index b333a65f..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-2-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-3-0.pt b/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-3-0.pt deleted file mode 100644 index f7edbe8a..00000000 Binary files a/tests/resources/source_data/test-data-categorical-1-interrupted-temp/test-data-categorical-1-interrupted-split2-3-0.pt and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-1-interrupted.csv b/tests/resources/source_data/test-data-categorical-1-interrupted.csv deleted file mode 100644 index 9c89f83e..00000000 --- a/tests/resources/source_data/test-data-categorical-1-interrupted.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId -0,0,112 -0,1,104 -0,2,129 -0,3,121 -0,4,109 -0,5,111 -0,6,121 -0,7,109 -0,8,126 -0,9,112 -0,10,104 -0,11,103 -0,12,119 -0,13,103 -0,14,105 -0,15,121 -0,16,107 -0,17,128 -0,18,128 -0,19,116 -0,20,106 -0,21,103 -0,22,119 -0,23,105 -0,24,100 -1,25,113 -1,26,116 -1,27,105 -1,28,113 -1,29,108 -1,30,118 -1,31,102 -1,32,102 -1,33,121 -1,34,104 -1,35,111 -1,36,110 -1,37,102 -1,38,102 -1,39,120 -1,40,109 -1,41,101 -1,42,111 -1,43,127 -1,44,105 -1,45,115 -1,46,104 -2,47,112 -2,48,124 -2,49,121 -2,50,124 -2,51,129 -2,52,103 -2,53,119 -2,54,118 -2,55,110 -2,56,102 -2,57,121 -2,58,108 -2,59,101 -2,60,102 -2,61,110 -2,62,106 -2,63,102 -2,64,110 -2,65,109 -2,66,115 -3,67,122 -3,68,129 -3,69,101 -3,70,117 -3,71,120 -3,72,127 -3,73,122 -3,74,112 -3,75,127 -3,76,115 -3,77,117 -3,78,102 -3,79,120 -3,80,108 -3,81,126 -3,82,116 -3,83,102 -3,84,121 -3,85,118 -3,86,105 -4,87,113 -4,88,127 -4,89,105 -4,90,104 -4,91,106 -4,92,118 -4,93,112 -4,94,122 -4,95,105 -4,96,121 -4,97,119 -4,98,126 -4,99,120 -4,100,103 -4,101,117 -4,102,114 -5,103,120 -5,104,123 -5,105,127 -5,106,105 -5,107,112 -5,108,108 -5,109,123 -5,110,108 -5,111,129 -5,112,122 -5,113,117 -5,114,122 -5,115,109 -5,116,112 -5,117,126 -5,118,120 -6,119,127 -6,120,119 -6,121,127 -6,122,102 -6,123,113 -6,124,119 -6,125,103 -6,126,126 -6,127,128 -6,128,113 -6,129,111 -6,130,117 -6,131,124 -6,132,100 -6,133,119 -6,134,117 -6,135,103 -6,136,110 -6,137,108 -6,138,125 -6,139,107 -7,140,111 -7,141,112 -7,142,113 -7,143,113 -7,144,113 -7,145,121 -7,146,100 -7,147,129 -7,148,100 -7,149,125 -7,150,118 -7,151,121 -7,152,127 -7,153,121 -7,154,129 -7,155,113 -7,156,110 -8,157,101 -8,158,119 -8,159,103 -8,160,113 -8,161,105 -8,162,111 -8,163,124 -8,164,108 -8,165,118 -8,166,124 -8,167,109 -8,168,121 -8,169,110 -8,170,120 -8,171,114 -8,172,107 -8,173,100 -8,174,111 -8,175,107 -8,176,109 -8,177,114 -8,178,102 -8,179,126 -8,180,115 -9,181,128 -9,182,120 -9,183,103 -9,184,116 -9,185,122 -9,186,100 -9,187,128 -9,188,102 -9,189,122 -9,190,110 -9,191,122 -9,192,107 -9,193,123 -9,194,103 -9,195,128 -9,196,106 -9,197,108 -9,198,119 -9,199,129 diff --git a/tests/resources/source_data/test-data-categorical-1.csv b/tests/resources/source_data/test-data-categorical-1.csv deleted file mode 100644 index 9c89f83e..00000000 --- a/tests/resources/source_data/test-data-categorical-1.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId -0,0,112 -0,1,104 -0,2,129 -0,3,121 -0,4,109 -0,5,111 -0,6,121 -0,7,109 -0,8,126 -0,9,112 -0,10,104 -0,11,103 -0,12,119 -0,13,103 -0,14,105 -0,15,121 -0,16,107 -0,17,128 -0,18,128 -0,19,116 -0,20,106 -0,21,103 -0,22,119 -0,23,105 -0,24,100 -1,25,113 -1,26,116 -1,27,105 -1,28,113 -1,29,108 -1,30,118 -1,31,102 -1,32,102 -1,33,121 -1,34,104 -1,35,111 -1,36,110 -1,37,102 -1,38,102 -1,39,120 -1,40,109 -1,41,101 -1,42,111 -1,43,127 -1,44,105 -1,45,115 -1,46,104 -2,47,112 -2,48,124 -2,49,121 -2,50,124 -2,51,129 -2,52,103 -2,53,119 -2,54,118 -2,55,110 -2,56,102 -2,57,121 -2,58,108 -2,59,101 -2,60,102 -2,61,110 -2,62,106 -2,63,102 -2,64,110 -2,65,109 -2,66,115 -3,67,122 -3,68,129 -3,69,101 -3,70,117 -3,71,120 -3,72,127 -3,73,122 -3,74,112 -3,75,127 -3,76,115 -3,77,117 -3,78,102 -3,79,120 -3,80,108 -3,81,126 -3,82,116 -3,83,102 -3,84,121 -3,85,118 -3,86,105 -4,87,113 -4,88,127 -4,89,105 -4,90,104 -4,91,106 -4,92,118 -4,93,112 -4,94,122 -4,95,105 -4,96,121 -4,97,119 -4,98,126 -4,99,120 -4,100,103 -4,101,117 -4,102,114 -5,103,120 -5,104,123 -5,105,127 -5,106,105 -5,107,112 -5,108,108 -5,109,123 -5,110,108 -5,111,129 -5,112,122 -5,113,117 -5,114,122 -5,115,109 -5,116,112 -5,117,126 -5,118,120 -6,119,127 -6,120,119 -6,121,127 -6,122,102 -6,123,113 -6,124,119 -6,125,103 -6,126,126 -6,127,128 -6,128,113 -6,129,111 -6,130,117 -6,131,124 -6,132,100 -6,133,119 -6,134,117 -6,135,103 -6,136,110 -6,137,108 -6,138,125 -6,139,107 -7,140,111 -7,141,112 -7,142,113 -7,143,113 -7,144,113 -7,145,121 -7,146,100 -7,147,129 -7,148,100 -7,149,125 -7,150,118 -7,151,121 -7,152,127 -7,153,121 -7,154,129 -7,155,113 -7,156,110 -8,157,101 -8,158,119 -8,159,103 -8,160,113 -8,161,105 -8,162,111 -8,163,124 -8,164,108 -8,165,118 -8,166,124 -8,167,109 -8,168,121 -8,169,110 -8,170,120 -8,171,114 -8,172,107 -8,173,100 -8,174,111 -8,175,107 -8,176,109 -8,177,114 -8,178,102 -8,179,126 -8,180,115 -9,181,128 -9,182,120 -9,183,103 -9,184,116 -9,185,122 -9,186,100 -9,187,128 -9,188,102 -9,189,122 -9,190,110 -9,191,122 -9,192,107 -9,193,123 -9,194,103 -9,195,128 -9,196,106 -9,197,108 -9,198,119 -9,199,129 diff --git a/tests/resources/source_data/test-data-categorical-3-equal.csv b/tests/resources/source_data/test-data-categorical-3-equal.csv deleted file mode 100644 index bc370970..00000000 --- a/tests/resources/source_data/test-data-categorical-3-equal.csv +++ /dev/null @@ -1,161 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -0,0,112,3,3 -0,1,104,9,8 -0,2,129,7,2 -0,3,121,9,2 -0,4,109,2,1 -0,5,111,6,1 -0,6,121,9,1 -0,7,109,3,7 -0,8,126,4,1 -0,9,112,3,5 -0,10,104,4,4 -0,11,103,9,8 -0,12,119,2,1 -0,13,103,0,8 -0,14,105,7,6 -0,15,121,6,5 -1,0,113,9,8 -1,1,116,1,2 -1,2,105,5,1 -1,3,113,6,1 -1,4,108,1,7 -1,5,118,5,5 -1,6,102,3,6 -1,7,102,0,2 -1,8,121,6,1 -1,9,104,3,1 -1,10,111,1,8 -1,11,110,6,4 -1,12,102,4,2 -1,13,102,6,9 -1,14,120,0,0 -1,15,109,6,1 -2,0,112,3,6 -2,1,124,5,3 -2,2,121,0,6 -2,3,124,8,1 -2,4,129,6,1 -2,5,103,3,0 -2,6,119,6,6 -2,7,118,4,7 -2,8,110,0,2 -2,9,102,3,0 -2,10,121,8,6 -2,11,108,5,0 -2,12,101,6,2 -2,13,102,4,4 -2,14,110,8,9 -2,15,106,9,4 -3,0,122,9,1 -3,1,129,5,6 -3,2,101,0,6 -3,3,117,2,7 -3,4,120,0,3 -3,5,127,8,1 -3,6,122,4,3 -3,7,112,4,8 -3,8,127,7,0 -3,9,115,9,9 -3,10,117,0,2 -3,11,102,5,9 -3,12,120,6,0 -3,13,108,7,3 -3,14,126,8,3 -3,15,116,6,1 -4,0,113,4,9 -4,1,127,3,6 -4,2,105,7,4 -4,3,104,9,2 -4,4,106,9,4 -4,5,118,0,4 -4,6,112,0,8 -4,7,122,0,3 -4,8,105,0,6 -4,9,121,6,2 -4,10,119,9,5 -4,11,126,1,4 -4,12,120,9,9 -4,13,103,6,1 -4,14,117,1,3 -4,15,114,6,0 -5,0,120,4,2 -5,1,123,4,5 -5,2,127,0,0 -5,3,105,4,5 -5,4,112,6,0 -5,5,108,4,7 -5,6,123,8,4 -5,7,108,6,5 -5,8,129,9,1 -5,9,122,0,2 -5,10,117,7,6 -5,11,122,2,2 -5,12,109,3,8 -5,13,112,1,8 -5,14,126,9,0 -5,15,120,9,6 -6,0,127,0,7 -6,1,119,8,4 -6,2,127,4,2 -6,3,102,3,8 -6,4,113,6,0 -6,5,119,5,3 -6,6,103,2,8 -6,7,126,1,5 -6,8,128,4,0 -6,9,113,5,5 -6,10,111,7,2 -6,11,117,9,8 -6,12,124,8,8 -6,13,100,2,8 -6,14,119,4,3 -6,15,117,4,4 -7,0,111,9,9 -7,1,112,3,2 -7,2,113,7,8 -7,3,113,1,0 -7,4,113,8,4 -7,5,121,1,4 -7,6,100,4,6 -7,7,129,6,7 -7,8,100,4,3 -7,9,125,6,0 -7,10,118,9,6 -7,11,121,7,3 -7,12,127,8,3 -7,13,121,1,2 -7,14,129,1,3 -7,15,113,8,6 -8,0,101,6,7 -8,1,119,4,2 -8,2,103,5,3 -8,3,113,7,9 -8,4,105,6,1 -8,5,111,9,0 -8,6,124,7,5 -8,7,108,9,1 -8,8,118,4,9 -8,9,124,2,0 -8,10,109,1,6 -8,11,121,8,0 -8,12,110,4,6 -8,13,120,4,3 -8,14,114,4,2 -8,15,107,8,4 -9,0,128,0,1 -9,1,120,0,6 -9,2,103,5,7 -9,3,116,5,7 -9,4,122,6,9 -9,5,100,6,5 -9,6,128,1,4 -9,7,102,7,8 -9,8,122,6,5 -9,9,110,4,8 -9,10,122,7,5 -9,11,107,5,3 -9,12,123,2,2 -9,13,103,8,2 -9,14,128,9,2 -9,15,106,7,9 diff --git a/tests/resources/source_data/test-data-categorical-3-equal.parquet b/tests/resources/source_data/test-data-categorical-3-equal.parquet deleted file mode 100644 index d86b0984..00000000 Binary files a/tests/resources/source_data/test-data-categorical-3-equal.parquet and /dev/null differ diff --git a/tests/resources/source_data/test-data-categorical-3.csv b/tests/resources/source_data/test-data-categorical-3.csv deleted file mode 100644 index 5bf5157c..00000000 --- a/tests/resources/source_data/test-data-categorical-3.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -0,0,112,3,3 -0,1,104,9,8 -0,2,129,7,2 -0,3,121,9,2 -0,4,109,2,1 -0,5,111,6,1 -0,6,121,9,1 -0,7,109,3,7 -0,8,126,4,1 -0,9,112,3,5 -0,10,104,4,4 -0,11,103,9,8 -0,12,119,2,1 -0,13,103,0,8 -0,14,105,7,6 -0,15,121,6,5 -0,16,107,1,8 -0,17,128,4,4 -0,18,128,6,2 -0,19,116,9,2 -0,20,106,3,1 -0,21,103,9,6 -0,22,119,6,0 -0,23,105,8,2 -0,24,100,4,1 -1,25,113,9,8 -1,26,116,1,2 -1,27,105,5,1 -1,28,113,6,1 -1,29,108,1,7 -1,30,118,5,5 -1,31,102,3,6 -1,32,102,0,2 -1,33,121,6,1 -1,34,104,3,1 -1,35,111,1,8 -1,36,110,6,4 -1,37,102,4,2 -1,38,102,6,9 -1,39,120,0,0 -1,40,109,6,1 -1,41,101,8,2 -1,42,111,1,6 -1,43,127,2,8 -1,44,105,0,5 -1,45,115,7,9 -1,46,104,5,5 -2,47,112,3,6 -2,48,124,5,3 -2,49,121,0,6 -2,50,124,8,1 -2,51,129,6,1 -2,52,103,3,0 -2,53,119,6,6 -2,54,118,4,7 -2,55,110,0,2 -2,56,102,3,0 -2,57,121,8,6 -2,58,108,5,0 -2,59,101,6,2 -2,60,102,4,4 -2,61,110,8,9 -2,62,106,9,4 -2,63,102,5,7 -2,64,110,4,8 -2,65,109,4,6 -2,66,115,2,5 -3,67,122,9,1 -3,68,129,5,6 -3,69,101,0,6 -3,70,117,2,7 -3,71,120,0,3 -3,72,127,8,1 -3,73,122,4,3 -3,74,112,4,8 -3,75,127,7,0 -3,76,115,9,9 -3,77,117,0,2 -3,78,102,5,9 -3,79,120,6,0 -3,80,108,7,3 -3,81,126,8,3 -3,82,116,6,1 -3,83,102,5,6 -3,84,121,0,4 -3,85,118,8,4 -3,86,105,5,5 -4,87,113,4,9 -4,88,127,3,6 -4,89,105,7,4 -4,90,104,9,2 -4,91,106,9,4 -4,92,118,0,4 -4,93,112,0,8 -4,94,122,0,3 -4,95,105,0,6 -4,96,121,6,2 -4,97,119,9,5 -4,98,126,1,4 -4,99,120,9,9 -4,100,103,6,1 -4,101,117,1,3 -4,102,114,6,0 -5,103,120,4,2 -5,104,123,4,5 -5,105,127,0,0 -5,106,105,4,5 -5,107,112,6,0 -5,108,108,4,7 -5,109,123,8,4 -5,110,108,6,5 -5,111,129,9,1 -5,112,122,0,2 -5,113,117,7,6 -5,114,122,2,2 -5,115,109,3,8 -5,116,112,1,8 -5,117,126,9,0 -5,118,120,9,6 -6,119,127,0,7 -6,120,119,8,4 -6,121,127,4,2 -6,122,102,3,8 -6,123,113,6,0 -6,124,119,5,3 -6,125,103,2,8 -6,126,126,1,5 -6,127,128,4,0 -6,128,113,5,5 -6,129,111,7,2 -6,130,117,9,8 -6,131,124,8,8 -6,132,100,2,8 -6,133,119,4,3 -6,134,117,4,4 -6,135,103,7,8 -6,136,110,4,7 -6,137,108,7,6 -6,138,125,5,0 -6,139,107,8,3 -7,140,111,9,9 -7,141,112,3,2 -7,142,113,7,8 -7,143,113,1,0 -7,144,113,8,4 -7,145,121,1,4 -7,146,100,4,6 -7,147,129,6,7 -7,148,100,4,3 -7,149,125,6,0 -7,150,118,9,6 -7,151,121,7,3 -7,152,127,8,3 -7,153,121,1,2 -7,154,129,1,3 -7,155,113,8,6 -7,156,110,3,3 -8,157,101,6,7 -8,158,119,4,2 -8,159,103,5,3 -8,160,113,7,9 -8,161,105,6,1 -8,162,111,9,0 -8,163,124,7,5 -8,164,108,9,1 -8,165,118,4,9 -8,166,124,2,0 -8,167,109,1,6 -8,168,121,8,0 -8,169,110,4,6 -8,170,120,4,3 -8,171,114,4,2 -8,172,107,8,4 -8,173,100,2,2 -8,174,111,6,3 -8,175,107,9,7 -8,176,109,4,6 -8,177,114,1,3 -8,178,102,6,0 -8,179,126,2,2 -8,180,115,2,4 -9,181,128,0,1 -9,182,120,0,6 -9,183,103,5,7 -9,184,116,5,7 -9,185,122,6,9 -9,186,100,6,5 -9,187,128,1,4 -9,188,102,7,8 -9,189,122,6,5 -9,190,110,4,8 -9,191,122,7,5 -9,192,107,5,3 -9,193,123,2,2 -9,194,103,8,2 -9,195,128,9,2 -9,196,106,7,9 -9,197,108,3,4 -9,198,119,4,4 -9,199,129,4,3 diff --git a/tests/resources/source_data/test-data-categorical-5.csv b/tests/resources/source_data/test-data-categorical-5.csv deleted file mode 100644 index 4a342018..00000000 --- a/tests/resources/source_data/test-data-categorical-5.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -0,0,112,3,9,7,2 -0,1,104,9,1,8,1 -0,2,129,7,4,0,1 -0,3,121,9,9,4,0 -0,4,109,2,9,5,2 -0,5,111,6,3,9,0 -0,6,121,9,0,2,0 -0,7,109,3,5,8,1 -0,8,126,4,9,6,0 -0,9,112,3,3,3,2 -0,10,104,4,5,5,1 -0,11,103,9,6,0,0 -0,12,119,2,4,7,2 -0,13,103,0,8,3,1 -0,14,105,7,9,3,2 -0,15,121,6,4,8,0 -0,16,107,1,7,7,2 -0,17,128,4,5,1,1 -0,18,128,6,1,0,2 -0,19,116,9,9,8,1 -0,20,106,3,3,7,2 -0,21,103,9,0,2,1 -0,22,119,6,9,5,0 -0,23,105,8,2,6,0 -0,24,100,4,5,5,1 -1,25,113,9,6,4,1 -1,26,116,1,4,3,0 -1,27,105,5,9,6,1 -1,28,113,6,3,6,1 -1,29,108,1,3,2,2 -1,30,118,5,2,2,0 -1,31,102,3,5,7,1 -1,32,102,0,3,8,1 -1,33,121,6,3,6,1 -1,34,104,3,8,7,2 -1,35,111,1,9,5,1 -1,36,110,6,7,8,0 -1,37,102,4,9,4,2 -1,38,102,6,3,7,0 -1,39,120,0,9,8,2 -1,40,109,6,2,5,1 -1,41,101,8,8,8,0 -1,42,111,1,9,9,0 -1,43,127,2,2,4,2 -1,44,105,0,9,1,1 -1,45,115,7,8,8,2 -1,46,104,5,0,0,0 -2,47,112,3,0,0,0 -2,48,124,5,0,3,0 -2,49,121,0,4,0,2 -2,50,124,8,3,7,0 -2,51,129,6,7,0,1 -2,52,103,3,1,6,0 -2,53,119,6,5,6,1 -2,54,118,4,6,4,1 -2,55,110,0,1,8,1 -2,56,102,3,1,4,0 -2,57,121,8,9,3,0 -2,58,108,5,5,6,1 -2,59,101,6,4,2,2 -2,60,102,4,0,4,1 -2,61,110,8,9,8,2 -2,62,106,9,3,8,1 -2,63,102,5,1,3,0 -2,64,110,4,1,6,0 -2,65,109,4,5,2,1 -2,66,115,2,2,7,0 -3,67,122,9,9,0,0 -3,68,129,5,6,4,1 -3,69,101,0,2,8,0 -3,70,117,2,4,9,0 -3,71,120,0,0,5,0 -3,72,127,8,8,9,0 -3,73,122,4,7,4,1 -3,74,112,4,9,5,2 -3,75,127,7,3,7,0 -3,76,115,9,1,6,1 -3,77,117,0,4,7,0 -3,78,102,5,6,2,2 -3,79,120,6,1,7,2 -3,80,108,7,0,4,1 -3,81,126,8,1,7,2 -3,82,116,6,9,5,2 -3,83,102,5,9,2,0 -3,84,121,0,3,3,2 -3,85,118,8,2,5,0 -3,86,105,5,8,4,0 -4,87,113,4,3,4,0 -4,88,127,3,9,3,0 -4,89,105,7,8,0,0 -4,90,104,9,5,8,0 -4,91,106,9,1,5,1 -4,92,118,0,9,1,2 -4,93,112,0,3,8,1 -4,94,122,0,0,2,2 -4,95,105,0,8,3,2 -4,96,121,6,1,7,2 -4,97,119,9,2,8,1 -4,98,126,1,5,0,1 -4,99,120,9,7,3,1 -4,100,103,6,8,4,0 -4,101,117,1,2,4,0 -4,102,114,6,7,0,1 -5,103,120,4,3,6,0 -5,104,123,4,4,4,0 -5,105,127,0,2,8,0 -5,106,105,4,7,7,1 -5,107,112,6,0,7,0 -5,108,108,4,9,2,1 -5,109,123,8,3,9,0 -5,110,108,6,9,4,1 -5,111,129,9,0,7,2 -5,112,122,0,3,0,0 -5,113,117,7,2,5,1 -5,114,122,2,6,4,1 -5,115,109,3,7,5,1 -5,116,112,1,7,2,2 -5,117,126,9,8,9,1 -5,118,120,9,5,6,2 -6,119,127,0,8,2,0 -6,120,119,8,2,0,2 -6,121,127,4,5,7,1 -6,122,102,3,2,5,1 -6,123,113,6,3,1,0 -6,124,119,5,5,0,2 -6,125,103,2,1,0,2 -6,126,126,1,2,0,0 -6,127,128,4,2,0,2 -6,128,113,5,7,2,1 -6,129,111,7,3,1,0 -6,130,117,9,8,5,2 -6,131,124,8,3,3,2 -6,132,100,2,4,5,1 -6,133,119,4,6,1,1 -6,134,117,4,7,9,0 -6,135,103,7,4,7,1 -6,136,110,4,4,2,2 -6,137,108,7,4,1,0 -6,138,125,5,6,4,0 -6,139,107,8,6,4,0 -7,140,111,9,5,1,2 -7,141,112,3,4,2,1 -7,142,113,7,8,0,0 -7,143,113,1,7,4,2 -7,144,113,8,9,8,1 -7,145,121,1,0,1,1 -7,146,100,4,4,1,0 -7,147,129,6,8,5,0 -7,148,100,4,8,2,1 -7,149,125,6,9,8,1 -7,150,118,9,8,6,1 -7,151,121,7,3,3,2 -7,152,127,8,5,5,1 -7,153,121,1,8,4,0 -7,154,129,1,1,4,0 -7,155,113,8,1,8,0 -7,156,110,3,9,5,1 -8,157,101,6,1,4,2 -8,158,119,4,8,7,0 -8,159,103,5,7,7,1 -8,160,113,7,2,9,2 -8,161,105,6,0,0,2 -8,162,111,9,7,3,0 -8,163,124,7,9,6,1 -8,164,108,9,7,7,1 -8,165,118,4,5,4,1 -8,166,124,2,2,8,0 -8,167,109,1,2,8,0 -8,168,121,8,0,1,0 -8,169,110,4,8,4,0 -8,170,120,4,6,8,0 -8,171,114,4,2,9,2 -8,172,107,8,2,3,2 -8,173,100,2,2,6,0 -8,174,111,6,9,4,1 -8,175,107,9,0,8,2 -8,176,109,4,5,6,0 -8,177,114,1,1,3,0 -8,178,102,6,8,0,2 -8,179,126,2,2,4,1 -8,180,115,2,0,6,2 -9,181,128,0,9,2,0 -9,182,120,0,2,7,1 -9,183,103,5,5,2,2 -9,184,116,5,2,8,1 -9,185,122,6,0,6,0 -9,186,100,6,2,5,0 -9,187,128,1,1,0,1 -9,188,102,7,8,3,1 -9,189,122,6,1,2,0 -9,190,110,4,3,9,1 -9,191,122,7,8,8,0 -9,192,107,5,2,0,2 -9,193,123,2,2,6,2 -9,194,103,8,4,7,0 -9,195,128,9,6,6,1 -9,196,106,7,9,4,1 -9,197,108,3,3,8,1 -9,198,119,4,4,5,1 -9,199,129,4,6,4,1 diff --git a/tests/resources/source_data/test-data-categorical-50.csv b/tests/resources/source_data/test-data-categorical-50.csv deleted file mode 100644 index badf6dc6..00000000 --- a/tests/resources/source_data/test-data-categorical-50.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4,supCat5,supCat6,supCat7,supCat8,supCat9,supCat10,supCat11,supCat12,supCat13,supCat14,supCat15,supCat16,supCat17,supCat18,supCat19,supCat20,supCat21,supCat22,supCat23,supCat24,supCat25,supCat26,supCat27,supCat28,supCat29,supCat30,supCat31,supCat32,supCat33,supCat34,supCat35,supCat36,supCat37,supCat38,supCat39,supCat40,supCat41,supCat42,supCat43,supCat44,supCat45,supCat46,supCat47,supCat48,supCat49 -0,0,112,3,9,7,2,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9,7,2,3,9 -0,1,104,9,1,8,1,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1,8,1,9,1 -0,2,129,7,4,0,1,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4,0,1,7,4 -0,3,121,9,9,4,0,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9,4,0,9,9 -0,4,109,2,9,5,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9,5,2,2,9 -0,5,111,6,3,9,0,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3,9,0,6,3 -0,6,121,9,0,2,0,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0,2,0,9,0 -0,7,109,3,5,8,1,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5,8,1,3,5 -0,8,126,4,9,6,0,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9,6,0,4,9 -0,9,112,3,3,3,2,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3 -0,10,104,4,5,5,1,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5 -0,11,103,9,6,0,0,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6,0,0,9,6 -0,12,119,2,4,7,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4,7,2,2,4 -0,13,103,0,8,3,1,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8,3,1,0,8 -0,14,105,7,9,3,2,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9,3,2,7,9 -0,15,121,6,4,8,0,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4,8,0,6,4 -0,16,107,1,7,7,2,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7,7,2,1,7 -0,17,128,4,5,1,1,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5,1,1,4,5 -0,18,128,6,1,0,2,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1,0,2,6,1 -0,19,116,9,9,8,1,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9,8,1,9,9 -0,20,106,3,3,7,2,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3,7,2,3,3 -0,21,103,9,0,2,1,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0,2,1,9,0 -0,22,119,6,9,5,0,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9,5,0,6,9 -0,23,105,8,2,6,0,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2,6,0,8,2 -0,24,100,4,5,5,1,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5,5,1,4,5 -1,25,113,9,6,4,1,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6,4,1,9,6 -1,26,116,1,4,3,0,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4,3,0,1,4 -1,27,105,5,9,6,1,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9,6,1,5,9 -1,28,113,6,3,6,1,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3 -1,29,108,1,3,2,2,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3,2,2,1,3 -1,30,118,5,2,2,0,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2,2,0,5,2 -1,31,102,3,5,7,1,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5 -1,32,102,0,3,8,1,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3 -1,33,121,6,3,6,1,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3,6,1,6,3 -1,34,104,3,8,7,2,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8,7,2,3,8 -1,35,111,1,9,5,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9,5,1,1,9 -1,36,110,6,7,8,0,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7,8,0,6,7 -1,37,102,4,9,4,2,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9,4,2,4,9 -1,38,102,6,3,7,0,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3,7,0,6,3 -1,39,120,0,9,8,2,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9,8,2,0,9 -1,40,109,6,2,5,1,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2,5,1,6,2 -1,41,101,8,8,8,0,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8,8,0,8,8 -1,42,111,1,9,9,0,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9,9,0,1,9 -1,43,127,2,2,4,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2 -1,44,105,0,9,1,1,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9,1,1,0,9 -1,45,115,7,8,8,2,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8,8,2,7,8 -1,46,104,5,0,0,0,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0 -2,47,112,3,0,0,0,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0 -2,48,124,5,0,3,0,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0,3,0,5,0 -2,49,121,0,4,0,2,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4,0,2,0,4 -2,50,124,8,3,7,0,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3,7,0,8,3 -2,51,129,6,7,0,1,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7 -2,52,103,3,1,6,0,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1,6,0,3,1 -2,53,119,6,5,6,1,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5,6,1,6,5 -2,54,118,4,6,4,1,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6 -2,55,110,0,1,8,1,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1,8,1,0,1 -2,56,102,3,1,4,0,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1,4,0,3,1 -2,57,121,8,9,3,0,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9,3,0,8,9 -2,58,108,5,5,6,1,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5,6,1,5,5 -2,59,101,6,4,2,2,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4,2,2,6,4 -2,60,102,4,0,4,1,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0,4,1,4,0 -2,61,110,8,9,8,2,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9,8,2,8,9 -2,62,106,9,3,8,1,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3,8,1,9,3 -2,63,102,5,1,3,0,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1,3,0,5,1 -2,64,110,4,1,6,0,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1,6,0,4,1 -2,65,109,4,5,2,1,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5,2,1,4,5 -2,66,115,2,2,7,0,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2,7,0,2,2 -3,67,122,9,9,0,0,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9,0,0,9,9 -3,68,129,5,6,4,1,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6,4,1,5,6 -3,69,101,0,2,8,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2 -3,70,117,2,4,9,0,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4,9,0,2,4 -3,71,120,0,0,5,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0 -3,72,127,8,8,9,0,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8,9,0,8,8 -3,73,122,4,7,4,1,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7,4,1,4,7 -3,74,112,4,9,5,2,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9,5,2,4,9 -3,75,127,7,3,7,0,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3,7,0,7,3 -3,76,115,9,1,6,1,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1,6,1,9,1 -3,77,117,0,4,7,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4,7,0,0,4 -3,78,102,5,6,2,2,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6 -3,79,120,6,1,7,2,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1 -3,80,108,7,0,4,1,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0,4,1,7,0 -3,81,126,8,1,7,2,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1,7,2,8,1 -3,82,116,6,9,5,2,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9,5,2,6,9 -3,83,102,5,9,2,0,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9,2,0,5,9 -3,84,121,0,3,3,2,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3,3,2,0,3 -3,85,118,8,2,5,0,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2,5,0,8,2 -3,86,105,5,8,4,0,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8,4,0,5,8 -4,87,113,4,3,4,0,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3,4,0,4,3 -4,88,127,3,9,3,0,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9,3,0,3,9 -4,89,105,7,8,0,0,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8 -4,90,104,9,5,8,0,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5,8,0,9,5 -4,91,106,9,1,5,1,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1,5,1,9,1 -4,92,118,0,9,1,2,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9,1,2,0,9 -4,93,112,0,3,8,1,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3,8,1,0,3 -4,94,122,0,0,2,2,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2,0,0 -4,95,105,0,8,3,2,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8,3,2,0,8 -4,96,121,6,1,7,2,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1,7,2,6,1 -4,97,119,9,2,8,1,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2,8,1,9,2 -4,98,126,1,5,0,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5,0,1,1,5 -4,99,120,9,7,3,1,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7,3,1,9,7 -4,100,103,6,8,4,0,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8,4,0,6,8 -4,101,117,1,2,4,0,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2,4,0,1,2 -4,102,114,6,7,0,1,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7,0,1,6,7 -5,103,120,4,3,6,0,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3,6,0,4,3 -5,104,123,4,4,4,0,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,0,4,4 -5,105,127,0,2,8,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2,8,0,0,2 -5,106,105,4,7,7,1,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7,7,1,4,7 -5,107,112,6,0,7,0,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0,7,0,6,0 -5,108,108,4,9,2,1,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9,2,1,4,9 -5,109,123,8,3,9,0,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3,9,0,8,3 -5,110,108,6,9,4,1,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9 -5,111,129,9,0,7,2,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0,7,2,9,0 -5,112,122,0,3,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3 -5,113,117,7,2,5,1,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2,5,1,7,2 -5,114,122,2,6,4,1,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6,4,1,2,6 -5,115,109,3,7,5,1,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7,5,1,3,7 -5,116,112,1,7,2,2,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7,2,2,1,7 -5,117,126,9,8,9,1,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8,9,1,9,8 -5,118,120,9,5,6,2,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5,6,2,9,5 -6,119,127,0,8,2,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8,2,0,0,8 -6,120,119,8,2,0,2,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2,0,2,8,2 -6,121,127,4,5,7,1,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5,7,1,4,5 -6,122,102,3,2,5,1,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2,5,1,3,2 -6,123,113,6,3,1,0,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3,1,0,6,3 -6,124,119,5,5,0,2,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5,0,2,5,5 -6,125,103,2,1,0,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1,0,2,2,1 -6,126,126,1,2,0,0,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2 -6,127,128,4,2,0,2,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2,0,2,4,2 -6,128,113,5,7,2,1,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7,2,1,5,7 -6,129,111,7,3,1,0,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3,1,0,7,3 -6,130,117,9,8,5,2,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8,5,2,9,8 -6,131,124,8,3,3,2,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3,3,2,8,3 -6,132,100,2,4,5,1,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4,5,1,2,4 -6,133,119,4,6,1,1,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6,1,1,4,6 -6,134,117,4,7,9,0,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7,9,0,4,7 -6,135,103,7,4,7,1,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4,7,1,7,4 -6,136,110,4,4,2,2,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4,2,2,4,4 -6,137,108,7,4,1,0,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4,1,0,7,4 -6,138,125,5,6,4,0,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6,4,0,5,6 -6,139,107,8,6,4,0,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6,4,0,8,6 -7,140,111,9,5,1,2,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5,1,2,9,5 -7,141,112,3,4,2,1,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,1,3,4 -7,142,113,7,8,0,0,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8,0,0,7,8 -7,143,113,1,7,4,2,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7,4,2,1,7 -7,144,113,8,9,8,1,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9,8,1,8,9 -7,145,121,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0 -7,146,100,4,4,1,0,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4,1,0,4,4 -7,147,129,6,8,5,0,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8,5,0,6,8 -7,148,100,4,8,2,1,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8,2,1,4,8 -7,149,125,6,9,8,1,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9,8,1,6,9 -7,150,118,9,8,6,1,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8,6,1,9,8 -7,151,121,7,3,3,2,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3,3,2,7,3 -7,152,127,8,5,5,1,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5,5,1,8,5 -7,153,121,1,8,4,0,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8,4,0,1,8 -7,154,129,1,1,4,0,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1,4,0,1,1 -7,155,113,8,1,8,0,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1,8,0,8,1 -7,156,110,3,9,5,1,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9,5,1,3,9 -8,157,101,6,1,4,2,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1,4,2,6,1 -8,158,119,4,8,7,0,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8,7,0,4,8 -8,159,103,5,7,7,1,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7,7,1,5,7 -8,160,113,7,2,9,2,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2,9,2,7,2 -8,161,105,6,0,0,2,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0,0,2,6,0 -8,162,111,9,7,3,0,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7,3,0,9,7 -8,163,124,7,9,6,1,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9,6,1,7,9 -8,164,108,9,7,7,1,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7,7,1,9,7 -8,165,118,4,5,4,1,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5,4,1,4,5 -8,166,124,2,2,8,0,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2,8,0,2,2 -8,167,109,1,2,8,0,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2,8,0,1,2 -8,168,121,8,0,1,0,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0,1,0,8,0 -8,169,110,4,8,4,0,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8,4,0,4,8 -8,170,120,4,6,8,0,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6,8,0,4,6 -8,171,114,4,2,9,2,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2,9,2,4,2 -8,172,107,8,2,3,2,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2,3,2,8,2 -8,173,100,2,2,6,0,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2,6,0,2,2 -8,174,111,6,9,4,1,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9,4,1,6,9 -8,175,107,9,0,8,2,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0,8,2,9,0 -8,176,109,4,5,6,0,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5,6,0,4,5 -8,177,114,1,1,3,0,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1,3,0,1,1 -8,178,102,6,8,0,2,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8,0,2,6,8 -8,179,126,2,2,4,1,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2,4,1,2,2 -8,180,115,2,0,6,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0,6,2,2,0 -9,181,128,0,9,2,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9,2,0,0,9 -9,182,120,0,2,7,1,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2,7,1,0,2 -9,183,103,5,5,2,2,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5,2,2,5,5 -9,184,116,5,2,8,1,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2,8,1,5,2 -9,185,122,6,0,6,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0 -9,186,100,6,2,5,0,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2,5,0,6,2 -9,187,128,1,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1 -9,188,102,7,8,3,1,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8,3,1,7,8 -9,189,122,6,1,2,0,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1,2,0,6,1 -9,190,110,4,3,9,1,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3,9,1,4,3 -9,191,122,7,8,8,0,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8,8,0,7,8 -9,192,107,5,2,0,2,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2,0,2,5,2 -9,193,123,2,2,6,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2,6,2,2,2 -9,194,103,8,4,7,0,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4,7,0,8,4 -9,195,128,9,6,6,1,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6,6,1,9,6 -9,196,106,7,9,4,1,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9,4,1,7,9 -9,197,108,3,3,8,1,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3,8,1,3,3 -9,198,119,4,4,5,1,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4,5,1,4,4 -9,199,129,4,6,4,1,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6,4,1,4,6 diff --git a/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-1.csv b/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-1.csv deleted file mode 100644 index 69d1879e..00000000 --- a/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-1.csv +++ /dev/null @@ -1,245 +0,0 @@ -sequenceId,itemPosition,Unnamed: 0,itemId,supCat1,supReal2,supReal3,supCat4 -0,0,0,112,3,0.47512151913436,-0.5820086906467112,2 -0,1,1,104,9,-1.1261734468621212,-0.9089247216662516,1 -0,2,2,129,7,-1.2162003117631153,-0.5154371712252781,1 -0,3,3,121,9,-1.4933477031742597,-0.8796536665660435,0 -0,4,4,109,2,-0.9670816286563634,-0.0946835025191322,2 -0,5,5,111,6,0.2951585961176835,0.573453806301526,0 -0,6,6,121,9,-0.8256811879776176,-0.6726355586632142,0 -0,7,7,109,3,-0.2626654773388363,0.7338377851923579,1 -0,8,8,126,4,1.3128198055960525,0.4123843865529258,0 -0,9,9,112,3,-0.1724514169048517,1.0002758074691138,2 -0,10,10,104,4,0.9984558771504448,-1.6793033775681865,1 -0,11,11,103,9,0.8241769523505718,0.5192150697838572,0 -0,12,12,119,2,1.1524820376873743,-0.0684948380162701,2 -0,13,13,103,0,-0.4532287722802309,-1.012670179240466,1 -0,14,14,105,7,0.7406957728589633,0.4598005719286187,2 -0,15,15,121,6,-0.3046679002763786,2.228549215957172,0 -0,16,16,107,1,-0.0981028713050338,1.580761752579522,2 -0,17,17,128,4,-0.338687599861625,1.0274608136462915,1 -0,18,18,128,6,-0.5926329276128396,0.7105776900317172,2 -0,19,19,116,9,-0.8683614880285571,0.7000235215395574,1 -0,20,20,106,3,-0.2223944052810371,-0.1421408408449271,2 -0,21,21,103,9,0.2238516678750416,0.7671249818780963,1 -0,22,22,119,6,-0.4794418411187094,0.284269664190007,0 -0,23,23,105,8,-0.208702368387007,0.5367982644094035,0 -0,24,24,100,4,0.1273379928547726,0.9143038302645866,1 -1,0,25,113,9,-0.2656666807034851,0.4806224256538509,1 -1,1,26,116,1,-0.9754261015074585,0.2940960032574599,0 -1,2,27,105,5,-2.0639707193059498,1.2133396475903873,1 -1,3,28,113,6,0.7319848912899831,-0.4229377963857184,1 -1,4,29,108,1,-0.0908278640955465,0.5666495515437896,2 -1,5,30,118,5,0.2854174163780527,0.6009858839082124,0 -1,6,31,102,3,0.2014682827257396,1.7092664244525773,1 -1,7,32,102,0,0.1453056346528572,0.3399258904044571,1 -1,8,33,121,6,0.8095167753996217,-0.1079289200633795,1 -1,9,34,104,3,1.5900425772732012,0.6294206328381015,2 -1,10,35,111,1,-0.8178820250244837,1.4633194614817098,1 -1,11,36,110,6,-1.1811248427188683,0.5503790726147177,0 -1,12,37,102,4,-0.5521109827498613,0.2288111251968629,2 -1,13,38,102,6,0.3949748622436907,1.5447878604004366,0 -1,14,39,120,0,-0.6463976133595792,0.1630326559403528,2 -1,15,40,109,6,-1.2805957817399582,-1.1826482612552474,1 -1,16,41,101,8,0.5508900386572504,-0.1671730495935667,0 -1,17,42,111,1,0.0853086889333529,-0.0132633758837144,0 -1,18,43,127,2,-0.218769711385981,-0.7019854368140658,2 -1,19,44,105,0,-0.6197723706627636,2.138611526896666,1 -1,20,45,115,7,-1.1247441521636312,-0.4641464411878229,2 -1,21,46,104,5,-0.072555647708791,-0.3929353813928705,0 -2,0,47,112,3,1.3399026572550203,1.878090363680033,0 -2,1,48,124,5,-0.024381870075387,0.5316335161706456,0 -2,2,49,121,0,-0.9970857305430262,-1.383512008752633,2 -2,3,50,124,8,-0.8334960910074487,-0.9116180632797354,0 -2,4,51,129,6,0.3845601295654262,0.1807163239900383,1 -2,5,52,103,3,-0.2294227620946844,0.3477709783565773,0 -2,6,53,119,6,1.0169773111385545,-0.5910886720642256,1 -2,7,54,118,4,0.3363413463024886,-1.0001172593271828,1 -2,8,55,110,0,0.0097818169970301,-0.6059838835052326,1 -2,9,56,102,3,0.5901905216267234,0.3696348407961316,0 -2,10,57,121,8,-0.3329927633569184,-2.1592296837868172,0 -2,11,58,108,5,0.5469937351204301,0.1158729118533183,1 -2,12,59,101,6,1.4387947715516716,0.510184749224577,2 -2,13,60,102,4,-1.5928420817380986,-1.0181941589104413,1 -2,14,61,110,8,0.4144898850289152,-2.1012260841117647,2 -2,15,62,106,9,0.9626552542957164,-0.2641403390810031,1 -2,16,63,102,5,0.5938953228849851,1.126424989282014,0 -2,17,64,110,4,-0.6852888501385631,-0.2788158895740412,0 -2,18,65,109,4,-1.802304268569908,-0.3884284583050837,1 -2,19,66,115,2,-0.0129419618714691,-0.9695615693196264,0 -3,0,67,122,9,0.728096157555939,1.57860530312412,0 -3,1,68,129,5,0.7156279104852876,-0.4852580169423038,1 -3,2,69,101,0,1.3546839988588728,1.3115417566478216,0 -3,3,70,117,2,-1.232361381356479,-0.9375197390131628,0 -3,4,71,120,0,-0.0435872778479013,-1.4933926504379784,0 -3,5,72,127,8,0.5484525334475734,1.66698134913082,0 -3,6,73,122,4,1.307847634805456,0.4215958062784253,1 -3,7,74,112,4,-2.618532214839832,1.6374672768528042,2 -3,8,75,127,7,-0.8496513139782857,0.2645026021626481,0 -3,9,76,115,9,-0.7521255704289022,0.7526070369449078,1 -3,10,77,117,0,-2.126705535677708,0.2182067272217519,0 -3,11,78,102,5,0.8752645615044675,0.2730385089817146,2 -3,12,79,120,6,0.3561666568718871,-1.1795205381405394,2 -3,13,80,108,7,-0.5208614133489836,-0.300497076461078,1 -3,14,81,126,8,0.1299212462358277,-0.8405052153381654,2 -3,15,82,116,6,-0.3047310126274782,0.7356818372550097,2 -3,16,83,102,5,1.9115397604052724,-0.2388956656409064,0 -3,17,84,121,0,-0.8567878621140438,1.643155432693797,2 -3,18,85,118,8,0.9366327938393536,0.5319856670267262,0 -3,19,86,105,5,0.1183670068806765,-2.1326672344812105,0 -4,0,87,113,4,-0.1473154301210917,-1.6042550026469249,0 -4,1,88,127,3,-1.3056540391037692,-0.5997440870462475,0 -4,2,89,105,7,3.0274943343874083,-0.0520796489093672,0 -4,3,90,104,9,0.3617294328556023,-0.0883800576540255,0 -4,4,91,106,9,-0.4453650036042871,-0.8334261447948773,1 -4,5,92,118,0,0.6282853705023487,1.350321469218172,2 -4,6,93,112,0,0.9642562105511686,-0.9992263103431246,1 -4,7,94,122,0,-0.8330901074711051,-0.7635405661499053,2 -4,8,95,105,0,0.7981435937792382,-0.6666971915003546,2 -4,9,96,121,6,0.7995168560801881,-3.730120038128068,2 -4,10,97,119,9,-0.4778765668524142,-1.8018134368021577,1 -4,11,98,126,1,1.7731643504472827,-2.966586951844483,1 -4,12,99,120,9,1.2401001274351815,0.9763019660890628,1 -4,13,100,103,6,-0.6172799146920306,-1.9341599869280055,0 -4,14,101,117,1,0.7526864964032826,0.0115401685101198,0 -4,15,102,114,6,-0.3922040087053289,-1.7973367751171303,1 -5,0,103,120,4,1.3164444471305916,-0.5782800824093337,0 -5,1,104,123,4,0.420020710446368,-0.1850434000530602,0 -5,2,105,127,0,0.8921979069031415,-0.2332258635179755,0 -5,3,106,105,4,0.4279062963690861,-1.5395002171602334,1 -5,4,107,112,6,-0.1809155329521617,-1.106476206464435,0 -5,5,108,108,4,0.5335886571652085,-2.129243520644403,1 -5,6,109,123,8,-0.7825217022412374,0.4768143516638856,0 -5,7,110,108,6,-1.3297057074440568,-0.1723342300598751,1 -5,8,111,129,9,-0.9899126599978328,-0.6345577264308937,2 -5,9,112,122,0,-1.2241592816111664,-1.3588134360661253,0 -5,10,113,117,7,-1.6081151211440765,-1.115309203106232,1 -5,11,114,122,2,0.6893365374951431,1.660083512711184,1 -5,12,115,109,3,1.3184511797851892,0.5981510743069248,1 -5,13,116,112,1,0.2530927744153326,0.1762152669186038,2 -5,14,117,126,9,-0.7218134212123581,0.0995596156598381,1 -5,15,118,120,9,-0.0069204705176007,-0.134973127015259,2 -6,0,119,127,0,-0.4138548174567836,-0.7491928547518463,0 -6,1,120,119,8,-0.9217336181544192,2.0705334246918015,2 -6,2,121,127,4,-1.086483742151834,-0.714833705558571,1 -6,3,122,102,3,1.474288547233567,0.1631413469278299,1 -6,4,123,113,6,1.5875581988032164,1.027268717867479,0 -6,5,124,119,5,-1.8988657509221156,1.8808868244932129,2 -6,6,125,103,2,-0.4050814416560676,0.4437277986745326,2 -6,7,126,126,1,0.8726496980525889,0.1240530371932496,0 -6,8,127,128,4,1.8224737121284704,0.4209771365993368,2 -6,9,128,113,5,0.3293755829411718,0.6439655653176443,1 -6,10,129,111,7,1.1353736264714218,-0.0632902816234641,0 -6,11,130,117,9,-2.088924140703356,0.7873992206662046,2 -6,12,131,124,8,1.1776401371612333,0.1655764555283259,2 -6,13,132,100,2,0.3101310578176122,-0.543886007962999,1 -6,14,133,119,4,0.0489690373962899,-1.3584102327948733,1 -6,15,134,117,4,-1.122565585229101,-0.1804465985609838,0 -6,16,135,103,7,-0.1379191118897307,1.0044578374950142,1 -6,17,136,110,4,0.477337569358077,0.7537311601289707,2 -6,18,137,108,7,-0.0207534690671556,0.5841218654437593,0 -6,19,138,125,5,0.9348832049035216,-0.7226482893432934,0 -6,20,139,107,8,-0.804227609128954,-0.5571601176468748,0 -7,0,140,111,9,0.1431939714725609,0.0422524056965653,2 -7,1,141,112,3,-0.4605569829841085,-0.4325683214460127,1 -7,2,142,113,7,-1.0553504705140826,0.8465631724299651,0 -7,3,143,113,1,0.7206026881536415,0.2871208611901518,2 -7,4,144,113,8,-1.718237086897971,-0.7868091893675095,1 -7,5,145,121,1,0.527556676509205,-1.9318448023128916,1 -7,6,146,100,4,1.4729892021615898,0.8391818770701904,0 -7,7,147,129,6,-1.0059562338044414,0.0019652114728092,0 -7,8,148,100,4,1.6305569491478604,1.0951871930560133,1 -7,9,149,125,6,2.547370551387279,-1.0208678213187818,1 -7,10,150,118,9,2.033324551178638,-0.1154719415024776,1 -7,11,151,121,7,0.4043282940651028,-0.8707042594597949,2 -7,12,152,127,8,0.4191280421631976,0.0957855998835066,1 -7,13,153,121,1,-1.5587069063508987,0.1791648322349623,0 -7,14,154,129,1,-0.7830858337970409,0.0648510199038132,0 -7,15,155,113,8,0.1371199788701356,0.2161753878561426,0 -7,16,156,110,3,1.5499797081722422,1.0344576013849434,1 -8,0,157,101,6,1.818575785843776,-1.9949939475490075,2 -8,1,158,119,4,0.1183152450709592,-1.0344467157761543,0 -8,2,159,103,5,0.7652662329923993,-1.0019028093921996,1 -8,3,160,113,7,1.5686505707558396,-0.5766936717058257,2 -8,4,161,105,6,0.1255815698914305,-0.9386728917772926,2 -8,5,162,111,9,0.4338170324237214,-1.0166286003580864,0 -8,6,163,124,7,1.449813536152996,1.2624300972050062,1 -8,7,164,108,9,0.8621272110483021,-0.5284653415605093,1 -8,8,165,118,4,0.3234054613524826,1.1616916884353274,1 -8,9,166,124,2,0.5064088364815167,-0.4651367065068575,0 -8,10,167,109,1,1.4913472073701488,0.2991262309237505,0 -8,11,168,121,8,1.023767695317657,-0.055448324522217,0 -8,12,169,110,4,-1.4437814578576325,0.599379484168683,0 -8,13,170,120,4,-1.2314791793635456,0.3901346999802171,0 -8,14,171,114,4,0.7673842918563573,0.7395058195373676,2 -8,15,172,107,8,1.6847926118412546,-0.2618624769340897,2 -8,16,173,100,2,0.4514898135283557,-0.4452332175533571,0 -8,17,174,111,6,1.5702390064548917,0.7613097400139596,1 -8,18,175,107,9,-1.4233773553881364,-2.2941794906187303,2 -8,19,176,109,4,-0.8348156343282267,0.3184559910398074,0 -8,20,177,114,1,1.64301604024024,-0.8105101252279568,0 -8,21,178,102,6,0.5931810417739123,-0.4433977354954991,2 -8,22,179,126,2,0.2933912934374598,-0.2155182381754514,1 -8,23,180,115,2,1.0447321534051053,1.6744425413368984,2 -9,0,181,128,0,0.6181051753418312,-1.3708388861688323,0 -9,1,182,128,0,0.6181051753418312,-1.3708388861688323,0 -9,2,183,128,0,0.6181051753418312,-1.3708388861688323,0 -9,3,184,128,0,0.6181051753418312,-1.3708388861688323,0 -9,4,185,128,0,0.6181051753418312,-1.3708388861688323,0 -9,5,186,128,0,0.6181051753418312,-1.3708388861688323,0 -9,6,187,128,0,0.6181051753418312,-1.3708388861688323,0 -9,7,188,128,0,0.6181051753418312,-1.3708388861688323,0 -9,8,189,128,0,0.6181051753418312,-1.3708388861688323,0 -10,0,190,120,0,-0.4304087997159057,0.3153721331558907,1 -10,1,191,103,5,0.4244180231779655,-0.9094229514381224,2 -10,2,192,116,5,-0.0579477086770905,-0.7201079456603995,1 -10,3,193,122,6,0.3949805394801389,-0.3897487397244845,0 -10,4,194,100,6,-1.6105230975007343,-0.7172381117410999,0 -10,5,195,128,1,-2.243399918867632,0.2448124704232933,1 -10,6,196,102,7,0.9299617676237236,-0.099403340668543,1 -10,7,197,122,6,-1.4146582334712663,-1.521788254894823,0 -10,8,198,110,4,-0.7481546299358196,0.4304399046873204,1 -10,9,199,122,7,0.9978354826902832,0.8417705179306674,0 -10,10,200,107,5,-1.3269464311869232,-0.1530678319918289,2 -10,11,201,123,2,-1.5774782605931386,-0.6719432184447797,2 -10,12,202,103,8,-0.0946765671355123,1.828172446219632,0 -10,13,203,128,9,-1.0427121479775012,-1.2067768937681949,1 -10,14,204,106,7,-0.8627459284058191,-1.1178231135428731,1 -10,15,205,108,3,0.0995309724676549,0.6450065530334209,1 -10,16,206,119,4,-0.571201566340334,2.8820698132437697,1 -10,17,207,129,4,-1.0436603387986798,-0.5667820105949781,1 -11,0,208,120,0,-0.4304087997159057,0.3153721331558907,1 -11,1,209,103,5,0.4244180231779655,-0.9094229514381224,2 -11,2,210,116,5,-0.0579477086770905,-0.7201079456603995,1 -11,3,211,122,6,0.3949805394801389,-0.3897487397244845,0 -11,4,212,100,6,-1.6105230975007343,-0.7172381117410999,0 -11,5,213,128,1,-2.243399918867632,0.2448124704232933,1 -11,6,214,102,7,0.9299617676237236,-0.099403340668543,1 -11,7,215,122,6,-1.4146582334712663,-1.521788254894823,0 -11,8,216,110,4,-0.7481546299358196,0.4304399046873204,1 -11,9,217,122,7,0.9978354826902832,0.8417705179306674,0 -11,10,218,107,5,-1.3269464311869232,-0.1530678319918289,2 -11,11,219,123,2,-1.5774782605931386,-0.6719432184447797,2 -11,12,220,103,8,-0.0946765671355123,1.828172446219632,0 -11,13,221,128,9,-1.0427121479775012,-1.2067768937681949,1 -11,14,222,106,7,-0.8627459284058191,-1.1178231135428731,1 -11,15,223,108,3,0.0995309724676549,0.6450065530334209,1 -11,16,224,119,4,-0.571201566340334,2.8820698132437697,1 -11,17,225,129,4,-1.0436603387986798,-0.5667820105949781,1 -12,0,226,120,0,-0.4304087997159057,0.3153721331558907,1 -12,1,227,103,5,0.4244180231779655,-0.9094229514381224,2 -12,2,228,116,5,-0.0579477086770905,-0.7201079456603995,1 -12,3,229,122,6,0.3949805394801389,-0.3897487397244845,0 -12,4,230,100,6,-1.6105230975007343,-0.7172381117410999,0 -12,5,231,128,1,-2.243399918867632,0.2448124704232933,1 -12,6,232,102,7,0.9299617676237236,-0.099403340668543,1 -12,7,233,122,6,-1.4146582334712663,-1.521788254894823,0 -12,8,234,110,4,-0.7481546299358196,0.4304399046873204,1 -12,9,235,122,7,0.9978354826902832,0.8417705179306674,0 -12,10,236,107,5,-1.3269464311869232,-0.1530678319918289,2 -12,11,237,123,2,-1.5774782605931386,-0.6719432184447797,2 -12,12,238,103,8,-0.0946765671355123,1.828172446219632,0 -12,13,239,128,9,-1.0427121479775012,-1.2067768937681949,1 -12,14,240,106,7,-0.8627459284058191,-1.1178231135428731,1 -12,15,241,108,3,0.0995309724676549,0.6450065530334209,1 -12,16,242,119,4,-0.571201566340334,2.8820698132437697,1 -12,17,243,129,4,-1.0436603387986798,-0.5667820105949781,1 diff --git a/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-2.csv b/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-2.csv deleted file mode 100644 index fd2991a4..00000000 --- a/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-2.csv +++ /dev/null @@ -1,255 +0,0 @@ -sequenceId,itemPosition,Unnamed: 0,itemId,supCat1,supReal2,supReal3,supCat4 -13,0,0,112,3,0.47512151913436,-0.5820086906467112,2 -13,1,1,104,9,-1.1261734468621212,-0.9089247216662516,1 -13,2,2,129,7,-1.2162003117631153,-0.5154371712252781,1 -13,3,3,121,9,-1.4933477031742597,-0.8796536665660435,0 -13,4,4,109,2,-0.9670816286563634,-0.0946835025191322,2 -13,5,5,111,6,0.2951585961176835,0.573453806301526,0 -13,6,6,121,9,-0.8256811879776176,-0.6726355586632142,0 -13,7,7,109,3,-0.2626654773388363,0.7338377851923579,1 -13,8,8,126,4,1.3128198055960525,0.4123843865529258,0 -13,9,9,112,3,-0.1724514169048517,1.0002758074691138,2 -13,10,10,104,4,0.9984558771504448,-1.6793033775681865,1 -13,11,11,103,9,0.8241769523505718,0.5192150697838572,0 -13,12,12,119,2,1.1524820376873743,-0.0684948380162701,2 -13,13,13,103,0,-0.4532287722802309,-1.012670179240466,1 -13,14,14,105,7,0.7406957728589633,0.4598005719286187,2 -13,15,15,121,6,-0.3046679002763786,2.228549215957172,0 -13,16,16,107,1,-0.0981028713050338,1.580761752579522,2 -13,17,17,128,4,-0.338687599861625,1.0274608136462915,1 -13,18,18,128,6,-0.5926329276128396,0.7105776900317172,2 -13,19,19,116,9,-0.8683614880285571,0.7000235215395574,1 -13,20,20,106,3,-0.2223944052810371,-0.1421408408449271,2 -13,21,21,103,9,0.2238516678750416,0.7671249818780963,1 -13,22,22,119,6,-0.4794418411187094,0.284269664190007,0 -13,23,23,105,8,-0.208702368387007,0.5367982644094035,0 -13,24,24,100,4,0.1273379928547726,0.9143038302645866,1 -14,0,25,113,9,-0.2656666807034851,0.4806224256538509,1 -14,1,26,116,1,-0.9754261015074585,0.2940960032574599,0 -14,2,27,105,5,-2.0639707193059498,1.2133396475903873,1 -14,3,28,113,6,0.7319848912899831,-0.4229377963857184,1 -14,4,29,108,1,-0.0908278640955465,0.5666495515437896,2 -14,5,30,118,5,0.2854174163780527,0.6009858839082124,0 -14,6,31,102,3,0.2014682827257396,1.7092664244525773,1 -14,7,32,102,0,0.1453056346528572,0.3399258904044571,1 -14,8,33,121,6,0.8095167753996217,-0.1079289200633795,1 -14,9,34,104,3,1.5900425772732012,0.6294206328381015,2 -14,10,35,111,1,-0.8178820250244837,1.4633194614817098,1 -14,11,36,110,6,-1.1811248427188683,0.5503790726147177,0 -14,12,37,102,4,-0.5521109827498613,0.2288111251968629,2 -14,13,38,102,6,0.3949748622436907,1.5447878604004366,0 -14,14,39,120,0,-0.6463976133595792,0.1630326559403528,2 -14,15,40,109,6,-1.2805957817399582,-1.1826482612552474,1 -14,16,41,101,8,0.5508900386572504,-0.1671730495935667,0 -14,17,42,111,1,0.0853086889333529,-0.0132633758837144,0 -14,18,43,127,2,-0.218769711385981,-0.7019854368140658,2 -14,19,44,105,0,-0.6197723706627636,2.138611526896666,1 -14,20,45,115,7,-1.1247441521636312,-0.4641464411878229,2 -14,21,46,104,5,-0.072555647708791,-0.3929353813928705,0 -15,0,47,112,3,1.3399026572550203,1.878090363680033,0 -15,1,48,124,5,-0.024381870075387,0.5316335161706456,0 -15,2,49,121,0,-0.9970857305430262,-1.383512008752633,2 -15,3,50,124,8,-0.8334960910074487,-0.9116180632797354,0 -15,4,51,129,6,0.3845601295654262,0.1807163239900383,1 -15,5,52,103,3,-0.2294227620946844,0.3477709783565773,0 -15,6,53,119,6,1.0169773111385545,-0.5910886720642256,1 -15,7,54,118,4,0.3363413463024886,-1.0001172593271828,1 -15,8,55,110,0,0.0097818169970301,-0.6059838835052326,1 -15,9,56,102,3,0.5901905216267234,0.3696348407961316,0 -15,10,57,121,8,-0.3329927633569184,-2.1592296837868172,0 -15,11,58,108,5,0.5469937351204301,0.1158729118533183,1 -15,12,59,101,6,1.4387947715516716,0.510184749224577,2 -15,13,60,102,4,-1.5928420817380986,-1.0181941589104413,1 -15,14,61,110,8,0.4144898850289152,-2.1012260841117647,2 -15,15,62,106,9,0.9626552542957164,-0.2641403390810031,1 -15,16,63,102,5,0.5938953228849851,1.126424989282014,0 -15,17,64,110,4,-0.6852888501385631,-0.2788158895740412,0 -15,18,65,109,4,-1.802304268569908,-0.3884284583050837,1 -15,19,66,115,2,-0.0129419618714691,-0.9695615693196264,0 -16,0,67,122,9,0.728096157555939,1.57860530312412,0 -16,1,68,129,5,0.7156279104852876,-0.4852580169423038,1 -16,2,69,101,0,1.3546839988588728,1.3115417566478216,0 -16,3,70,117,2,-1.232361381356479,-0.9375197390131628,0 -16,4,71,120,0,-0.0435872778479013,-1.4933926504379784,0 -16,5,72,127,8,0.5484525334475734,1.66698134913082,0 -16,6,73,122,4,1.307847634805456,0.4215958062784253,1 -16,7,74,112,4,-2.618532214839832,1.6374672768528042,2 -16,8,75,127,7,-0.8496513139782857,0.2645026021626481,0 -16,9,76,115,9,-0.7521255704289022,0.7526070369449078,1 -16,10,77,117,0,-2.126705535677708,0.2182067272217519,0 -16,11,78,102,5,0.8752645615044675,0.2730385089817146,2 -16,12,79,120,6,0.3561666568718871,-1.1795205381405394,2 -16,13,80,108,7,-0.5208614133489836,-0.300497076461078,1 -16,14,81,126,8,0.1299212462358277,-0.8405052153381654,2 -16,15,82,116,6,-0.3047310126274782,0.7356818372550097,2 -16,16,83,102,5,1.9115397604052724,-0.2388956656409064,0 -16,17,84,121,0,-0.8567878621140438,1.643155432693797,2 -16,18,85,118,8,0.9366327938393536,0.5319856670267262,0 -16,19,86,105,5,0.1183670068806765,-2.1326672344812105,0 -17,0,87,113,4,-0.1473154301210917,-1.6042550026469249,0 -17,1,88,127,3,-1.3056540391037692,-0.5997440870462475,0 -17,2,89,105,7,3.0274943343874083,-0.0520796489093672,0 -17,3,90,104,9,0.3617294328556023,-0.0883800576540255,0 -17,4,91,106,9,-0.4453650036042871,-0.8334261447948773,1 -17,5,92,118,0,0.6282853705023487,1.350321469218172,2 -17,6,93,112,0,0.9642562105511686,-0.9992263103431246,1 -17,7,94,122,0,-0.8330901074711051,-0.7635405661499053,2 -17,8,95,105,0,0.7981435937792382,-0.6666971915003546,2 -17,9,96,121,6,0.7995168560801881,-3.730120038128068,2 -17,10,97,119,9,-0.4778765668524142,-1.8018134368021577,1 -17,11,98,126,1,1.7731643504472827,-2.966586951844483,1 -17,12,99,120,9,1.2401001274351815,0.9763019660890628,1 -17,13,100,103,6,-0.6172799146920306,-1.9341599869280055,0 -17,14,101,117,1,0.7526864964032826,0.0115401685101198,0 -17,15,102,114,6,-0.3922040087053289,-1.7973367751171303,1 -18,0,103,120,4,1.3164444471305916,-0.5782800824093337,0 -18,1,104,123,4,0.420020710446368,-0.1850434000530602,0 -18,2,105,127,0,0.8921979069031415,-0.2332258635179755,0 -18,3,106,105,4,0.4279062963690861,-1.5395002171602334,1 -18,4,107,112,6,-0.1809155329521617,-1.106476206464435,0 -18,5,108,108,4,0.5335886571652085,-2.129243520644403,1 -18,6,109,123,8,-0.7825217022412374,0.4768143516638856,0 -18,7,110,108,6,-1.3297057074440568,-0.1723342300598751,1 -18,8,111,129,9,-0.9899126599978328,-0.6345577264308937,2 -18,9,112,122,0,-1.2241592816111664,-1.3588134360661253,0 -18,10,113,117,7,-1.6081151211440765,-1.115309203106232,1 -18,11,114,122,2,0.6893365374951431,1.660083512711184,1 -18,12,115,109,3,1.3184511797851892,0.5981510743069248,1 -18,13,116,112,1,0.2530927744153326,0.1762152669186038,2 -18,14,117,126,9,-0.7218134212123581,0.0995596156598381,1 -18,15,118,120,9,-0.0069204705176007,-0.134973127015259,2 -19,0,119,127,0,-0.4138548174567836,-0.7491928547518463,0 -19,1,120,119,8,-0.9217336181544192,2.0705334246918015,2 -19,2,121,127,4,-1.086483742151834,-0.714833705558571,1 -19,3,122,102,3,1.474288547233567,0.1631413469278299,1 -19,4,123,113,6,1.5875581988032164,1.027268717867479,0 -19,5,124,119,5,-1.8988657509221156,1.8808868244932129,2 -19,6,125,103,2,-0.4050814416560676,0.4437277986745326,2 -19,7,126,126,1,0.8726496980525889,0.1240530371932496,0 -19,8,127,128,4,1.8224737121284704,0.4209771365993368,2 -19,9,128,113,5,0.3293755829411718,0.6439655653176443,1 -19,10,129,111,7,1.1353736264714218,-0.0632902816234641,0 -19,11,130,117,9,-2.088924140703356,0.7873992206662046,2 -19,12,131,124,8,1.1776401371612333,0.1655764555283259,2 -19,13,132,100,2,0.3101310578176122,-0.543886007962999,1 -19,14,133,119,4,0.0489690373962899,-1.3584102327948733,1 -19,15,134,117,4,-1.122565585229101,-0.1804465985609838,0 -19,16,135,103,7,-0.1379191118897307,1.0044578374950142,1 -19,17,136,110,4,0.477337569358077,0.7537311601289707,2 -19,18,137,108,7,-0.0207534690671556,0.5841218654437593,0 -19,19,138,125,5,0.9348832049035216,-0.7226482893432934,0 -19,20,139,107,8,-0.804227609128954,-0.5571601176468748,0 -20,0,140,111,9,0.1431939714725609,0.0422524056965653,2 -20,1,141,112,3,-0.4605569829841085,-0.4325683214460127,1 -20,2,142,113,7,-1.0553504705140826,0.8465631724299651,0 -20,3,143,113,1,0.7206026881536415,0.2871208611901518,2 -20,4,144,113,8,-1.718237086897971,-0.7868091893675095,1 -20,5,145,121,1,0.527556676509205,-1.9318448023128916,1 -20,6,146,100,4,1.4729892021615898,0.8391818770701904,0 -20,7,147,129,6,-1.0059562338044414,0.0019652114728092,0 -20,8,148,100,4,1.6305569491478604,1.0951871930560133,1 -20,9,149,125,6,2.547370551387279,-1.0208678213187818,1 -20,10,150,118,9,2.033324551178638,-0.1154719415024776,1 -20,11,151,121,7,0.4043282940651028,-0.8707042594597949,2 -20,12,152,127,8,0.4191280421631976,0.0957855998835066,1 -20,13,153,121,1,-1.5587069063508987,0.1791648322349623,0 -20,14,154,129,1,-0.7830858337970409,0.0648510199038132,0 -20,15,155,113,8,0.1371199788701356,0.2161753878561426,0 -20,16,156,110,3,1.5499797081722422,1.0344576013849434,1 -21,0,157,101,6,1.818575785843776,-1.9949939475490075,2 -21,1,158,119,4,0.1183152450709592,-1.0344467157761543,0 -21,2,159,103,5,0.7652662329923993,-1.0019028093921996,1 -21,3,160,113,7,1.5686505707558396,-0.5766936717058257,2 -21,4,161,105,6,0.1255815698914305,-0.9386728917772926,2 -21,5,162,111,9,0.4338170324237214,-1.0166286003580864,0 -21,6,163,124,7,1.449813536152996,1.2624300972050062,1 -21,7,164,108,9,0.8621272110483021,-0.5284653415605093,1 -21,8,165,118,4,0.3234054613524826,1.1616916884353274,1 -21,9,166,124,2,0.5064088364815167,-0.4651367065068575,0 -21,10,167,109,1,1.4913472073701488,0.2991262309237505,0 -21,11,168,121,8,1.023767695317657,-0.055448324522217,0 -21,12,169,110,4,-1.4437814578576325,0.599379484168683,0 -21,13,170,120,4,-1.2314791793635456,0.3901346999802171,0 -21,14,171,114,4,0.7673842918563573,0.7395058195373676,2 -21,15,172,107,8,1.6847926118412546,-0.2618624769340897,2 -21,16,173,100,2,0.4514898135283557,-0.4452332175533571,0 -21,17,174,111,6,1.5702390064548917,0.7613097400139596,1 -21,18,175,107,9,-1.4233773553881364,-2.2941794906187303,2 -21,19,176,109,4,-0.8348156343282267,0.3184559910398074,0 -21,20,177,114,1,1.64301604024024,-0.8105101252279568,0 -21,21,178,102,6,0.5931810417739123,-0.4433977354954991,2 -21,22,179,126,2,0.2933912934374598,-0.2155182381754514,1 -21,23,180,115,2,1.0447321534051053,1.6744425413368984,2 -22,0,181,128,0,0.6181051753418312,-1.3708388861688323,0 -22,1,182,120,0,-0.4304087997159057,0.3153721331558907,1 -22,2,183,103,5,0.4244180231779655,-0.9094229514381224,2 -22,3,184,116,5,-0.0579477086770905,-0.7201079456603995,1 -22,4,185,122,6,0.3949805394801389,-0.3897487397244845,0 -22,5,186,100,6,-1.6105230975007343,-0.7172381117410999,0 -22,6,187,128,1,-2.243399918867632,0.2448124704232933,1 -22,7,188,102,7,0.9299617676237236,-0.099403340668543,1 -22,8,189,122,6,-1.4146582334712663,-1.521788254894823,0 -22,9,190,110,4,-0.7481546299358196,0.4304399046873204,1 -22,10,191,122,7,0.9978354826902832,0.8417705179306674,0 -22,11,192,107,5,-1.3269464311869232,-0.1530678319918289,2 -22,12,193,123,2,-1.5774782605931386,-0.6719432184447797,2 -22,13,194,103,8,-0.0946765671355123,1.828172446219632,0 -22,14,195,128,9,-1.0427121479775012,-1.2067768937681949,1 -22,15,196,106,7,-0.8627459284058191,-1.1178231135428731,1 -22,16,197,108,3,0.0995309724676549,0.6450065530334209,1 -22,17,198,119,4,-0.571201566340334,2.8820698132437697,1 -22,18,199,129,4,-1.0436603387986798,-0.5667820105949781,1 -23,0,200,120,0,-0.4304087997159057,0.3153721331558907,1 -23,1,201,103,5,0.4244180231779655,-0.9094229514381224,2 -23,2,202,116,5,-0.0579477086770905,-0.7201079456603995,1 -23,3,203,122,6,0.3949805394801389,-0.3897487397244845,0 -23,4,204,100,6,-1.6105230975007343,-0.7172381117410999,0 -23,5,205,128,1,-2.243399918867632,0.2448124704232933,1 -23,6,206,102,7,0.9299617676237236,-0.099403340668543,1 -23,7,207,122,6,-1.4146582334712663,-1.521788254894823,0 -23,8,208,110,4,-0.7481546299358196,0.4304399046873204,1 -23,9,209,122,7,0.9978354826902832,0.8417705179306674,0 -23,10,210,107,5,-1.3269464311869232,-0.1530678319918289,2 -23,11,211,123,2,-1.5774782605931386,-0.6719432184447797,2 -23,12,212,103,8,-0.0946765671355123,1.828172446219632,0 -23,13,213,128,9,-1.0427121479775012,-1.2067768937681949,1 -23,14,214,106,7,-0.8627459284058191,-1.1178231135428731,1 -23,15,215,108,3,0.0995309724676549,0.6450065530334209,1 -23,16,216,119,4,-0.571201566340334,2.8820698132437697,1 -23,17,217,129,4,-1.0436603387986798,-0.5667820105949781,1 -24,0,218,120,0,-0.4304087997159057,0.3153721331558907,1 -24,1,219,103,5,0.4244180231779655,-0.9094229514381224,2 -24,2,220,116,5,-0.0579477086770905,-0.7201079456603995,1 -24,3,221,122,6,0.3949805394801389,-0.3897487397244845,0 -24,4,222,100,6,-1.6105230975007343,-0.7172381117410999,0 -24,5,223,128,1,-2.243399918867632,0.2448124704232933,1 -24,6,224,102,7,0.9299617676237236,-0.099403340668543,1 -24,7,225,122,6,-1.4146582334712663,-1.521788254894823,0 -24,8,226,110,4,-0.7481546299358196,0.4304399046873204,1 -24,9,227,122,7,0.9978354826902832,0.8417705179306674,0 -24,10,228,107,5,-1.3269464311869232,-0.1530678319918289,2 -24,11,229,123,2,-1.5774782605931386,-0.6719432184447797,2 -24,12,230,103,8,-0.0946765671355123,1.828172446219632,0 -24,13,231,128,9,-1.0427121479775012,-1.2067768937681949,1 -24,14,232,106,7,-0.8627459284058191,-1.1178231135428731,1 -24,15,233,108,3,0.0995309724676549,0.6450065530334209,1 -24,16,234,119,4,-0.571201566340334,2.8820698132437697,1 -24,17,235,129,4,-1.0436603387986798,-0.5667820105949781,1 -25,0,236,120,0,-0.4304087997159057,0.3153721331558907,1 -25,1,237,103,5,0.4244180231779655,-0.9094229514381224,2 -25,2,238,116,5,-0.0579477086770905,-0.7201079456603995,1 -25,3,239,122,6,0.3949805394801389,-0.3897487397244845,0 -25,4,240,100,6,-1.6105230975007343,-0.7172381117410999,0 -25,5,241,128,1,-2.243399918867632,0.2448124704232933,1 -25,6,242,102,7,0.9299617676237236,-0.099403340668543,1 -25,7,243,122,6,-1.4146582334712663,-1.521788254894823,0 -25,8,244,110,4,-0.7481546299358196,0.4304399046873204,1 -25,9,245,122,7,0.9978354826902832,0.8417705179306674,0 -25,10,246,107,5,-1.3269464311869232,-0.1530678319918289,2 -25,11,247,123,2,-1.5774782605931386,-0.6719432184447797,2 -25,12,248,103,8,-0.0946765671355123,1.828172446219632,0 -25,13,249,128,9,-1.0427121479775012,-1.2067768937681949,1 -25,14,250,106,7,-0.8627459284058191,-1.1178231135428731,1 -25,15,251,108,3,0.0995309724676549,0.6450065530334209,1 -25,16,252,119,4,-0.571201566340334,2.8820698132437697,1 -25,17,253,129,4,-1.0436603387986798,-0.5667820105949781,1 diff --git a/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-3.csv b/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-3.csv deleted file mode 100644 index cb7a3a2a..00000000 --- a/tests/resources/source_data/test-data-categorical-multi-file/test-data-categorical-mullti-file-3.csv +++ /dev/null @@ -1,255 +0,0 @@ -sequenceId,itemPosition,Unnamed: 0,itemId,supCat1,supReal2,supReal3,supCat4 -26,0,0,112,3,0.47512151913436,-0.5820086906467112,2 -26,1,1,104,9,-1.1261734468621212,-0.9089247216662516,1 -26,2,2,129,7,-1.2162003117631153,-0.5154371712252781,1 -26,3,3,121,9,-1.4933477031742597,-0.8796536665660435,0 -26,4,4,109,2,-0.9670816286563634,-0.0946835025191322,2 -26,5,5,111,6,0.2951585961176835,0.573453806301526,0 -26,6,6,121,9,-0.8256811879776176,-0.6726355586632142,0 -26,7,7,109,3,-0.2626654773388363,0.7338377851923579,1 -26,8,8,126,4,1.3128198055960525,0.4123843865529258,0 -26,9,9,112,3,-0.1724514169048517,1.0002758074691138,2 -26,10,10,104,4,0.9984558771504448,-1.6793033775681865,1 -26,11,11,103,9,0.8241769523505718,0.5192150697838572,0 -26,12,12,119,2,1.1524820376873743,-0.0684948380162701,2 -26,13,13,103,0,-0.4532287722802309,-1.012670179240466,1 -26,14,14,105,7,0.7406957728589633,0.4598005719286187,2 -26,15,15,121,6,-0.3046679002763786,2.228549215957172,0 -26,16,16,107,1,-0.0981028713050338,1.580761752579522,2 -26,17,17,128,4,-0.338687599861625,1.0274608136462915,1 -26,18,18,128,6,-0.5926329276128396,0.7105776900317172,2 -26,19,19,116,9,-0.8683614880285571,0.7000235215395574,1 -26,20,20,106,3,-0.2223944052810371,-0.1421408408449271,2 -26,21,21,103,9,0.2238516678750416,0.7671249818780963,1 -26,22,22,119,6,-0.4794418411187094,0.284269664190007,0 -26,23,23,105,8,-0.208702368387007,0.5367982644094035,0 -26,24,24,100,4,0.1273379928547726,0.9143038302645866,1 -27,0,25,113,9,-0.2656666807034851,0.4806224256538509,1 -27,1,26,116,1,-0.9754261015074585,0.2940960032574599,0 -27,2,27,105,5,-2.0639707193059498,1.2133396475903873,1 -27,3,28,113,6,0.7319848912899831,-0.4229377963857184,1 -27,4,29,108,1,-0.0908278640955465,0.5666495515437896,2 -27,5,30,118,5,0.2854174163780527,0.6009858839082124,0 -27,6,31,102,3,0.2014682827257396,1.7092664244525773,1 -27,7,32,102,0,0.1453056346528572,0.3399258904044571,1 -27,8,33,121,6,0.8095167753996217,-0.1079289200633795,1 -27,9,34,104,3,1.5900425772732012,0.6294206328381015,2 -27,10,35,111,1,-0.8178820250244837,1.4633194614817098,1 -27,11,36,110,6,-1.1811248427188683,0.5503790726147177,0 -27,12,37,102,4,-0.5521109827498613,0.2288111251968629,2 -27,13,38,102,6,0.3949748622436907,1.5447878604004366,0 -27,14,39,120,0,-0.6463976133595792,0.1630326559403528,2 -27,15,40,109,6,-1.2805957817399582,-1.1826482612552474,1 -27,16,41,101,8,0.5508900386572504,-0.1671730495935667,0 -27,17,42,111,1,0.0853086889333529,-0.0132633758837144,0 -27,18,43,127,2,-0.218769711385981,-0.7019854368140658,2 -27,19,44,105,0,-0.6197723706627636,2.138611526896666,1 -27,20,45,115,7,-1.1247441521636312,-0.4641464411878229,2 -27,21,46,104,5,-0.072555647708791,-0.3929353813928705,0 -28,0,47,112,3,1.3399026572550203,1.878090363680033,0 -28,1,48,124,5,-0.024381870075387,0.5316335161706456,0 -28,2,49,121,0,-0.9970857305430262,-1.383512008752633,2 -28,3,50,124,8,-0.8334960910074487,-0.9116180632797354,0 -28,4,51,129,6,0.3845601295654262,0.1807163239900383,1 -28,5,52,103,3,-0.2294227620946844,0.3477709783565773,0 -28,6,53,119,6,1.0169773111385545,-0.5910886720642256,1 -28,7,54,118,4,0.3363413463024886,-1.0001172593271828,1 -28,8,55,110,0,0.0097818169970301,-0.6059838835052326,1 -28,9,56,102,3,0.5901905216267234,0.3696348407961316,0 -28,10,57,121,8,-0.3329927633569184,-2.1592296837868172,0 -28,11,58,108,5,0.5469937351204301,0.1158729118533183,1 -28,12,59,101,6,1.4387947715516716,0.510184749224577,2 -28,13,60,102,4,-1.5928420817380986,-1.0181941589104413,1 -28,14,61,110,8,0.4144898850289152,-2.1012260841117647,2 -28,15,62,106,9,0.9626552542957164,-0.2641403390810031,1 -28,16,63,102,5,0.5938953228849851,1.126424989282014,0 -28,17,64,110,4,-0.6852888501385631,-0.2788158895740412,0 -28,18,65,109,4,-1.802304268569908,-0.3884284583050837,1 -28,19,66,115,2,-0.0129419618714691,-0.9695615693196264,0 -29,0,67,122,9,0.728096157555939,1.57860530312412,0 -29,1,68,129,5,0.7156279104852876,-0.4852580169423038,1 -29,2,69,101,0,1.3546839988588728,1.3115417566478216,0 -29,3,70,117,2,-1.232361381356479,-0.9375197390131628,0 -29,4,71,120,0,-0.0435872778479013,-1.4933926504379784,0 -29,5,72,127,8,0.5484525334475734,1.66698134913082,0 -29,6,73,122,4,1.307847634805456,0.4215958062784253,1 -29,7,74,112,4,-2.618532214839832,1.6374672768528042,2 -29,8,75,127,7,-0.8496513139782857,0.2645026021626481,0 -29,9,76,115,9,-0.7521255704289022,0.7526070369449078,1 -29,10,77,117,0,-2.126705535677708,0.2182067272217519,0 -29,11,78,102,5,0.8752645615044675,0.2730385089817146,2 -29,12,79,120,6,0.3561666568718871,-1.1795205381405394,2 -29,13,80,108,7,-0.5208614133489836,-0.300497076461078,1 -29,14,81,126,8,0.1299212462358277,-0.8405052153381654,2 -29,15,82,116,6,-0.3047310126274782,0.7356818372550097,2 -29,16,83,102,5,1.9115397604052724,-0.2388956656409064,0 -29,17,84,121,0,-0.8567878621140438,1.643155432693797,2 -29,18,85,118,8,0.9366327938393536,0.5319856670267262,0 -29,19,86,105,5,0.1183670068806765,-2.1326672344812105,0 -30,0,87,113,4,-0.1473154301210917,-1.6042550026469249,0 -30,1,88,127,3,-1.3056540391037692,-0.5997440870462475,0 -30,2,89,105,7,3.0274943343874083,-0.0520796489093672,0 -30,3,90,104,9,0.3617294328556023,-0.0883800576540255,0 -30,4,91,106,9,-0.4453650036042871,-0.8334261447948773,1 -30,5,92,118,0,0.6282853705023487,1.350321469218172,2 -30,6,93,112,0,0.9642562105511686,-0.9992263103431246,1 -30,7,94,122,0,-0.8330901074711051,-0.7635405661499053,2 -30,8,95,105,0,0.7981435937792382,-0.6666971915003546,2 -30,9,96,121,6,0.7995168560801881,-3.730120038128068,2 -30,10,97,119,9,-0.4778765668524142,-1.8018134368021577,1 -30,11,98,126,1,1.7731643504472827,-2.966586951844483,1 -30,12,99,120,9,1.2401001274351815,0.9763019660890628,1 -30,13,100,103,6,-0.6172799146920306,-1.9341599869280055,0 -30,14,101,117,1,0.7526864964032826,0.0115401685101198,0 -30,15,102,114,6,-0.3922040087053289,-1.7973367751171303,1 -31,0,103,120,4,1.3164444471305916,-0.5782800824093337,0 -31,1,104,123,4,0.420020710446368,-0.1850434000530602,0 -31,2,105,127,0,0.8921979069031415,-0.2332258635179755,0 -31,3,106,105,4,0.4279062963690861,-1.5395002171602334,1 -31,4,107,112,6,-0.1809155329521617,-1.106476206464435,0 -31,5,108,108,4,0.5335886571652085,-2.129243520644403,1 -31,6,109,123,8,-0.7825217022412374,0.4768143516638856,0 -31,7,110,108,6,-1.3297057074440568,-0.1723342300598751,1 -31,8,111,129,9,-0.9899126599978328,-0.6345577264308937,2 -31,9,112,122,0,-1.2241592816111664,-1.3588134360661253,0 -31,10,113,117,7,-1.6081151211440765,-1.115309203106232,1 -31,11,114,122,2,0.6893365374951431,1.660083512711184,1 -31,12,115,109,3,1.3184511797851892,0.5981510743069248,1 -31,13,116,112,1,0.2530927744153326,0.1762152669186038,2 -31,14,117,126,9,-0.7218134212123581,0.0995596156598381,1 -31,15,118,120,9,-0.0069204705176007,-0.134973127015259,2 -32,0,119,127,0,-0.4138548174567836,-0.7491928547518463,0 -32,1,120,119,8,-0.9217336181544192,2.0705334246918015,2 -32,2,121,127,4,-1.086483742151834,-0.714833705558571,1 -32,3,122,102,3,1.474288547233567,0.1631413469278299,1 -32,4,123,113,6,1.5875581988032164,1.027268717867479,0 -32,5,124,119,5,-1.8988657509221156,1.8808868244932129,2 -32,6,125,103,2,-0.4050814416560676,0.4437277986745326,2 -32,7,126,126,1,0.8726496980525889,0.1240530371932496,0 -32,8,127,128,4,1.8224737121284704,0.4209771365993368,2 -32,9,128,113,5,0.3293755829411718,0.6439655653176443,1 -32,10,129,111,7,1.1353736264714218,-0.0632902816234641,0 -32,11,130,117,9,-2.088924140703356,0.7873992206662046,2 -32,12,131,124,8,1.1776401371612333,0.1655764555283259,2 -32,13,132,100,2,0.3101310578176122,-0.543886007962999,1 -32,14,133,119,4,0.0489690373962899,-1.3584102327948733,1 -32,15,134,117,4,-1.122565585229101,-0.1804465985609838,0 -32,16,135,103,7,-0.1379191118897307,1.0044578374950142,1 -32,17,136,110,4,0.477337569358077,0.7537311601289707,2 -32,18,137,108,7,-0.0207534690671556,0.5841218654437593,0 -32,19,138,125,5,0.9348832049035216,-0.7226482893432934,0 -32,20,139,107,8,-0.804227609128954,-0.5571601176468748,0 -33,0,140,111,9,0.1431939714725609,0.0422524056965653,2 -33,1,141,112,3,-0.4605569829841085,-0.4325683214460127,1 -33,2,142,113,7,-1.0553504705140826,0.8465631724299651,0 -33,3,143,113,1,0.7206026881536415,0.2871208611901518,2 -33,4,144,113,8,-1.718237086897971,-0.7868091893675095,1 -33,5,145,121,1,0.527556676509205,-1.9318448023128916,1 -33,6,146,100,4,1.4729892021615898,0.8391818770701904,0 -33,7,147,129,6,-1.0059562338044414,0.0019652114728092,0 -33,8,148,100,4,1.6305569491478604,1.0951871930560133,1 -33,9,149,125,6,2.547370551387279,-1.0208678213187818,1 -33,10,150,118,9,2.033324551178638,-0.1154719415024776,1 -33,11,151,121,7,0.4043282940651028,-0.8707042594597949,2 -33,12,152,127,8,0.4191280421631976,0.0957855998835066,1 -33,13,153,121,1,-1.5587069063508987,0.1791648322349623,0 -33,14,154,129,1,-0.7830858337970409,0.0648510199038132,0 -33,15,155,113,8,0.1371199788701356,0.2161753878561426,0 -33,16,156,110,3,1.5499797081722422,1.0344576013849434,1 -34,0,157,101,6,1.818575785843776,-1.9949939475490075,2 -34,1,158,119,4,0.1183152450709592,-1.0344467157761543,0 -34,2,159,103,5,0.7652662329923993,-1.0019028093921996,1 -34,3,160,113,7,1.5686505707558396,-0.5766936717058257,2 -34,4,161,105,6,0.1255815698914305,-0.9386728917772926,2 -34,5,162,111,9,0.4338170324237214,-1.0166286003580864,0 -34,6,163,124,7,1.449813536152996,1.2624300972050062,1 -34,7,164,108,9,0.8621272110483021,-0.5284653415605093,1 -34,8,165,118,4,0.3234054613524826,1.1616916884353274,1 -34,9,166,124,2,0.5064088364815167,-0.4651367065068575,0 -34,10,167,109,1,1.4913472073701488,0.2991262309237505,0 -34,11,168,121,8,1.023767695317657,-0.055448324522217,0 -34,12,169,110,4,-1.4437814578576325,0.599379484168683,0 -34,13,170,120,4,-1.2314791793635456,0.3901346999802171,0 -34,14,171,114,4,0.7673842918563573,0.7395058195373676,2 -34,15,172,107,8,1.6847926118412546,-0.2618624769340897,2 -34,16,173,100,2,0.4514898135283557,-0.4452332175533571,0 -34,17,174,111,6,1.5702390064548917,0.7613097400139596,1 -34,18,175,107,9,-1.4233773553881364,-2.2941794906187303,2 -34,19,176,109,4,-0.8348156343282267,0.3184559910398074,0 -34,20,177,114,1,1.64301604024024,-0.8105101252279568,0 -34,21,178,102,6,0.5931810417739123,-0.4433977354954991,2 -34,22,179,126,2,0.2933912934374598,-0.2155182381754514,1 -34,23,180,115,2,1.0447321534051053,1.6744425413368984,2 -35,0,181,128,0,0.6181051753418312,-1.3708388861688323,0 -35,1,182,120,0,-0.4304087997159057,0.3153721331558907,1 -35,2,183,103,5,0.4244180231779655,-0.9094229514381224,2 -35,3,184,116,5,-0.0579477086770905,-0.7201079456603995,1 -35,4,185,122,6,0.3949805394801389,-0.3897487397244845,0 -35,5,186,100,6,-1.6105230975007343,-0.7172381117410999,0 -35,6,187,128,1,-2.243399918867632,0.2448124704232933,1 -35,7,188,102,7,0.9299617676237236,-0.099403340668543,1 -35,8,189,122,6,-1.4146582334712663,-1.521788254894823,0 -35,9,190,110,4,-0.7481546299358196,0.4304399046873204,1 -35,10,191,122,7,0.9978354826902832,0.8417705179306674,0 -35,11,192,107,5,-1.3269464311869232,-0.1530678319918289,2 -35,12,193,123,2,-1.5774782605931386,-0.6719432184447797,2 -35,13,194,103,8,-0.0946765671355123,1.828172446219632,0 -35,14,195,128,9,-1.0427121479775012,-1.2067768937681949,1 -35,15,196,106,7,-0.8627459284058191,-1.1178231135428731,1 -35,16,197,108,3,0.0995309724676549,0.6450065530334209,1 -35,17,198,119,4,-0.571201566340334,2.8820698132437697,1 -35,18,199,129,4,-1.0436603387986798,-0.5667820105949781,1 -36,0,200,120,0,-0.4304087997159057,0.3153721331558907,1 -36,1,201,103,5,0.4244180231779655,-0.9094229514381224,2 -36,2,202,116,5,-0.0579477086770905,-0.7201079456603995,1 -36,3,203,122,6,0.3949805394801389,-0.3897487397244845,0 -36,4,204,100,6,-1.6105230975007343,-0.7172381117410999,0 -36,5,205,128,1,-2.243399918867632,0.2448124704232933,1 -36,6,206,102,7,0.9299617676237236,-0.099403340668543,1 -36,7,207,122,6,-1.4146582334712663,-1.521788254894823,0 -36,8,208,110,4,-0.7481546299358196,0.4304399046873204,1 -36,9,209,122,7,0.9978354826902832,0.8417705179306674,0 -36,10,210,107,5,-1.3269464311869232,-0.1530678319918289,2 -36,11,211,123,2,-1.5774782605931386,-0.6719432184447797,2 -36,12,212,103,8,-0.0946765671355123,1.828172446219632,0 -36,13,213,128,9,-1.0427121479775012,-1.2067768937681949,1 -36,14,214,106,7,-0.8627459284058191,-1.1178231135428731,1 -36,15,215,108,3,0.0995309724676549,0.6450065530334209,1 -36,16,216,119,4,-0.571201566340334,2.8820698132437697,1 -36,17,217,129,4,-1.0436603387986798,-0.5667820105949781,1 -37,0,218,120,0,-0.4304087997159057,0.3153721331558907,1 -37,1,219,103,5,0.4244180231779655,-0.9094229514381224,2 -37,2,220,116,5,-0.0579477086770905,-0.7201079456603995,1 -37,3,221,122,6,0.3949805394801389,-0.3897487397244845,0 -37,4,222,100,6,-1.6105230975007343,-0.7172381117410999,0 -37,5,223,128,1,-2.243399918867632,0.2448124704232933,1 -37,6,224,102,7,0.9299617676237236,-0.099403340668543,1 -37,7,225,122,6,-1.4146582334712663,-1.521788254894823,0 -37,8,226,110,4,-0.7481546299358196,0.4304399046873204,1 -37,9,227,122,7,0.9978354826902832,0.8417705179306674,0 -37,10,228,107,5,-1.3269464311869232,-0.1530678319918289,2 -37,11,229,123,2,-1.5774782605931386,-0.6719432184447797,2 -37,12,230,103,8,-0.0946765671355123,1.828172446219632,0 -37,13,231,128,9,-1.0427121479775012,-1.2067768937681949,1 -37,14,232,106,7,-0.8627459284058191,-1.1178231135428731,1 -37,15,233,108,3,0.0995309724676549,0.6450065530334209,1 -37,16,234,119,4,-0.571201566340334,2.8820698132437697,1 -37,17,235,129,4,-1.0436603387986798,-0.5667820105949781,1 -38,0,236,120,0,-0.4304087997159057,0.3153721331558907,1 -38,1,237,103,5,0.4244180231779655,-0.9094229514381224,2 -38,2,238,116,5,-0.0579477086770905,-0.7201079456603995,1 -38,3,239,122,6,0.3949805394801389,-0.3897487397244845,0 -38,4,240,100,6,-1.6105230975007343,-0.7172381117410999,0 -38,5,241,128,1,-2.243399918867632,0.2448124704232933,1 -38,6,242,102,7,0.9299617676237236,-0.099403340668543,1 -38,7,243,122,6,-1.4146582334712663,-1.521788254894823,0 -38,8,244,110,4,-0.7481546299358196,0.4304399046873204,1 -38,9,245,122,7,0.9978354826902832,0.8417705179306674,0 -38,10,246,107,5,-1.3269464311869232,-0.1530678319918289,2 -38,11,247,123,2,-1.5774782605931386,-0.6719432184447797,2 -38,12,248,103,8,-0.0946765671355123,1.828172446219632,0 -38,13,249,128,9,-1.0427121479775012,-1.2067768937681949,1 -38,14,250,106,7,-0.8627459284058191,-1.1178231135428731,1 -38,15,251,108,3,0.0995309724676549,0.6450065530334209,1 -38,16,252,119,4,-0.571201566340334,2.8820698132437697,1 -38,17,253,129,4,-1.0436603387986798,-0.5667820105949781,1 diff --git a/tests/resources/source_data/test-data-categorical-multitarget-5.csv b/tests/resources/source_data/test-data-categorical-multitarget-5.csv deleted file mode 100644 index bb36376c..00000000 --- a/tests/resources/source_data/test-data-categorical-multitarget-5.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal2,supReal3,supCat4 -0,0,112,3,0.47512151913436,-0.5820086906467112,2 -0,1,104,9,-1.1261734468621212,-0.9089247216662516,1 -0,2,129,7,-1.2162003117631153,-0.5154371712252781,1 -0,3,121,9,-1.4933477031742597,-0.8796536665660435,0 -0,4,109,2,-0.9670816286563634,-0.0946835025191322,2 -0,5,111,6,0.2951585961176835,0.573453806301526,0 -0,6,121,9,-0.8256811879776176,-0.6726355586632142,0 -0,7,109,3,-0.2626654773388363,0.7338377851923579,1 -0,8,126,4,1.3128198055960525,0.4123843865529258,0 -0,9,112,3,-0.1724514169048517,1.0002758074691138,2 -0,10,104,4,0.9984558771504448,-1.6793033775681865,1 -0,11,103,9,0.8241769523505718,0.5192150697838572,0 -0,12,119,2,1.1524820376873743,-0.0684948380162701,2 -0,13,103,0,-0.4532287722802309,-1.012670179240466,1 -0,14,105,7,0.7406957728589633,0.4598005719286187,2 -0,15,121,6,-0.3046679002763786,2.228549215957172,0 -0,16,107,1,-0.0981028713050338,1.580761752579522,2 -0,17,128,4,-0.338687599861625,1.0274608136462915,1 -0,18,128,6,-0.5926329276128396,0.7105776900317172,2 -0,19,116,9,-0.8683614880285571,0.7000235215395574,1 -0,20,106,3,-0.2223944052810371,-0.1421408408449271,2 -0,21,103,9,0.2238516678750416,0.7671249818780963,1 -0,22,119,6,-0.4794418411187094,0.284269664190007,0 -0,23,105,8,-0.208702368387007,0.5367982644094035,0 -0,24,100,4,0.1273379928547726,0.9143038302645866,1 -1,25,113,9,-0.2656666807034851,0.4806224256538509,1 -1,26,116,1,-0.9754261015074585,0.2940960032574599,0 -1,27,105,5,-2.0639707193059498,1.2133396475903873,1 -1,28,113,6,0.7319848912899831,-0.4229377963857184,1 -1,29,108,1,-0.0908278640955465,0.5666495515437896,2 -1,30,118,5,0.2854174163780527,0.6009858839082124,0 -1,31,102,3,0.2014682827257396,1.7092664244525773,1 -1,32,102,0,0.1453056346528572,0.3399258904044571,1 -1,33,121,6,0.8095167753996217,-0.1079289200633795,1 -1,34,104,3,1.5900425772732012,0.6294206328381015,2 -1,35,111,1,-0.8178820250244837,1.4633194614817098,1 -1,36,110,6,-1.1811248427188683,0.5503790726147177,0 -1,37,102,4,-0.5521109827498613,0.2288111251968629,2 -1,38,102,6,0.3949748622436907,1.5447878604004366,0 -1,39,120,0,-0.6463976133595792,0.1630326559403528,2 -1,40,109,6,-1.2805957817399582,-1.1826482612552474,1 -1,41,101,8,0.5508900386572504,-0.1671730495935667,0 -1,42,111,1,0.0853086889333529,-0.0132633758837144,0 -1,43,127,2,-0.218769711385981,-0.7019854368140658,2 -1,44,105,0,-0.6197723706627636,2.138611526896666,1 -1,45,115,7,-1.1247441521636312,-0.4641464411878229,2 -1,46,104,5,-0.072555647708791,-0.3929353813928705,0 -2,47,112,3,1.3399026572550203,1.878090363680033,0 -2,48,124,5,-0.024381870075387,0.5316335161706456,0 -2,49,121,0,-0.9970857305430262,-1.383512008752633,2 -2,50,124,8,-0.8334960910074487,-0.9116180632797354,0 -2,51,129,6,0.3845601295654262,0.1807163239900383,1 -2,52,103,3,-0.2294227620946844,0.3477709783565773,0 -2,53,119,6,1.0169773111385545,-0.5910886720642256,1 -2,54,118,4,0.3363413463024886,-1.0001172593271828,1 -2,55,110,0,0.0097818169970301,-0.6059838835052326,1 -2,56,102,3,0.5901905216267234,0.3696348407961316,0 -2,57,121,8,-0.3329927633569184,-2.1592296837868172,0 -2,58,108,5,0.5469937351204301,0.1158729118533183,1 -2,59,101,6,1.4387947715516716,0.510184749224577,2 -2,60,102,4,-1.5928420817380986,-1.0181941589104413,1 -2,61,110,8,0.4144898850289152,-2.1012260841117647,2 -2,62,106,9,0.9626552542957164,-0.2641403390810031,1 -2,63,102,5,0.5938953228849851,1.126424989282014,0 -2,64,110,4,-0.6852888501385631,-0.2788158895740412,0 -2,65,109,4,-1.802304268569908,-0.3884284583050837,1 -2,66,115,2,-0.0129419618714691,-0.9695615693196264,0 -3,67,122,9,0.728096157555939,1.57860530312412,0 -3,68,129,5,0.7156279104852876,-0.4852580169423038,1 -3,69,101,0,1.3546839988588728,1.3115417566478216,0 -3,70,117,2,-1.232361381356479,-0.9375197390131628,0 -3,71,120,0,-0.0435872778479013,-1.4933926504379784,0 -3,72,127,8,0.5484525334475734,1.66698134913082,0 -3,73,122,4,1.307847634805456,0.4215958062784253,1 -3,74,112,4,-2.618532214839832,1.6374672768528042,2 -3,75,127,7,-0.8496513139782857,0.2645026021626481,0 -3,76,115,9,-0.7521255704289022,0.7526070369449078,1 -3,77,117,0,-2.126705535677708,0.2182067272217519,0 -3,78,102,5,0.8752645615044675,0.2730385089817146,2 -3,79,120,6,0.3561666568718871,-1.1795205381405394,2 -3,80,108,7,-0.5208614133489836,-0.300497076461078,1 -3,81,126,8,0.1299212462358277,-0.8405052153381654,2 -3,82,116,6,-0.3047310126274782,0.7356818372550097,2 -3,83,102,5,1.9115397604052724,-0.2388956656409064,0 -3,84,121,0,-0.8567878621140438,1.643155432693797,2 -3,85,118,8,0.9366327938393536,0.5319856670267262,0 -3,86,105,5,0.1183670068806765,-2.1326672344812105,0 -4,87,113,4,-0.1473154301210917,-1.6042550026469249,0 -4,88,127,3,-1.3056540391037692,-0.5997440870462475,0 -4,89,105,7,3.0274943343874083,-0.0520796489093672,0 -4,90,104,9,0.3617294328556023,-0.0883800576540255,0 -4,91,106,9,-0.4453650036042871,-0.8334261447948773,1 -4,92,118,0,0.6282853705023487,1.350321469218172,2 -4,93,112,0,0.9642562105511686,-0.9992263103431246,1 -4,94,122,0,-0.8330901074711051,-0.7635405661499053,2 -4,95,105,0,0.7981435937792382,-0.6666971915003546,2 -4,96,121,6,0.7995168560801881,-3.730120038128068,2 -4,97,119,9,-0.4778765668524142,-1.8018134368021577,1 -4,98,126,1,1.7731643504472827,-2.966586951844483,1 -4,99,120,9,1.2401001274351815,0.9763019660890628,1 -4,100,103,6,-0.6172799146920306,-1.9341599869280055,0 -4,101,117,1,0.7526864964032826,0.0115401685101198,0 -4,102,114,6,-0.3922040087053289,-1.7973367751171303,1 -5,103,120,4,1.3164444471305916,-0.5782800824093337,0 -5,104,123,4,0.420020710446368,-0.1850434000530602,0 -5,105,127,0,0.8921979069031415,-0.2332258635179755,0 -5,106,105,4,0.4279062963690861,-1.5395002171602334,1 -5,107,112,6,-0.1809155329521617,-1.106476206464435,0 -5,108,108,4,0.5335886571652085,-2.129243520644403,1 -5,109,123,8,-0.7825217022412374,0.4768143516638856,0 -5,110,108,6,-1.3297057074440568,-0.1723342300598751,1 -5,111,129,9,-0.9899126599978328,-0.6345577264308937,2 -5,112,122,0,-1.2241592816111664,-1.3588134360661253,0 -5,113,117,7,-1.6081151211440765,-1.115309203106232,1 -5,114,122,2,0.6893365374951431,1.660083512711184,1 -5,115,109,3,1.3184511797851892,0.5981510743069248,1 -5,116,112,1,0.2530927744153326,0.1762152669186038,2 -5,117,126,9,-0.7218134212123581,0.0995596156598381,1 -5,118,120,9,-0.0069204705176007,-0.134973127015259,2 -6,119,127,0,-0.4138548174567836,-0.7491928547518463,0 -6,120,119,8,-0.9217336181544192,2.0705334246918015,2 -6,121,127,4,-1.086483742151834,-0.714833705558571,1 -6,122,102,3,1.474288547233567,0.1631413469278299,1 -6,123,113,6,1.5875581988032164,1.027268717867479,0 -6,124,119,5,-1.8988657509221156,1.8808868244932129,2 -6,125,103,2,-0.4050814416560676,0.4437277986745326,2 -6,126,126,1,0.8726496980525889,0.1240530371932496,0 -6,127,128,4,1.8224737121284704,0.4209771365993368,2 -6,128,113,5,0.3293755829411718,0.6439655653176443,1 -6,129,111,7,1.1353736264714218,-0.0632902816234641,0 -6,130,117,9,-2.088924140703356,0.7873992206662046,2 -6,131,124,8,1.1776401371612333,0.1655764555283259,2 -6,132,100,2,0.3101310578176122,-0.543886007962999,1 -6,133,119,4,0.0489690373962899,-1.3584102327948733,1 -6,134,117,4,-1.122565585229101,-0.1804465985609838,0 -6,135,103,7,-0.1379191118897307,1.0044578374950142,1 -6,136,110,4,0.477337569358077,0.7537311601289707,2 -6,137,108,7,-0.0207534690671556,0.5841218654437593,0 -6,138,125,5,0.9348832049035216,-0.7226482893432934,0 -6,139,107,8,-0.804227609128954,-0.5571601176468748,0 -7,140,111,9,0.1431939714725609,0.0422524056965653,2 -7,141,112,3,-0.4605569829841085,-0.4325683214460127,1 -7,142,113,7,-1.0553504705140826,0.8465631724299651,0 -7,143,113,1,0.7206026881536415,0.2871208611901518,2 -7,144,113,8,-1.718237086897971,-0.7868091893675095,1 -7,145,121,1,0.527556676509205,-1.9318448023128916,1 -7,146,100,4,1.4729892021615898,0.8391818770701904,0 -7,147,129,6,-1.0059562338044414,0.0019652114728092,0 -7,148,100,4,1.6305569491478604,1.0951871930560133,1 -7,149,125,6,2.547370551387279,-1.0208678213187818,1 -7,150,118,9,2.033324551178638,-0.1154719415024776,1 -7,151,121,7,0.4043282940651028,-0.8707042594597949,2 -7,152,127,8,0.4191280421631976,0.0957855998835066,1 -7,153,121,1,-1.5587069063508987,0.1791648322349623,0 -7,154,129,1,-0.7830858337970409,0.0648510199038132,0 -7,155,113,8,0.1371199788701356,0.2161753878561426,0 -7,156,110,3,1.5499797081722422,1.0344576013849434,1 -8,157,101,6,1.818575785843776,-1.9949939475490075,2 -8,158,119,4,0.1183152450709592,-1.0344467157761543,0 -8,159,103,5,0.7652662329923993,-1.0019028093921996,1 -8,160,113,7,1.5686505707558396,-0.5766936717058257,2 -8,161,105,6,0.1255815698914305,-0.9386728917772926,2 -8,162,111,9,0.4338170324237214,-1.0166286003580864,0 -8,163,124,7,1.449813536152996,1.2624300972050062,1 -8,164,108,9,0.8621272110483021,-0.5284653415605093,1 -8,165,118,4,0.3234054613524826,1.1616916884353274,1 -8,166,124,2,0.5064088364815167,-0.4651367065068575,0 -8,167,109,1,1.4913472073701488,0.2991262309237505,0 -8,168,121,8,1.023767695317657,-0.055448324522217,0 -8,169,110,4,-1.4437814578576325,0.599379484168683,0 -8,170,120,4,-1.2314791793635456,0.3901346999802171,0 -8,171,114,4,0.7673842918563573,0.7395058195373676,2 -8,172,107,8,1.6847926118412546,-0.2618624769340897,2 -8,173,100,2,0.4514898135283557,-0.4452332175533571,0 -8,174,111,6,1.5702390064548917,0.7613097400139596,1 -8,175,107,9,-1.4233773553881364,-2.2941794906187303,2 -8,176,109,4,-0.8348156343282267,0.3184559910398074,0 -8,177,114,1,1.64301604024024,-0.8105101252279568,0 -8,178,102,6,0.5931810417739123,-0.4433977354954991,2 -8,179,126,2,0.2933912934374598,-0.2155182381754514,1 -8,180,115,2,1.0447321534051053,1.6744425413368984,2 -9,181,128,0,0.6181051753418312,-1.3708388861688323,0 -9,182,120,0,-0.4304087997159057,0.3153721331558907,1 -9,183,103,5,0.4244180231779655,-0.9094229514381224,2 -9,184,116,5,-0.0579477086770905,-0.7201079456603995,1 -9,185,122,6,0.3949805394801389,-0.3897487397244845,0 -9,186,100,6,-1.6105230975007343,-0.7172381117410999,0 -9,187,128,1,-2.243399918867632,0.2448124704232933,1 -9,188,102,7,0.9299617676237236,-0.099403340668543,1 -9,189,122,6,-1.4146582334712663,-1.521788254894823,0 -9,190,110,4,-0.7481546299358196,0.4304399046873204,1 -9,191,122,7,0.9978354826902832,0.8417705179306674,0 -9,192,107,5,-1.3269464311869232,-0.1530678319918289,2 -9,193,123,2,-1.5774782605931386,-0.6719432184447797,2 -9,194,103,8,-0.0946765671355123,1.828172446219632,0 -9,195,128,9,-1.0427121479775012,-1.2067768937681949,1 -9,196,106,7,-0.8627459284058191,-1.1178231135428731,1 -9,197,108,3,0.0995309724676549,0.6450065530334209,1 -9,198,119,4,-0.571201566340334,2.8820698132437697,1 -9,199,129,4,-1.0436603387986798,-0.5667820105949781,1 diff --git a/tests/resources/source_data/test-data-categorical-precomputed-stats-negative.csv b/tests/resources/source_data/test-data-categorical-precomputed-stats-negative.csv deleted file mode 100644 index 02a630c2..00000000 --- a/tests/resources/source_data/test-data-categorical-precomputed-stats-negative.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal2,supReal3,supCat4 -0,0,113,3,0.23756075956718,-1.1640173812934225,3 -0,1,105,9,-0.5630867234310606,-1.8178494433325032,1 -0,2,129,7,-0.6081001558815576,-1.0308743424505562,1 -0,3,121,9,-0.7466738515871298,-1.759307333132087,1 -0,4,109,3,-0.4835408143281817,-0.1893670050382644,3 -0,5,111,7,0.14757929805884176,1.146907612603052,1 -0,6,121,9,-0.4128405939888088,-1.3452711173264285,1 -0,7,109,3,-0.13133273866941814,1.4676755703847157,1 -0,8,127,5,0.6564099027980262,0.8247687731058516,1 -0,9,113,3,-0.08622570845242584,2.0005516149382276,3 -0,10,105,5,0.4992279385752224,-3.358606755136373,1 -0,11,103,9,0.4120884761752859,1.0384301395677145,1 -0,12,119,3,0.5762410188436872,-0.1369896760325402,3 -0,13,103,1,-0.22661438614011545,-2.025340358480932,1 -0,14,105,7,0.37034788642948163,0.9196011438572373,3 -0,15,121,7,-0.1523339501381893,4.457098431914344,1 -0,16,107,1,-0.0490514356525169,3.161523505159044,3 -0,17,129,5,-0.1693437999308125,2.054921627292583,1 -0,18,129,7,-0.2963164638064198,1.4211553800634344,3 -0,19,117,9,-0.43418074401427853,1.4000470430791148,1 -0,20,107,3,-0.11119720264051855,-0.2842816816898542,3 -0,21,103,9,0.1119258339375208,1.5342499637561926,1 -0,22,119,7,-0.2397209205593547,0.568539328380014,1 -0,23,105,9,-0.1043511841935035,1.073596528818807,1 -0,24,101,5,0.0636689964273863,1.8286076605291732,1 -1,25,113,9,-0.13283334035174255,0.9612448513077018,1 -1,26,117,1,-0.4877130507537292,0.5881920065149198,1 -1,27,105,5,-1.0319853596529749,2.4266792951807745,1 -1,28,113,7,0.36599244564499156,-0.8458755927714368,1 -1,29,109,1,-0.04541393204777325,1.1332991030875792,3 -1,30,119,5,0.14270870818902634,1.2019717678164248,1 -1,31,103,3,0.1007341413628698,3.4185328489051545,1 -1,32,103,1,0.0726528173264286,0.6798517808089142,1 -1,33,121,7,0.4047583876998109,-0.215857840126759,1 -1,34,105,3,0.7950212886366006,1.258841265676203,3 -1,35,111,1,-0.40894101251224185,2.9266389229634195,1 -1,36,111,7,-0.5905624213594342,1.1007581452294355,1 -1,37,103,5,-0.27605549137493063,0.4576222503937258,3 -1,38,103,7,0.19748743112184536,3.089575720800873,1 -1,39,121,1,-0.3231988066797896,0.3260653118807056,3 -1,40,109,7,-0.6402978908699791,-2.3652965225104947,1 -1,41,101,9,0.2754450193286252,-0.3343460991871334,1 -1,42,111,1,0.04265434446667645,-0.0265267517674288,1 -1,43,127,3,-0.1093848556929905,-1.4039708736281316,3 -1,44,105,1,-0.3098861853313818,4.277223053793332,1 -1,45,115,7,-0.5623720760818156,-0.9282928823756458,3 -1,46,105,5,-0.0362778238543955,-0.785870762785741,1 -2,47,113,3,0.6699513286275102,3.756180727360066,1 -2,48,125,5,-0.0121909350376935,1.0632670323412912,1 -2,49,121,1,-0.4985428652715131,-2.767024017505266,3 -2,50,125,9,-0.41674804550372435,-1.8232361265594708,1 -2,51,129,7,0.1922800647827131,0.3614326479800766,1 -2,52,103,3,-0.1147113810473422,0.6955419567131546,1 -2,53,119,7,0.5084886555692772,-1.182177344128451,1 -2,54,119,5,0.1681706731512443,-2.0002345186543655,1 -2,55,111,1,0.00489090849851505,-1.2119677670104652,1 -2,56,103,3,0.2950952608133617,0.7392696815922633,1 -2,57,121,9,-0.1664963816784592,-4.3184593675736345,1 -2,58,109,5,0.2734968675602151,0.2317458237066366,1 -2,59,101,7,0.7193973857758358,1.020369498449154,3 -2,60,103,5,-0.7964210408690493,-2.0363883178208826,1 -2,61,111,9,0.2072449425144576,-4.202452168223529,3 -2,62,107,9,0.4813276271478582,-0.5282806781620062,1 -2,63,103,5,0.29694766144249257,2.252849978564028,1 -2,64,111,5,-0.34264442506928156,-0.5576317791480824,1 -2,65,109,5,-0.901152134284954,-0.7768569166101674,1 -2,66,115,3,-0.00647098093573455,-1.939123138639253,1 -3,67,123,9,0.3640480787779695,3.15721060624824,1 -3,68,129,5,0.3578139552426438,-0.9705160338846076,1 -3,69,101,1,0.6773419994294364,2.623083513295643,1 -3,70,117,3,-0.6161806906782396,-1.8750394780263255,1 -3,71,121,1,-0.02179363892395065,-2.986785300875957,1 -3,72,127,9,0.2742262667237867,3.33396269826164,1 -3,73,123,5,0.653923817402728,0.8431916125568506,1 -3,74,113,5,-1.309266107419916,3.2749345537056085,3 -3,75,127,7,-0.4248256569891429,0.5290052043252962,1 -3,76,115,9,-0.3760627852144511,1.5052140738898157,1 -3,77,117,1,-1.063352767838854,0.4364134544435038,1 -3,78,103,5,0.43763228075223376,0.5460770179634292,3 -3,79,121,7,0.17808332843594354,-2.3590410762810787,3 -3,80,109,7,-0.2604307066744918,-0.600994152922156,1 -3,81,127,9,0.06496062311791385,-1.6810104306763307,3 -3,82,117,7,-0.1523655063137391,1.4713636745100194,3 -3,83,103,5,0.9557698802026362,-0.4777913312818128,1 -3,84,121,1,-0.4283939310570219,3.286310865387594,3 -3,85,119,9,0.4683163969196768,1.0639713340534525,1 -3,86,105,5,0.05918350344033825,-4.265334468962421,1 -4,87,113,5,-0.07365771506054584,-3.2085100052938498,1 -4,88,127,3,-0.6528270195518846,-1.199488174092495,1 -4,89,105,7,1.5137471671937042,-0.1041592978187344,1 -4,90,105,9,0.18086471642780114,-0.176760115308051,1 -4,91,107,9,-0.22268250180214355,-1.6668522895897546,1 -4,92,119,1,0.31414268525117434,2.700642938436344,3 -4,93,113,1,0.4821281052755843,-1.9984526206862492,1 -4,94,123,1,-0.41654505373555256,-1.5270811322998106,3 -4,95,105,1,0.3990717968896191,-1.3333943830007091,3 -4,96,121,7,0.39975842804009404,-7.460240076256136,3 -4,97,119,9,-0.2389382834262071,-3.6036268736043153,1 -4,98,127,1,0.8865821752236414,-5.933173903688966,1 -4,99,121,9,0.6200500637175907,1.9526039321781257,1 -4,100,103,7,-0.3086399573460153,-3.868319973856011,1 -4,101,117,1,0.3763432482016413,0.0230803370202396,1 -4,102,115,7,-0.19610200435266445,-3.5946735502342606,1 -5,103,121,5,0.6582222235652958,-1.1565601648186674,1 -5,104,123,5,0.210010355223184,-0.3700868001061204,1 -5,105,127,1,0.44609895345157075,-0.466451727035951,1 -5,106,105,5,0.21395314818454306,-3.079000434320467,1 -5,107,113,7,-0.09045776647608085,-2.21295241292887,1 -5,108,109,5,0.26679432858260427,-4.258487041288806,1 -5,109,123,9,-0.3912608511206187,0.9536287033277712,1 -5,110,109,7,-0.6648528537220284,-0.3446684601197502,1 -5,111,129,9,-0.4949563299989164,-1.2691154528617874,3 -5,112,123,1,-0.6120796408055832,-2.7176268721322505,1 -5,113,117,7,-0.8040575605720383,-2.230618406212464,1 -5,114,123,3,0.34466826874757156,3.320167025422368,1 -5,115,109,3,0.6592255898925946,1.1963021486138496,1 -5,116,113,1,0.1265463872076663,0.3524305338372076,3 -5,117,127,9,-0.36090671060617907,0.1991192313196762,1 -5,118,121,9,-0.00346023525880035,-0.269946254030518,3 -6,119,127,1,-0.2069274087283918,-1.4983857095036925,1 -6,120,119,9,-0.4608668090772096,4.141066849383603,3 -6,121,127,5,-0.543241871075917,-1.429667411117142,1 -6,122,103,3,0.7371442736167835,0.3262826938556598,1 -6,123,113,7,0.7937790994016082,2.054537435734958,1 -6,124,119,5,-0.9494328754610578,3.7617736489864257,3 -6,125,103,3,-0.2025407208280338,0.8874555973490652,3 -6,126,127,1,0.4363248490262944,0.2481060743864992,1 -6,127,129,5,0.9112368560642352,0.8419542731986736,3 -6,128,113,5,0.1646877914705859,1.2879311306352885,1 -6,129,111,7,0.5676868132357109,-0.1265805632469282,1 -6,130,117,9,-1.044462070351678,1.5747984413324092,3 -6,131,125,9,0.5888200685806166,0.3311529110566518,3 -6,132,101,3,0.1550655289088061,-1.087772015925998,1 -6,133,119,5,0.02448451869814495,-2.7168204655897465,1 -6,134,117,5,-0.5612827926145505,-0.3608931971219676,1 -6,135,103,7,-0.06895955594486534,2.0089156749900283,1 -6,136,111,5,0.2386687846790385,1.5074623202579414,3 -6,137,109,7,-0.0103767345335778,1.1682437308875186,1 -6,138,125,5,0.4674416024517608,-1.4452965786865868,1 -6,139,107,9,-0.402113804564477,-1.1143202352937496,1 -7,140,111,9,0.07159698573628046,0.0845048113931306,3 -7,141,113,3,-0.23027849149205426,-0.8651366428920254,1 -7,142,113,7,-0.5276752352570413,1.6931263448599303,1 -7,143,113,1,0.36030134407682074,0.5742417223803036,3 -7,144,113,9,-0.8591185434489855,-1.573618378735019,1 -7,145,121,1,0.2637783382546025,-3.863689604625783,1 -7,146,101,5,0.7364946010807949,1.6783637541403809,1 -7,147,129,7,-0.5029781169022207,0.0039304229456184,1 -7,148,101,5,0.8152784745739302,2.1903743861120266,1 -7,149,125,7,1.2736852756936394,-2.0417356426375637,1 -7,150,119,9,1.016662275589319,-0.2309438830049552,1 -7,151,121,7,0.2021641470325514,-1.7414085189195898,3 -7,152,127,9,0.2095640210815988,0.1915711997670132,1 -7,153,121,1,-0.7793534531754494,0.3583296644699246,1 -7,154,129,1,-0.39154291689852044,0.1297020398076264,1 -7,155,113,9,0.0685599894350678,0.4323507757122852,1 -7,156,111,3,0.7749898540861211,2.0689152027698867,1 -8,157,101,7,0.909287892921888,-3.989987895098015,3 -8,158,119,5,0.0591576225354796,-2.0688934315523086,1 -8,159,103,5,0.38263311649619963,-2.003805618784399,1 -8,160,113,7,0.7843252853779198,-1.1533873434116515,3 -8,161,105,7,0.06279078494571524,-1.8773457835545853,3 -8,162,111,9,0.2169085162118607,-2.033257200716173,1 -8,163,125,7,0.724906768076498,2.5248601944100124,1 -8,164,109,9,0.43106360552415107,-1.0569306831210186,1 -8,165,119,5,0.1617027306762413,2.323383376870655,1 -8,166,125,3,0.25320441824075834,-0.930273413013715,1 -8,167,109,1,0.7456736036850744,0.598252461847501,1 -8,168,121,9,0.5118838476588286,-0.110896649044434,1 -8,169,111,5,-0.7218907289288162,1.198758968337366,1 -8,170,121,5,-0.6157395896817728,0.7802693999604342,1 -8,171,115,5,0.38369214592817863,1.4790116390747352,3 -8,172,107,9,0.8423963059206273,-0.5237249538681794,3 -8,173,101,3,0.22574490676417786,-0.8904664351067142,1 -8,174,111,7,0.7851195032274458,1.5226194800279191,1 -8,175,107,9,-0.7116886776940682,-4.5883589812374606,3 -8,176,109,5,-0.41740781716411335,0.6369119820796147,1 -8,177,115,1,0.82150802012012,-1.6210202504559137,1 -8,178,103,7,0.29659052088695614,-0.8867954709909982,3 -8,179,127,3,0.1466956467187299,-0.4310364763509028,1 -8,180,115,3,0.5223660767025526,3.348885082673797,3 -9,181,129,1,0.3090525876709156,-2.7416777723376646,1 -9,182,121,1,-0.21520439985795284,0.6307442663117814,1 -9,183,103,5,0.21220901158898275,-1.8188459028762447,3 -9,184,117,5,-0.02897385433854525,-1.440215891320799,1 -9,185,123,7,0.19749026974006945,-0.779497479448969,1 -9,186,101,7,-0.8052615487503672,-1.4344762234821997,1 -9,187,129,1,-1.121699959433816,0.4896249408465866,1 -9,188,103,7,0.4649808838118618,-0.198806681337086,1 -9,189,123,7,-0.7073291167356331,-3.043576509789646,1 -9,190,111,5,-0.3740773149679098,0.8608798093746408,1 -9,191,123,7,0.4989177413451416,1.6835410358613347,1 -9,192,107,5,-0.6634732155934616,-0.3061356639836578,3 -9,193,123,3,-0.7887391302965693,-1.3438864368895593,3 -9,194,103,9,-0.04733828356775615,3.656344892439264,1 -9,195,129,9,-0.5213560739887506,-2.4135537875363897,1 -9,196,107,7,-0.43137296420290955,-2.2356462270857462,1 -9,197,109,3,0.04976548623382745,1.2900131060668418,1 -9,198,119,5,-0.285600783170167,5.764139626487539,1 -9,199,129,5,-0.5218301693993399,-1.1335640211899563,1 diff --git a/tests/resources/source_data/test-data-categorical-precomputed-stats.csv b/tests/resources/source_data/test-data-categorical-precomputed-stats.csv deleted file mode 100644 index 02a630c2..00000000 --- a/tests/resources/source_data/test-data-categorical-precomputed-stats.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal2,supReal3,supCat4 -0,0,113,3,0.23756075956718,-1.1640173812934225,3 -0,1,105,9,-0.5630867234310606,-1.8178494433325032,1 -0,2,129,7,-0.6081001558815576,-1.0308743424505562,1 -0,3,121,9,-0.7466738515871298,-1.759307333132087,1 -0,4,109,3,-0.4835408143281817,-0.1893670050382644,3 -0,5,111,7,0.14757929805884176,1.146907612603052,1 -0,6,121,9,-0.4128405939888088,-1.3452711173264285,1 -0,7,109,3,-0.13133273866941814,1.4676755703847157,1 -0,8,127,5,0.6564099027980262,0.8247687731058516,1 -0,9,113,3,-0.08622570845242584,2.0005516149382276,3 -0,10,105,5,0.4992279385752224,-3.358606755136373,1 -0,11,103,9,0.4120884761752859,1.0384301395677145,1 -0,12,119,3,0.5762410188436872,-0.1369896760325402,3 -0,13,103,1,-0.22661438614011545,-2.025340358480932,1 -0,14,105,7,0.37034788642948163,0.9196011438572373,3 -0,15,121,7,-0.1523339501381893,4.457098431914344,1 -0,16,107,1,-0.0490514356525169,3.161523505159044,3 -0,17,129,5,-0.1693437999308125,2.054921627292583,1 -0,18,129,7,-0.2963164638064198,1.4211553800634344,3 -0,19,117,9,-0.43418074401427853,1.4000470430791148,1 -0,20,107,3,-0.11119720264051855,-0.2842816816898542,3 -0,21,103,9,0.1119258339375208,1.5342499637561926,1 -0,22,119,7,-0.2397209205593547,0.568539328380014,1 -0,23,105,9,-0.1043511841935035,1.073596528818807,1 -0,24,101,5,0.0636689964273863,1.8286076605291732,1 -1,25,113,9,-0.13283334035174255,0.9612448513077018,1 -1,26,117,1,-0.4877130507537292,0.5881920065149198,1 -1,27,105,5,-1.0319853596529749,2.4266792951807745,1 -1,28,113,7,0.36599244564499156,-0.8458755927714368,1 -1,29,109,1,-0.04541393204777325,1.1332991030875792,3 -1,30,119,5,0.14270870818902634,1.2019717678164248,1 -1,31,103,3,0.1007341413628698,3.4185328489051545,1 -1,32,103,1,0.0726528173264286,0.6798517808089142,1 -1,33,121,7,0.4047583876998109,-0.215857840126759,1 -1,34,105,3,0.7950212886366006,1.258841265676203,3 -1,35,111,1,-0.40894101251224185,2.9266389229634195,1 -1,36,111,7,-0.5905624213594342,1.1007581452294355,1 -1,37,103,5,-0.27605549137493063,0.4576222503937258,3 -1,38,103,7,0.19748743112184536,3.089575720800873,1 -1,39,121,1,-0.3231988066797896,0.3260653118807056,3 -1,40,109,7,-0.6402978908699791,-2.3652965225104947,1 -1,41,101,9,0.2754450193286252,-0.3343460991871334,1 -1,42,111,1,0.04265434446667645,-0.0265267517674288,1 -1,43,127,3,-0.1093848556929905,-1.4039708736281316,3 -1,44,105,1,-0.3098861853313818,4.277223053793332,1 -1,45,115,7,-0.5623720760818156,-0.9282928823756458,3 -1,46,105,5,-0.0362778238543955,-0.785870762785741,1 -2,47,113,3,0.6699513286275102,3.756180727360066,1 -2,48,125,5,-0.0121909350376935,1.0632670323412912,1 -2,49,121,1,-0.4985428652715131,-2.767024017505266,3 -2,50,125,9,-0.41674804550372435,-1.8232361265594708,1 -2,51,129,7,0.1922800647827131,0.3614326479800766,1 -2,52,103,3,-0.1147113810473422,0.6955419567131546,1 -2,53,119,7,0.5084886555692772,-1.182177344128451,1 -2,54,119,5,0.1681706731512443,-2.0002345186543655,1 -2,55,111,1,0.00489090849851505,-1.2119677670104652,1 -2,56,103,3,0.2950952608133617,0.7392696815922633,1 -2,57,121,9,-0.1664963816784592,-4.3184593675736345,1 -2,58,109,5,0.2734968675602151,0.2317458237066366,1 -2,59,101,7,0.7193973857758358,1.020369498449154,3 -2,60,103,5,-0.7964210408690493,-2.0363883178208826,1 -2,61,111,9,0.2072449425144576,-4.202452168223529,3 -2,62,107,9,0.4813276271478582,-0.5282806781620062,1 -2,63,103,5,0.29694766144249257,2.252849978564028,1 -2,64,111,5,-0.34264442506928156,-0.5576317791480824,1 -2,65,109,5,-0.901152134284954,-0.7768569166101674,1 -2,66,115,3,-0.00647098093573455,-1.939123138639253,1 -3,67,123,9,0.3640480787779695,3.15721060624824,1 -3,68,129,5,0.3578139552426438,-0.9705160338846076,1 -3,69,101,1,0.6773419994294364,2.623083513295643,1 -3,70,117,3,-0.6161806906782396,-1.8750394780263255,1 -3,71,121,1,-0.02179363892395065,-2.986785300875957,1 -3,72,127,9,0.2742262667237867,3.33396269826164,1 -3,73,123,5,0.653923817402728,0.8431916125568506,1 -3,74,113,5,-1.309266107419916,3.2749345537056085,3 -3,75,127,7,-0.4248256569891429,0.5290052043252962,1 -3,76,115,9,-0.3760627852144511,1.5052140738898157,1 -3,77,117,1,-1.063352767838854,0.4364134544435038,1 -3,78,103,5,0.43763228075223376,0.5460770179634292,3 -3,79,121,7,0.17808332843594354,-2.3590410762810787,3 -3,80,109,7,-0.2604307066744918,-0.600994152922156,1 -3,81,127,9,0.06496062311791385,-1.6810104306763307,3 -3,82,117,7,-0.1523655063137391,1.4713636745100194,3 -3,83,103,5,0.9557698802026362,-0.4777913312818128,1 -3,84,121,1,-0.4283939310570219,3.286310865387594,3 -3,85,119,9,0.4683163969196768,1.0639713340534525,1 -3,86,105,5,0.05918350344033825,-4.265334468962421,1 -4,87,113,5,-0.07365771506054584,-3.2085100052938498,1 -4,88,127,3,-0.6528270195518846,-1.199488174092495,1 -4,89,105,7,1.5137471671937042,-0.1041592978187344,1 -4,90,105,9,0.18086471642780114,-0.176760115308051,1 -4,91,107,9,-0.22268250180214355,-1.6668522895897546,1 -4,92,119,1,0.31414268525117434,2.700642938436344,3 -4,93,113,1,0.4821281052755843,-1.9984526206862492,1 -4,94,123,1,-0.41654505373555256,-1.5270811322998106,3 -4,95,105,1,0.3990717968896191,-1.3333943830007091,3 -4,96,121,7,0.39975842804009404,-7.460240076256136,3 -4,97,119,9,-0.2389382834262071,-3.6036268736043153,1 -4,98,127,1,0.8865821752236414,-5.933173903688966,1 -4,99,121,9,0.6200500637175907,1.9526039321781257,1 -4,100,103,7,-0.3086399573460153,-3.868319973856011,1 -4,101,117,1,0.3763432482016413,0.0230803370202396,1 -4,102,115,7,-0.19610200435266445,-3.5946735502342606,1 -5,103,121,5,0.6582222235652958,-1.1565601648186674,1 -5,104,123,5,0.210010355223184,-0.3700868001061204,1 -5,105,127,1,0.44609895345157075,-0.466451727035951,1 -5,106,105,5,0.21395314818454306,-3.079000434320467,1 -5,107,113,7,-0.09045776647608085,-2.21295241292887,1 -5,108,109,5,0.26679432858260427,-4.258487041288806,1 -5,109,123,9,-0.3912608511206187,0.9536287033277712,1 -5,110,109,7,-0.6648528537220284,-0.3446684601197502,1 -5,111,129,9,-0.4949563299989164,-1.2691154528617874,3 -5,112,123,1,-0.6120796408055832,-2.7176268721322505,1 -5,113,117,7,-0.8040575605720383,-2.230618406212464,1 -5,114,123,3,0.34466826874757156,3.320167025422368,1 -5,115,109,3,0.6592255898925946,1.1963021486138496,1 -5,116,113,1,0.1265463872076663,0.3524305338372076,3 -5,117,127,9,-0.36090671060617907,0.1991192313196762,1 -5,118,121,9,-0.00346023525880035,-0.269946254030518,3 -6,119,127,1,-0.2069274087283918,-1.4983857095036925,1 -6,120,119,9,-0.4608668090772096,4.141066849383603,3 -6,121,127,5,-0.543241871075917,-1.429667411117142,1 -6,122,103,3,0.7371442736167835,0.3262826938556598,1 -6,123,113,7,0.7937790994016082,2.054537435734958,1 -6,124,119,5,-0.9494328754610578,3.7617736489864257,3 -6,125,103,3,-0.2025407208280338,0.8874555973490652,3 -6,126,127,1,0.4363248490262944,0.2481060743864992,1 -6,127,129,5,0.9112368560642352,0.8419542731986736,3 -6,128,113,5,0.1646877914705859,1.2879311306352885,1 -6,129,111,7,0.5676868132357109,-0.1265805632469282,1 -6,130,117,9,-1.044462070351678,1.5747984413324092,3 -6,131,125,9,0.5888200685806166,0.3311529110566518,3 -6,132,101,3,0.1550655289088061,-1.087772015925998,1 -6,133,119,5,0.02448451869814495,-2.7168204655897465,1 -6,134,117,5,-0.5612827926145505,-0.3608931971219676,1 -6,135,103,7,-0.06895955594486534,2.0089156749900283,1 -6,136,111,5,0.2386687846790385,1.5074623202579414,3 -6,137,109,7,-0.0103767345335778,1.1682437308875186,1 -6,138,125,5,0.4674416024517608,-1.4452965786865868,1 -6,139,107,9,-0.402113804564477,-1.1143202352937496,1 -7,140,111,9,0.07159698573628046,0.0845048113931306,3 -7,141,113,3,-0.23027849149205426,-0.8651366428920254,1 -7,142,113,7,-0.5276752352570413,1.6931263448599303,1 -7,143,113,1,0.36030134407682074,0.5742417223803036,3 -7,144,113,9,-0.8591185434489855,-1.573618378735019,1 -7,145,121,1,0.2637783382546025,-3.863689604625783,1 -7,146,101,5,0.7364946010807949,1.6783637541403809,1 -7,147,129,7,-0.5029781169022207,0.0039304229456184,1 -7,148,101,5,0.8152784745739302,2.1903743861120266,1 -7,149,125,7,1.2736852756936394,-2.0417356426375637,1 -7,150,119,9,1.016662275589319,-0.2309438830049552,1 -7,151,121,7,0.2021641470325514,-1.7414085189195898,3 -7,152,127,9,0.2095640210815988,0.1915711997670132,1 -7,153,121,1,-0.7793534531754494,0.3583296644699246,1 -7,154,129,1,-0.39154291689852044,0.1297020398076264,1 -7,155,113,9,0.0685599894350678,0.4323507757122852,1 -7,156,111,3,0.7749898540861211,2.0689152027698867,1 -8,157,101,7,0.909287892921888,-3.989987895098015,3 -8,158,119,5,0.0591576225354796,-2.0688934315523086,1 -8,159,103,5,0.38263311649619963,-2.003805618784399,1 -8,160,113,7,0.7843252853779198,-1.1533873434116515,3 -8,161,105,7,0.06279078494571524,-1.8773457835545853,3 -8,162,111,9,0.2169085162118607,-2.033257200716173,1 -8,163,125,7,0.724906768076498,2.5248601944100124,1 -8,164,109,9,0.43106360552415107,-1.0569306831210186,1 -8,165,119,5,0.1617027306762413,2.323383376870655,1 -8,166,125,3,0.25320441824075834,-0.930273413013715,1 -8,167,109,1,0.7456736036850744,0.598252461847501,1 -8,168,121,9,0.5118838476588286,-0.110896649044434,1 -8,169,111,5,-0.7218907289288162,1.198758968337366,1 -8,170,121,5,-0.6157395896817728,0.7802693999604342,1 -8,171,115,5,0.38369214592817863,1.4790116390747352,3 -8,172,107,9,0.8423963059206273,-0.5237249538681794,3 -8,173,101,3,0.22574490676417786,-0.8904664351067142,1 -8,174,111,7,0.7851195032274458,1.5226194800279191,1 -8,175,107,9,-0.7116886776940682,-4.5883589812374606,3 -8,176,109,5,-0.41740781716411335,0.6369119820796147,1 -8,177,115,1,0.82150802012012,-1.6210202504559137,1 -8,178,103,7,0.29659052088695614,-0.8867954709909982,3 -8,179,127,3,0.1466956467187299,-0.4310364763509028,1 -8,180,115,3,0.5223660767025526,3.348885082673797,3 -9,181,129,1,0.3090525876709156,-2.7416777723376646,1 -9,182,121,1,-0.21520439985795284,0.6307442663117814,1 -9,183,103,5,0.21220901158898275,-1.8188459028762447,3 -9,184,117,5,-0.02897385433854525,-1.440215891320799,1 -9,185,123,7,0.19749026974006945,-0.779497479448969,1 -9,186,101,7,-0.8052615487503672,-1.4344762234821997,1 -9,187,129,1,-1.121699959433816,0.4896249408465866,1 -9,188,103,7,0.4649808838118618,-0.198806681337086,1 -9,189,123,7,-0.7073291167356331,-3.043576509789646,1 -9,190,111,5,-0.3740773149679098,0.8608798093746408,1 -9,191,123,7,0.4989177413451416,1.6835410358613347,1 -9,192,107,5,-0.6634732155934616,-0.3061356639836578,3 -9,193,123,3,-0.7887391302965693,-1.3438864368895593,3 -9,194,103,9,-0.04733828356775615,3.656344892439264,1 -9,195,129,9,-0.5213560739887506,-2.4135537875363897,1 -9,196,107,7,-0.43137296420290955,-2.2356462270857462,1 -9,197,109,3,0.04976548623382745,1.2900131060668418,1 -9,198,119,5,-0.285600783170167,5.764139626487539,1 -9,199,129,5,-0.5218301693993399,-1.1335640211899563,1 diff --git a/tests/resources/source_data/test-data-real-1-split1-autoregression.csv b/tests/resources/source_data/test-data-real-1-split1-autoregression.csv deleted file mode 100644 index 841267f4..00000000 --- a/tests/resources/source_data/test-data-real-1-split1-autoregression.csv +++ /dev/null @@ -1,20 +0,0 @@ -sequenceId,subsequenceId,startItemPosition,inputCol,8,7,6,5,4,3,2,1,0 -0,13,13,itemValue,-1.2113837237467866,1.1957454087349089,-1.3864879826232943,-1.4489901585552898,0.7671059681713814,2.217195960015043,0.8077394764090938,-1.1685193385087969,-0.5880064200454953 -0,14,14,itemValue,1.1957454087349089,-1.3864879826232943,-1.4489901585552898,0.7671059681713814,2.217195960015043,0.8077394764090938,-1.1685193385087969,-inf,-1.6146336831548016 -0,15,15,itemValue,-1.3864879826232943,-1.4489901585552898,0.7671059681713814,2.217195960015043,0.8077394764090938,-1.1685193385087969,-inf,-inf,-0.5557687212758077 -1,11,11,itemValue,-0.3979099218270587,0.1472006972746456,1.0744329431771849,2.098645946368935,-1.3233038228636609,0.3701880711691477,1.6509216329279448,0.695362468181269,-0.3227447762317759 -1,12,12,itemValue,0.1472006972746456,1.0744329431771849,2.098645946368935,-1.3233038228636609,0.3701880711691477,1.6509216329279448,0.695362468181269,-inf,-2.737064338735829 -2,9,9,itemValue,-1.9364972938429672,0.381774018107753,0.7895053840838986,0.071840823669383,-0.3274088457533277,0.8707377962958142,1.4490373682705944,1.0572550888530108,0.0765690379670138 -2,10,10,itemValue,0.381774018107753,0.7895053840838986,0.071840823669383,-0.3274088457533277,0.8707377962958142,1.4490373682705944,1.0572550888530108,-inf,0.476280644045447 -3,9,9,itemValue,-0.1291893885530777,-0.8243404591242441,-1.6194781231152326,0.1530304968195626,-0.4118502341991996,-0.7016026835022849,0.2909377683444284,1.9914944653082405,0.2070996307773291 -3,10,10,itemValue,-0.8243404591242441,-1.6194781231152326,0.1530304968195626,-0.4118502341991996,-0.7016026835022849,0.2909377683444284,1.9914944653082405,-inf,-0.0923048918846115 -4,6,6,itemValue,-0.3473441905826143,-0.9526372634835768,0.3152110308127366,1.0910573998928226,0.4164594405061328,0.142507586519504,1.0387354362777137,0.4461925335963277,1.6935115804711565 -5,6,6,itemValue,0.607763764789741,-2.458568025269152,-0.8214502614252478,-1.5396443182660882,-0.3113729142601391,-1.7463565527326972,0.441061415952748,-0.7445626882829559,-0.4361008211094133 -6,10,10,itemValue,1.5641135703291782,0.8372376866758972,-0.927489932456818,1.1789898362189837,-1.7300169078644538,-0.0513293403405074,0.013139305117334,0.6322625662411738,-1.0028799371032169 -6,11,11,itemValue,0.8372376866758972,-0.927489932456818,1.1789898362189837,-1.7300169078644538,-0.0513293403405074,0.013139305117334,0.6322625662411738,-inf,0.1685537328210896 -7,7,7,itemValue,-1.7680402671702622,-1.1479572969796248,0.366441270630024,0.9519780800395158,0.3286902962731986,1.3789080143759465,0.3820587792655491,1.5380644602548283,0.4910444675915603 -8,12,12,itemValue,-0.7095652049712206,0.116749400524584,-0.2458275472980247,1.105017102819967,0.4151322337650286,0.6678888872763786,-0.390515971944902,0.6056203083985299,1.2543512347210088 -8,13,13,itemValue,0.116749400524584,-0.2458275472980247,1.105017102819967,0.4151322337650286,0.6678888872763786,-0.390515971944902,0.6056203083985299,-inf,-0.6162672551654905 -8,14,14,itemValue,-0.2458275472980247,1.105017102819967,0.4151322337650286,0.6678888872763786,-0.390515971944902,0.6056203083985299,-inf,-inf,1.0886264665030447 -9,8,8,itemValue,0.2102757881460243,-0.756823800221343,1.0186924371356785,0.618472230767961,0.2340549739792952,-0.2583133906283459,-1.781087365783252,0.5179010995396939,-0.2841126785745299 -9,9,9,itemValue,-0.756823800221343,1.0186924371356785,0.618472230767961,0.2340549739792952,-0.2583133906283459,-1.781087365783252,0.5179010995396939,-inf,1.2530292363758264 diff --git a/tests/resources/source_data/test-data-real-1.csv b/tests/resources/source_data/test-data-real-1.csv deleted file mode 100644 index 66d09a2c..00000000 --- a/tests/resources/source_data/test-data-real-1.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemValue -0,0,0.0944992664850621 -0,1,1.3739480999676186 -0,2,-1.107338794524096 -0,3,0.2881636605223107 -0,4,-0.5561339361410481 -0,5,2.2131767781475062 -0,6,0.0676768816653241 -0,7,0.9543574448876856 -0,8,-0.7449642120093283 -0,9,0.3111266693612036 -0,10,-0.2953998645085581 -0,11,-0.2009927247615343 -0,12,0.6930672112064217 -0,13,-1.2113837237467866 -0,14,1.1957454087349089 -0,15,-1.3864879826232943 -0,16,-1.4489901585552898 -0,17,0.7671059681713814 -0,18,2.217195960015043 -0,19,0.8077394764090938 -0,20,-1.1685193385087969 -0,21,0.1835258824568895 -0,22,1.0433230518948158 -0,23,-2.7886385588069658 -0,24,1.8634021111854504 -1,25,-1.877830762650686 -1,26,-0.1469148118828995 -1,27,-0.8823233933435725 -1,28,-0.8089917990141724 -1,29,-0.3943085765676132 -1,30,-0.0337570976576666 -1,31,0.0213140323834337 -1,32,1.1282923510450278 -1,33,-0.8221263385452469 -1,34,1.8168113502009495 -1,35,1.660137633752651 -1,36,-0.3979099218270587 -1,37,0.1472006972746456 -1,38,1.0744329431771849 -1,39,2.098645946368935 -1,40,-1.3233038228636609 -1,41,0.3701880711691477 -1,42,1.6509216329279448 -1,43,0.695362468181269 -1,44,-0.6121856652552128 -1,45,0.3051518245496207 -1,46,0.0659683229061858 -2,47,0.8083981254449394 -2,48,-0.2711079427384384 -2,49,-0.4294965087158796 -2,50,0.3670981012520712 -2,51,0.3410588078178669 -2,52,-0.6929642964935003 -2,53,0.0199389347673413 -2,54,0.2456847767142994 -2,55,-1.0992550106377 -2,56,-1.9364972938429672 -2,57,0.381774018107753 -2,58,0.7895053840838986 -2,59,0.071840823669383 -2,60,-0.3274088457533277 -2,61,0.8707377962958142 -2,62,1.4490373682705944 -2,63,1.0572550888530108 -2,64,-0.9835633674955572 -2,65,1.3265001144866806 -2,66,1.1741329477581235 -3,67,-0.674407462500132 -3,68,-1.0081812552074476 -3,69,-1.360915051647735 -3,70,0.6786803068042123 -3,71,1.577569579504721 -3,72,-1.3526971290727938 -3,73,-0.0583685307039785 -3,74,-0.934751987891592 -3,75,-0.9347505632972628 -3,76,-0.1291893885530777 -3,77,-0.8243404591242441 -3,78,-1.6194781231152326 -3,79,0.1530304968195626 -3,80,-0.4118502341991996 -3,81,-0.7016026835022849 -3,82,0.2909377683444284 -3,83,1.9914944653082405 -3,84,0.4918751257304392 -3,85,0.9085888103495288 -3,86,0.5038597933688415 -4,87,0.1086217083079374 -4,88,0.205672331266788 -4,89,0.1226449026453264 -4,90,-1.036603186664228 -4,91,-0.7458776587447739 -4,92,-0.5935092863545317 -4,93,-0.3473441905826143 -4,94,-0.9526372634835768 -4,95,0.3152110308127366 -4,96,1.0910573998928226 -4,97,0.4164594405061328 -4,98,0.142507586519504 -4,99,1.0387354362777137 -4,100,0.4461925335963277 -4,101,-1.991929158454544 -4,102,-0.0072582312611647 -5,103,-0.9376599918993224 -5,104,-0.0781662582621091 -5,105,-0.0496679031411692 -5,106,0.8757687954793659 -5,107,1.714495826544065 -5,108,0.166882277370868 -5,109,0.607763764789741 -5,110,-2.4585680252691517 -5,111,-0.8214502614252478 -5,112,-1.5396443182660882 -5,113,-0.3113729142601391 -5,114,-1.7463565527326972 -5,115,0.441061415952748 -5,116,-0.7445626882829559 -5,117,2.414825155527423 -5,118,-0.0929611777149686 -6,119,0.9924512124248496 -6,120,-1.471083324581432 -6,121,0.6301997266816972 -6,122,0.4611731584188029 -6,123,0.7521129894916484 -6,124,-0.6007669114616375 -6,125,-0.5125436647631566 -6,126,-0.1866480466015074 -6,127,-0.3415916219347562 -6,128,-0.2405580845441048 -6,129,1.5641135703291782 -6,130,0.8372376866758972 -6,131,-0.927489932456818 -6,132,1.1789898362189837 -6,133,-1.7300169078644538 -6,134,-0.0513293403405074 -6,135,0.013139305117334 -6,136,0.6322625662411738 -6,137,-0.5465139969051596 -6,138,0.6671200729278953 -6,139,-1.6313917054076197 -7,140,-0.054998716485888 -7,141,0.135173804066526 -7,142,1.3068582712356975 -7,143,0.4006903121515655 -7,144,-0.5169207673195412 -7,145,0.2551214405007075 -7,146,2.0827074501312857 -7,147,-1.7680402671702622 -7,148,-1.1479572969796248 -7,149,0.366441270630024 -7,150,0.9519780800395158 -7,151,0.3286902962731986 -7,152,1.3789080143759465 -7,153,0.3820587792655491 -7,154,1.5380644602548283 -7,155,-0.8696259068344739 -7,156,-0.8222787595288253 -8,157,-0.9631386888242454 -8,158,-0.8540642049866167 -8,159,-1.7854123996764923 -8,160,0.1809010985046613 -8,161,1.0597440854253286 -8,162,1.5142826396791564 -8,163,-0.0294168686901563 -8,164,-0.5760408952983338 -8,165,0.643841661526263 -8,166,0.8585268109580487 -8,167,-0.4275970481511105 -8,168,-2.3153389439023173 -8,169,-0.7095652049712206 -8,170,0.116749400524584 -8,171,-0.2458275472980247 -8,172,1.105017102819967 -8,173,0.4151322337650286 -8,174,0.6678888872763786 -8,175,-0.390515971944902 -8,176,0.6056203083985299 -8,177,-2.4432428802949824 -8,178,0.0713429957179392 -8,179,0.3474149331272206 -8,180,1.0900435015932757 -9,181,-2.3620753256776106 -9,182,-0.7864276689543984 -9,183,0.8562240736290871 -9,184,0.0176927129678913 -9,185,-1.604293154787326 -9,186,0.7908622857384023 -9,187,-0.3924475723433511 -9,188,0.7208186380322986 -9,189,0.2102757881460243 -9,190,-0.756823800221343 -9,191,1.0186924371356785 -9,192,0.618472230767961 -9,193,0.2340549739792952 -9,194,-0.2583133906283459 -9,195,-1.781087365783252 -9,196,0.5179010995396939 -9,197,-0.1764631825530115 -9,198,-0.5558421321699659 -9,199,0.0972090807826861 diff --git a/tests/resources/source_data/test-data-real-3.csv b/tests/resources/source_data/test-data-real-3.csv deleted file mode 100644 index 56516148..00000000 --- a/tests/resources/source_data/test-data-real-3.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemValue,supReal1,supReal2 -0,0,1.143956134511096,0.3156304921985627,0.47512151913436 -0,1,1.3956844750568178,-0.1822429283186853,-1.1261734468621212 -0,2,-0.1715630160735158,0.4013693011536511,-1.2162003117631153 -0,3,-1.5550080594262743,1.132244341738739,-1.4933477031742597 -0,4,-0.5094348768207044,-0.0429108458575636,-0.9670816286563634 -0,5,1.1182473810170177,0.9886909669935166,0.2951585961176835 -0,6,-0.243231053806412,0.6038345786438268,-0.8256811879776176 -0,7,-0.8727324468448932,0.4894333898098869,-0.2626654773388363 -0,8,-1.0162859523607557,0.4068867065004759,1.3128198055960525 -0,9,-2.14929390417939,-0.1378925185193623,-0.1724514169048517 -0,10,0.3589567696659215,0.0559662205535733,0.9984558771504448 -0,11,2.309501640646432,0.3821088546568114,0.8241769523505718 -0,12,-0.4907019447464217,-0.3845457511930897,1.1524820376873743 -0,13,-0.5708572484953972,-0.4576193768022207,-0.4532287722802309 -0,14,-1.5153605543961426,-0.2529049831249026,0.7406957728589633 -0,15,-2.260734238316745,0.4879281081569628,-0.3046679002763786 -0,16,-0.6956194490834757,0.4519709748946399,-0.0981028713050338 -0,17,0.0055059262205625,0.0919939041535107,-0.338687599861625 -0,18,-0.6552582609410857,-0.022186056317866,-0.5926329276128396 -0,19,-0.3138800389908938,0.6891927961331837,-0.8683614880285571 -0,20,-1.4552229530328598,-0.6102957802065466,-0.2223944052810371 -0,21,-0.917132691276364,-0.1581526752807625,0.2238516678750416 -0,22,-0.018834301332115,-1.731035691880018,-0.4794418411187094 -0,23,0.7626086190249719,-1.7639258336612718,-0.208702368387007 -0,24,-0.6655988005097199,0.0060505157900411,0.1273379928547726 -1,25,-0.1809480099771767,-1.1712166898091485,-0.2656666807034851 -1,26,1.5281650764902397,-1.38055496916859,-0.9754261015074585 -1,27,0.5058577252234937,-2.297511461684582,-2.0639707193059498 -1,28,-0.2541536631753138,0.6851795700949505,0.7319848912899831 -1,29,0.619739160843701,-3.008671660328942,-0.0908278640955465 -1,30,0.146312811906593,1.707571601719115,0.2854174163780527 -1,31,-2.184392118921295,1.5360119663914973,0.2014682827257396 -1,32,1.1174230750757488,-0.0489276784398041,0.1453056346528572 -1,33,0.3367012529248535,-1.1192225290167672,0.8095167753996217 -1,34,0.6670158490102784,-0.3066059502009673,1.5900425772732012 -1,35,0.755078941326885,-0.6835362360694909,-0.8178820250244837 -1,36,-0.3676490200669038,-1.0611474620151,-1.1811248427188683 -1,37,-0.2710739102647702,-0.0916301757399661,-0.5521109827498613 -1,38,-0.2661160554693632,0.8005779139015006,0.3949748622436907 -1,39,-0.7351109737492553,0.1853694198501086,-0.6463976133595792 -1,40,0.4429417228949345,-1.4889159327953163,-1.2805957817399582 -1,41,-0.4069743745970505,1.3650539499845882,0.5508900386572504 -1,42,-0.0082860827227986,0.2518340709808602,0.0853086889333529 -1,43,0.0036562589715113,-0.8363773494419445,-0.218769711385981 -1,44,0.6757516080507786,-0.0137686912539288,-0.6197723706627636 -1,45,-1.707314817367056,0.802155664664332,-1.1247441521636312 -1,46,0.2136335797454943,0.3104002443287074,-0.072555647708791 -2,47,-0.433268572989774,0.0244865632771758,1.3399026572550203 -2,48,-0.3054040190508337,-1.2193671668665338,-0.024381870075387 -2,49,-0.1002680245383688,0.1492885707520549,-0.9970857305430262 -2,50,-1.467295698454029,-0.2767660813092324,-0.8334960910074487 -2,51,0.5548011155624822,0.236707130088914,0.3845601295654262 -2,52,-0.8783684024032121,2.336972941172497,-0.2294227620946844 -2,53,1.2017845416788098,-0.2258905493628782,1.0169773111385545 -2,54,0.7535596895960655,-0.4913060708854921,0.3363413463024886 -2,55,0.0897222058021331,0.4172472822212967,0.0097818169970301 -2,56,-1.8197908527299689,0.9623048127332562,0.5901905216267234 -2,57,0.7335101691112972,-1.6732811417083997,-0.3329927633569184 -2,58,-0.823192331827531,-1.1068971276083273,0.5469937351204301 -2,59,-1.029747086224018,-0.6167477123403153,1.4387947715516716 -2,60,1.426655949860882,1.8489599120038709,-1.5928420817380986 -2,61,0.0104728571593871,0.0596136644264906,0.4144898850289152 -2,62,-0.9525513995666236,-0.9180104246891572,0.9626552542957164 -2,63,-0.1861821362644952,-1.293207193364908,0.5938953228849851 -2,64,1.5198235795189494,0.8977741478374721,-0.6852888501385631 -2,65,1.0646831051806884,1.9978983207730696,-1.802304268569908 -2,66,-0.6824862408874952,-0.4106770921604671,-0.0129419618714691 -3,67,0.0263588534786415,0.0512576888774666,0.728096157555939 -3,68,0.9157116179597412,1.10900057064673,0.7156279104852876 -3,69,-2.6428526570265496,0.4872815209095086,1.3546839988588728 -3,70,-1.022737078099231,0.3109816751133513,-1.232361381356479 -3,71,-1.9048298880429355,1.981791566013018,-0.0435872778479013 -3,72,0.2061905652506893,1.7982660199482663,0.5484525334475734 -3,73,0.4677446998552286,-1.3021452513832306,1.307847634805456 -3,74,-0.3242057413171001,0.2039687473138783,-2.618532214839832 -3,75,-0.954384415885333,0.0319028974699685,-0.8496513139782857 -3,76,0.1542312008748267,0.0463832263973931,-0.7521255704289022 -3,77,-0.9423760670055648,1.160576963665477,-2.126705535677708 -3,78,1.5710522049038294,0.766752760239803,0.8752645615044675 -3,79,0.0651964031994713,1.2587228109353903,0.3561666568718871 -3,80,-1.75122379690588,-0.3008387767317566,-0.5208614133489836 -3,81,1.383460264628571,0.9379248586904108,0.1299212462358277 -3,82,-0.0608910740225044,1.3323944583229077,-0.3047310126274782 -3,83,1.6230751657815008,-0.0630906778233005,1.9115397604052724 -3,84,2.2408288480418097,0.8103089375173486,-0.8567878621140438 -3,85,-0.9727773430855462,0.363533033619507,0.9366327938393536 -3,86,0.7902367502999565,-0.3627126190829625,0.1183670068806765 -4,87,-2.0447369464898366,0.3023432233196432,-0.1473154301210917 -4,88,1.869964721158462,-0.864875745417614,-1.3056540391037692 -4,89,-0.3804968586445018,-1.2991572101520728,3.0274943343874083 -4,90,-0.6849867971231273,-0.6971021337130133,0.3617294328556023 -4,91,-0.1893749607437728,0.1572174669954087,-0.4453650036042871 -4,92,-0.0473841748369682,-0.2885714864228671,0.6282853705023487 -4,93,1.355145254330449,0.8030287320554321,0.9642562105511686 -4,94,-0.812919327386319,-0.278953756610509,-0.8330901074711051 -4,95,1.761852889925791,1.0654125004131518,0.7981435937792382 -4,96,1.5513843109017444,-0.2196020449778792,0.7995168560801881 -4,97,-0.0351860754981054,-0.9365730657119276,-0.4778765668524142 -4,98,0.6231377615829627,-0.5729404959546416,1.7731643504472827 -4,99,-0.3997316463290774,-0.8806733580293892,1.2401001274351815 -4,100,0.2372394789402002,-0.1054132415697752,-0.6172799146920306 -4,101,-0.1212227670247407,0.2660023798346163,0.7526864964032826 -4,102,2.0205193300657247,-2.364509701006651,-0.3922040087053289 -5,103,-1.38640492450024,0.1640158418645363,1.3164444471305916 -5,104,-0.0921642607233633,0.9692400537679028,0.420020710446368 -5,105,-0.3149420755060182,1.5473868473347665,0.8921979069031415 -5,106,-1.2635106392550968,0.7619417833495526,0.4279062963690861 -5,107,-0.1778576632950099,-0.3282050844487043,-0.1809155329521617 -5,108,-0.4341462186773626,-0.478029836620016,0.5335886571652085 -5,109,1.4092433547182477,-0.6852162193360752,-0.7825217022412374 -5,110,0.3859950895821014,2.0669881917476105,-1.3297057074440568 -5,111,-0.7182644036676693,-0.146096739029817,-0.9899126599978328 -5,112,-1.273385819360683,-0.9772625270992248,-1.2241592816111664 -5,113,-0.1359745388983841,0.9827239663467208,-1.6081151211440765 -5,114,0.2113980657466534,-0.1136468939335117,0.6893365374951431 -5,115,0.7724693369876277,0.8486283795297606,1.3184511797851892 -5,116,-1.189419775035365,2.175160590481025,0.2530927744153326 -5,117,-0.2944814094803828,0.3844036744981713,-0.7218134212123581 -5,118,-1.1942449437258529,1.489763278407007,-0.0069204705176007 -6,119,0.0493501681912529,-2.510681111908385,-0.4138548174567836 -6,120,0.2096106989069184,-0.2183747775499781,-0.9217336181544192 -6,121,-1.5429639704955027,-1.098282706675557,-1.086483742151834 -6,122,-0.6450828357377884,0.2354221990787906,1.474288547233567 -6,123,-0.446605922679624,1.2013091752960456,1.5875581988032164 -6,124,0.4686929978268352,-0.0961431446440496,-1.8988657509221156 -6,125,-0.1580299316500071,-0.1578710620547832,-0.4050814416560676 -6,126,-1.759532925155835,-0.0693937481215322,0.8726496980525889 -6,127,-0.3015247329700108,-1.3923361315518956,1.8224737121284704 -6,128,-0.4450013498626253,-0.4113434043871031,0.3293755829411718 -6,129,0.7903245001231152,-0.4011588652459638,1.1353736264714218 -6,130,-0.6295261828313713,0.292502475077484,-2.088924140703356 -6,131,0.8531138131638296,1.6468836783647591,1.1776401371612333 -6,132,0.5187188498926204,-0.4647811355098913,0.3101310578176122 -6,133,-1.3489685142027716,-0.3756787727697905,0.0489690373962899 -6,134,-0.0946907184934595,0.3892264192035026,-1.122565585229101 -6,135,-0.7474712355198262,1.2901653302909308,-0.1379191118897307 -6,136,-0.4068537594387174,-0.6838974781340557,0.477337569358077 -6,137,0.0266763706342167,-1.007283482879746,-0.0207534690671556 -6,138,-0.0032743175101055,1.2232128286131143,0.9348832049035216 -6,139,-1.4245234141757734,-1.5302479419210997,-0.804227609128954 -7,140,1.3385463652897756,0.0713020705966725,0.1431939714725609 -7,141,0.8725755275379272,1.678570135587483,-0.4605569829841085 -7,142,0.7739773642814373,2.152287076973953,-1.0553504705140826 -7,143,0.4365841243143215,1.1854010966339783,0.7206026881536415 -7,144,1.7451551239261762,0.8043762766414709,-1.718237086897971 -7,145,-1.6815565231304883,0.7973424761299034,0.527556676509205 -7,146,-1.6595644566768657,-0.2695223816290026,1.4729892021615898 -7,147,-0.1021694125843338,-1.383641623013081,-1.0059562338044414 -7,148,0.9372663261906188,-0.4184403128098172,1.6305569491478604 -7,149,1.073148960167395,-2.438952753391153,2.547370551387279 -7,150,-0.0717409847677429,1.323885747839544,2.033324551178638 -7,151,-0.5685414310705261,-0.6367891774048193,0.4043282940651028 -7,152,-0.1316454577882007,0.1369545874797834,0.4191280421631976 -7,153,1.2953199335014074,0.6667546621883552,-1.5587069063508987 -7,154,0.9833972715686036,-0.5470404748851541,-0.7830858337970409 -7,155,1.1579688470041969,-0.9611805800659046,0.1371199788701356 -7,156,0.1827239769253915,-1.5230847499914129,1.5499797081722422 -8,157,-1.0562245233729604,-0.2219192589824737,1.818575785843776 -8,158,-0.9383243525460702,0.9546211427025948,0.1183152450709592 -8,159,0.0513695722870604,-0.6758643545674766,0.7652662329923993 -8,160,0.3874642120923474,0.5043116930108147,1.5686505707558396 -8,161,-0.243642091045886,-0.2025208427125454,0.1255815698914305 -8,162,0.7717151527853235,-1.506391286970976,0.4338170324237214 -8,163,1.387099745160974,0.6487698593069315,1.449813536152996 -8,164,-1.602068215416117,-0.4577977113344454,0.8621272110483021 -8,165,1.236572267392626,0.044167628496001,0.3234054613524826 -8,166,1.5622214470091351,1.1754844396047714,0.5064088364815167 -8,167,-0.0485551549391928,-0.0990325767481106,1.4913472073701488 -8,168,0.4285506018746526,-0.0475450617002715,1.023767695317657 -8,169,0.497472174299677,0.5034484743308774,-1.4437814578576325 -8,170,1.0604287367676706,0.6921642133956442,-1.2314791793635456 -8,171,1.412582247970505,0.5559150837807887,0.7673842918563573 -8,172,-0.535552885754127,0.5499993252896678,1.6847926118412546 -8,173,0.2408773901470533,-0.4530529438523386,0.4514898135283557 -8,174,0.471447663060989,2.0916787764915914,1.5702390064548917 -8,175,0.3794929622741819,-1.0422876011718514,-1.4233773553881364 -8,176,1.740091064639636,-1.0655283950718082,-0.8348156343282267 -8,177,0.9174869800162324,0.4217188487657152,1.64301604024024 -8,178,-0.795087240847617,0.8445655979794515,0.5931810417739123 -8,179,-0.0110151195914141,0.9582441198728032,0.2933912934374598 -8,180,-0.1134702145020138,0.5930174775979217,1.0447321534051053 -9,181,0.5320720682670665,1.0962183807331836,0.6181051753418312 -9,182,-0.0834163446834311,0.6793317541568811,-0.4304087997159057 -9,183,-0.457604347411888,0.05847542907819,0.4244180231779655 -9,184,0.6138956500945167,0.3941151592170865,-0.0579477086770905 -9,185,-1.282571875410227,0.5588548106709973,0.3949805394801389 -9,186,1.125490928479345,-0.6045051491381532,-1.6105230975007343 -9,187,0.3386017615816551,-2.576017924887878,-2.243399918867632 -9,188,0.5914720853242976,0.3974530789128242,0.9299617676237236 -9,189,1.738580470075832,-0.8958775205971541,-1.4146582334712663 -9,190,-0.0415027573287599,-0.1068012186985196,-0.7481546299358196 -9,191,-0.7906458359030527,0.3913039526310852,0.9978354826902832 -9,192,0.7004059336701238,0.7501424988056595,-1.3269464311869232 -9,193,0.6334042909883103,0.2327825827474678,-1.5774782605931386 -9,194,1.3817463103025862,-0.5904344844700138,-0.0946765671355123 -9,195,-1.5609804115046182,-1.879944960324204,-1.0427121479775012 -9,196,-1.2189431636039487,1.8513283087111012,-0.8627459284058191 -9,197,1.6991040334285772,0.9436017873408368,0.0995309724676549 -9,198,0.9410236320395357,1.5543229265388008,-0.571201566340334 -9,199,2.083194838563287,0.7115442580156478,-1.0436603387986798 diff --git a/tests/resources/source_data/test-data-real-5.csv b/tests/resources/source_data/test-data-real-5.csv deleted file mode 100644 index 78e3348b..00000000 --- a/tests/resources/source_data/test-data-real-5.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemValue,supReal1,supReal2,supReal3,supReal4 -0,0,1.2157364754725126,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886 -0,1,-0.4357209731834651,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225 -0,2,-0.6339475697946867,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471 -0,3,0.6368626136290272,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664 -0,4,0.6110081460367197,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679 -0,5,0.9905452893218942,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873 -0,6,-0.3345643150202115,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203 -0,7,0.1256628904239142,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406 -0,8,0.2480230016822292,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459 -0,9,-0.1922427914035724,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191 -0,10,0.5924561539591094,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862 -0,11,0.8745787252568672,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572 -0,12,0.5909207435392255,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035 -0,13,-1.238310596736537,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925 -0,14,-0.0313947023454899,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497 -0,15,2.2431544596409108,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702 -0,16,0.008841402510734,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912 -0,17,1.1787037174986643,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137 -0,18,-1.2232374764781524,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254 -0,19,-1.1887591553907793,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754 -0,20,1.2833234626994587,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509 -0,21,-0.832095086163681,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411 -0,22,0.6549478021989834,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851 -0,23,1.4144054511713913,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458 -0,24,1.434700880302887,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296 -1,25,-0.1484614438126814,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405 -1,26,-0.907149052022494,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361 -1,27,-1.315525084311021,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477 -1,28,0.321371903856307,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585 -1,29,0.0588998328655788,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805 -1,30,-1.6705347852472077,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652 -1,31,1.6517289984560022,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368 -1,32,-0.4256480977552965,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937 -1,33,0.514013235792249,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382 -1,34,0.0557968554012388,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087 -1,35,-1.1716537478584226,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054 -1,36,0.448353692105597,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053 -1,37,0.7305124247576416,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647 -1,38,-0.6380221609658,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902 -1,39,1.4755589311816426,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116 -1,40,-0.260160568050281,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335 -1,41,-0.3439026752059935,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823 -1,42,-0.5938983834903411,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052 -1,43,0.7148213037098026,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834 -1,44,-0.9990236390866448,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783 -1,45,-2.035389167985359,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322 -1,46,-0.1241090076273592,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941 -2,47,0.6859234003054556,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419 -2,48,-0.8499007946906604,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136 -2,49,0.9408956310929066,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277 -2,50,1.6646131411816578,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542 -2,51,-1.4938369847202195,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181 -2,52,0.8496529584712066,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197 -2,53,-0.0459189534252687,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343 -2,54,1.5365245662265232,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612 -2,55,0.6256680895244052,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304 -2,56,-2.260359396826676,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609 -2,57,0.1914661609037843,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176 -2,58,0.5158076460748913,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599 -2,59,-1.0947810018348507,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016 -2,60,-0.9865581243255936,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634 -2,61,-1.4338664192702113,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373 -2,62,-0.2172906414350655,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621 -2,63,0.0199528357410374,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672 -2,64,0.0168235208889687,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168 -2,65,2.1259103285431804,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221 -2,66,0.0094460765129033,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992 -3,67,-1.473158658721011,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244 -3,68,0.8552751411665621,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708 -3,69,-0.6933356133030083,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643 -3,70,1.4678284201004026,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273 -3,71,0.24217591143051,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959 -3,72,-2.10339281517975,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244 -3,73,1.0711650587517474,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615 -3,74,1.7463744130531542,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745 -3,75,-0.3363388568076421,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721 -3,76,-0.3242937117544179,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233 -3,77,-0.9411647896878936,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143 -3,78,1.069879949761595,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957 -3,79,-0.8667154099610572,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826 -3,80,0.1198519014290499,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804 -3,81,1.044964805654135,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499 -3,82,-1.8702057892269273,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173 -3,83,0.886557763359472,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713 -3,84,-0.4732550989352198,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431 -3,85,0.0634333684969395,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982 -3,86,0.2665413517198428,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551 -4,87,-0.9188292311366768,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927 -4,88,-0.2034731183127446,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394 -4,89,-0.215148925629062,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372 -4,90,0.6064317194064263,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425 -4,91,0.5244272005602573,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239 -4,92,-0.4160522494759603,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421 -4,93,-0.2625459626333661,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964 -4,94,-1.0851148931024432,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218 -4,95,-0.2912304897933477,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471 -4,96,-0.8187074748916447,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201 -4,97,0.0492718080501761,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814 -4,98,-0.8062622557548957,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774 -4,99,-0.4153917948141301,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907 -4,100,-0.2224607283709459,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114 -4,101,-1.5140509754678362,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313 -4,102,1.0334281623735169,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983 -5,103,-0.6864230377948968,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032 -5,104,0.4121725852133129,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658 -5,105,-0.910130468154296,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267 -5,106,-1.70552576193866,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745 -5,107,-0.5989313128779504,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032 -5,108,-1.768663887404953,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915 -5,109,0.0821914280814239,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433 -5,110,1.390366451549932,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324 -5,111,0.3326169890263175,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795 -5,112,0.6734144260342821,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436 -5,113,0.0305206223002543,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962 -5,114,-0.0784091712011275,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194 -5,115,2.064172173892823,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067 -5,116,-1.9779839409772504,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663 -5,117,0.2051671337582474,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233 -5,118,1.6220394426605342,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675 -6,119,0.0473166159950642,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145 -6,120,-0.4115115284299588,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176 -6,121,-1.402681056942516,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413 -6,122,-1.3275034743892011,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453 -6,123,0.7014665551150057,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988 -6,124,-0.2035315039990889,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934 -6,125,0.0367104465103882,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717 -6,126,-0.5108362781439201,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115 -6,127,0.3179021236908106,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816 -6,128,0.6725802644112402,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604 -6,129,0.8596257938486648,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782 -6,130,0.4715510300846484,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951 -6,131,0.5315089928295402,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643 -6,132,0.1817244592342696,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258 -6,133,-0.2256707905927475,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091 -6,134,-2.16768470520022,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833 -6,135,0.3087019855449177,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803 -6,136,-1.2897394787144127,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744 -6,137,0.4621743751557871,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001 -6,138,-0.3134765343841647,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725 -6,139,1.0522402191888502,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555 -7,140,0.2927037400921888,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131 -7,141,-0.8730668573777406,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113 -7,142,-0.2922851815210742,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609 -7,143,-0.0649021232364764,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969 -7,144,1.2214127004424862,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388 -7,145,-0.5043967829478707,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822 -7,146,-0.0708070086155714,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244 -7,147,-0.0692762501832949,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663 -7,148,1.3045814471832968,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197 -7,149,-0.4043913713107616,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621 -7,150,-0.0446396090232183,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756 -7,151,0.512499015351023,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713 -7,152,0.5357132143740251,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026 -7,153,-2.197173079151018,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117 -7,154,-0.0886891865646971,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711 -7,155,-0.2605697307740011,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251 -7,156,0.6174561809867044,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264 -8,157,-1.0038074507140595,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726 -8,158,-1.059730211003972,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695 -8,159,-0.3692993280894203,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448 -8,160,-0.4171826559718362,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761 -8,161,0.2393065429868705,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186 -8,162,-0.676895959096811,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605 -8,163,1.1797212483448458,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671 -8,164,0.3968374847149752,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678 -8,165,0.2299432745676143,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952 -8,166,-1.0984706199955088,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802 -8,167,1.5304566581109758,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236 -8,168,0.7606981599458013,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769 -8,169,-0.1082555524626026,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754 -8,170,-1.7075689205534992,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697 -8,171,1.5659864989309202,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477 -8,172,-0.8565031425715999,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823 -8,173,-0.7512773910842393,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512 -8,174,-1.3291106873309495,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194 -8,175,0.0402955848732538,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751 -8,176,-0.2798439837471386,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605 -8,177,-0.6708471763560321,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511 -8,178,1.3065606154170957,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498 -8,179,-0.4208095265891202,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123 -8,180,-1.290508372602977,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558 -9,181,-0.0236678016825857,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157 -9,182,-1.3482004671679793,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377 -9,183,-1.6032504940224688,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836 -9,184,0.8862769243448122,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203 -9,185,-0.6916024517502692,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431 -9,186,0.4105014455674474,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504 -9,187,-0.479142102490158,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529 -9,188,0.4483153370081094,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308 -9,189,0.0831798773951058,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378 -9,190,0.8891055731718962,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787 -9,191,0.1744572947226649,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506 -9,192,-1.04626647271007,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671 -9,193,0.9239324161922192,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253 -9,194,-0.2719797371819717,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154 -9,195,-0.5394421420914198,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914 -9,196,0.8822731035358525,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066 -9,197,-0.2855852303824563,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809 -9,198,0.1982091219091618,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367 -9,199,0.5878676284104647,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885 diff --git a/tests/resources/source_data/test-data-real-50.csv b/tests/resources/source_data/test-data-real-50.csv deleted file mode 100644 index 931141e3..00000000 --- a/tests/resources/source_data/test-data-real-50.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemValue,supReal1,supReal2,supReal3,supReal4,supReal5,supReal6,supReal7,supReal8,supReal9,supReal10,supReal11,supReal12,supReal13,supReal14,supReal15,supReal16,supReal17,supReal18,supReal19,supReal20,supReal21,supReal22,supReal23,supReal24,supReal25,supReal26,supReal27,supReal28,supReal29,supReal30,supReal31,supReal32,supReal33,supReal34,supReal35,supReal36,supReal37,supReal38,supReal39,supReal40,supReal41,supReal42,supReal43,supReal44,supReal45,supReal46,supReal47,supReal48,supReal49 -0,0,1.2157364754725126,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436,-0.5820086906467112,-0.0769931567360886,-1.1517403862404294,0.47512151913436 -0,1,-0.4357209731834651,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212,-0.9089247216662516,0.3791596715157225,-0.0206890519736249,-1.1261734468621212 -0,2,-0.6339475697946867,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153,-0.5154371712252781,-0.6449188963332471,0.5834646194670815,-1.2162003117631153 -0,3,0.6368626136290272,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597,-0.8796536665660435,-1.8579306192075664,0.1427987669192363,-1.4933477031742597 -0,4,0.6110081460367197,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634,-0.0946835025191322,1.576673513358679,-0.3530020167338319,-0.9670816286563634 -0,5,0.9905452893218942,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835,0.573453806301526,-0.1647553645757873,1.4233611396452903,0.2951585961176835 -0,6,-0.3345643150202115,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176,-0.6726355586632142,-1.461972740712203,-0.9799644518478924,-0.8256811879776176 -0,7,0.1256628904239142,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363,0.7338377851923579,2.748534947455406,2.229642972063479,-0.2626654773388363 -0,8,0.2480230016822292,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525,0.4123843865529258,-0.4185007661778459,-0.5732593838301187,1.3128198055960525 -0,9,-0.1922427914035724,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517,1.0002758074691138,1.5772388807424191,-0.5873894980380264,-0.1724514169048517 -0,10,0.5924561539591094,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448,-1.6793033775681865,-0.2018030185838862,-0.2477508115702648,0.9984558771504448 -0,11,0.8745787252568672,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718,0.5192150697838572,0.5151521190062572,0.375295245422501,0.8241769523505718 -0,12,0.5909207435392255,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743,-0.0684948380162701,1.2255888487339035,-0.028236201979088,1.1524820376873743 -0,13,-1.238310596736537,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309,-1.012670179240466,1.054142287849925,-0.7885639649483744,-0.4532287722802309 -0,14,-0.0313947023454899,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633,0.4598005719286187,0.1955793181435497,-0.9023833307495563,0.7406957728589633 -0,15,2.2431544596409108,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786,2.228549215957172,0.4303494463769702,0.044437463783281,-0.3046679002763786 -0,16,0.008841402510734,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338,1.580761752579522,-0.7216115292517912,-0.1687177623299483,-0.0981028713050338 -0,17,1.1787037174986643,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625,1.0274608136462915,0.5810592781295137,0.9883773158686636,-0.338687599861625 -0,18,-1.2232374764781524,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396,0.7105776900317172,1.4366479972728254,-0.7690976383064227,-0.5926329276128396 -0,19,-1.1887591553907793,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571,0.7000235215395574,-0.335667291930754,-0.6433843829871714,-0.8683614880285571 -0,20,1.2833234626994587,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371,-0.1421408408449271,1.4195302188448509,-0.0519121264937029,-0.2223944052810371 -0,21,-0.832095086163681,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416,0.7671249818780963,0.5754851039040411,-0.4591761627606048,0.2238516678750416 -0,22,0.6549478021989834,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094,0.284269664190007,-0.3111877446448851,-0.3898668641222089,-0.4794418411187094 -0,23,1.4144054511713913,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007,0.5367982644094035,-1.0458755769373458,-1.2837459164682858,-0.208702368387007 -0,24,1.434700880302887,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726,0.9143038302645866,-0.0429160593265296,0.1902826239053188,0.1273379928547726 -1,25,-0.1484614438126814,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851,0.4806224256538509,-1.664559241162405,-1.4806482485447472,-0.2656666807034851 -1,26,-0.907149052022494,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585,0.2940960032574599,0.1593963161317361,0.7237431360170201,-0.9754261015074585 -1,27,-1.315525084311021,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498,1.2133396475903873,-0.8143597963095477,0.1929718727825684,-2.0639707193059498 -1,28,0.321371903856307,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831,-0.4229377963857184,-0.0408137348154585,1.7796982141489022,0.7319848912899831 -1,29,0.0588998328655788,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465,0.5666495515437896,2.5570118821919805,-0.8850362307026824,-0.0908278640955465 -1,30,-1.6705347852472077,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527,0.6009858839082124,0.0611023753041652,1.2978731439161524,0.2854174163780527 -1,31,1.6517289984560022,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396,1.7092664244525773,-0.5819529585304368,-0.2591452925227064,0.2014682827257396 -1,32,-0.4256480977552965,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572,0.3399258904044571,-0.6904391262963937,1.4982259796054014,0.1453056346528572 -1,33,0.514013235792249,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217,-0.1079289200633795,0.591072574117382,-0.0768490761377993,0.8095167753996217 -1,34,0.0557968554012388,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012,0.6294206328381015,0.1651597212565087,-1.9367263299369712,1.5900425772732012 -1,35,-1.1716537478584226,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837,1.4633194614817098,-0.638500712064054,0.0506897125076762,-0.8178820250244837 -1,36,0.448353692105597,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683,0.5503790726147177,-0.4576388791956053,-0.2116134506350607,-1.1811248427188683 -1,37,0.7305124247576416,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613,0.2288111251968629,-1.3597763965249647,0.6897281340221474,-0.5521109827498613 -1,38,-0.6380221609658,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907,1.5447878604004366,0.2631408387300902,0.4499808493098527,0.3949748622436907 -1,39,1.4755589311816426,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792,0.1630326559403528,1.352357018704116,0.8871824140419462,-0.6463976133595792 -1,40,-0.260160568050281,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582,-1.1826482612552474,-0.2882233178544335,0.419432629431521,-1.2805957817399582 -1,41,-0.3439026752059935,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504,-0.1671730495935667,1.9502633738336823,-1.119232635198605,0.5508900386572504 -1,42,-0.5938983834903411,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529,-0.0132633758837144,0.2930435082013052,2.2684789495928994,0.0853086889333529 -1,43,0.7148213037098026,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981,-0.7019854368140658,1.408893632658834,0.5078629724212651,-0.218769711385981 -1,44,-0.9990236390866448,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636,2.138611526896666,1.6224252204407783,1.3656424777113103,-0.6197723706627636 -1,45,-2.035389167985359,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312,-0.4641464411878229,-1.3845837181487322,-1.3562245646187732,-1.1247441521636312 -1,46,-0.1241090076273592,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791,-0.3929353813928705,-0.1806118894466941,-1.2589744121175277,-0.072555647708791 -2,47,0.6859234003054556,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203,1.878090363680033,-0.451915812567419,-1.551896108778869,1.3399026572550203 -2,48,-0.8499007946906604,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387,0.5316335161706456,-2.076928596557136,0.5089022493346776,-0.024381870075387 -2,49,0.9408956310929066,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262,-1.383512008752633,-0.7200539514595277,-0.4616503845204617,-0.9970857305430262 -2,50,1.6646131411816578,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487,-0.9116180632797354,0.676131854304542,0.4064830425417453,-0.8334960910074487 -2,51,-1.4938369847202195,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262,0.1807163239900383,-0.5520111418892181,0.9541145888616588,0.3845601295654262 -2,52,0.8496529584712066,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844,0.3477709783565773,-0.0700644269350197,-0.1491201158577285,-0.2294227620946844 -2,53,-0.0459189534252687,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545,-0.5910886720642256,-0.1758591223402343,0.4926583207467876,1.0169773111385545 -2,54,1.5365245662265232,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886,-1.0001172593271828,-1.3009627710612612,-1.9417151819704204,0.3363413463024886 -2,55,0.6256680895244052,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301,-0.6059838835052326,-1.9462420775220304,-0.4657423912926528,0.0097818169970301 -2,56,-2.260359396826676,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234,0.3696348407961316,0.8349123959613609,-0.9894874210300914,0.5901905216267234 -2,57,0.1914661609037843,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184,-2.159229683786817,1.8919225969657176,0.7699124251573882,-0.3329927633569184 -2,58,0.5158076460748913,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301,0.1158729118533183,0.0480150229911599,0.1342074200813592,0.5469937351204301 -2,59,-1.0947810018348507,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716,0.510184749224577,0.0521734016312016,-0.0620290424804897,1.4387947715516716 -2,60,-0.9865581243255936,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986,-1.0181941589104413,-0.122488689422634,-0.0623725199141001,-1.5928420817380986 -2,61,-1.4338664192702113,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152,-2.1012260841117647,-0.5029723690001373,-0.8841317706278249,0.4144898850289152 -2,62,-0.2172906414350655,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164,-0.2641403390810031,0.784556160076621,-1.021775165064795,0.9626552542957164 -2,63,0.0199528357410374,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851,1.126424989282014,0.4504849416729672,-0.6089787081800524,0.5938953228849851 -2,64,0.0168235208889687,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631,-0.2788158895740412,0.9155610696581168,-0.8498994741129242,-0.6852888501385631 -2,65,2.1259103285431804,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908,-0.3884284583050837,-0.2164343072108221,1.0272836436902952,-1.802304268569908 -2,66,0.0094460765129033,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691,-0.9695615693196264,0.9838979133549992,0.0853085749390771,-0.0129419618714691 -3,67,-1.473158658721011,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939,1.57860530312412,1.781026952291244,0.3785703689466918,0.728096157555939 -3,68,0.8552751411665621,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876,-0.4852580169423038,1.2210276536011708,-0.0731007657759648,0.7156279104852876 -3,69,-0.6933356133030083,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728,1.3115417566478216,0.1115062283716643,1.360751332964618,1.3546839988588728 -3,70,1.4678284201004026,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479,-0.9375197390131628,2.2180940643695273,-0.834846466609614,-1.232361381356479 -3,71,0.24217591143051,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013,-1.4933926504379784,2.063977986283959,-1.809855630735837,-0.0435872778479013 -3,72,-2.10339281517975,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734,1.66698134913082,1.358559600078244,-2.1594379807383564,0.5484525334475734 -3,73,1.0711650587517474,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456,0.4215958062784253,-0.7316269607111615,-1.5313215972642025,1.307847634805456 -3,74,1.7463744130531542,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832,1.6374672768528042,-0.8610589522771745,0.687052936489978,-2.618532214839832 -3,75,-0.3363388568076421,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857,0.2645026021626481,-0.3201115163187721,-0.3698804048569127,-0.8496513139782857 -3,76,-0.3242937117544179,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022,0.7526070369449078,0.0701835488158233,1.7261527406887782,-0.7521255704289022 -3,77,-0.9411647896878936,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708,0.2182067272217519,-0.4656191153685143,-0.9060432443210892,-2.126705535677708 -3,78,1.069879949761595,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675,0.2730385089817146,1.010133405147957,0.3555883594964702,0.8752645615044675 -3,79,-0.8667154099610572,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871,-1.1795205381405394,-1.1624184233132826,-0.181205600784726,0.3561666568718871 -3,80,0.1198519014290499,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836,-0.300497076461078,-0.3509048690778804,-0.0490761453581302,-0.5208614133489836 -3,81,1.044964805654135,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277,-0.8405052153381654,0.3234805183583499,-0.507367498913363,0.1299212462358277 -3,82,-1.8702057892269273,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782,0.7356818372550097,1.0955279766605173,-0.7170222640656372,-0.3047310126274782 -3,83,0.886557763359472,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724,-0.2388956656409064,2.141356993565713,-0.4907544149793494,1.9115397604052724 -3,84,-0.4732550989352198,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438,1.643155432693797,-0.5315980822923431,-0.1847655376603063,-0.8567878621140438 -3,85,0.0634333684969395,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536,0.5319856670267262,-1.6832107216853982,1.9391554888589777,0.9366327938393536 -3,86,0.2665413517198428,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765,-2.1326672344812105,1.6293148762619551,-0.1407819188950014,0.1183670068806765 -4,87,-0.9188292311366768,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917,-1.6042550026469249,0.934842571948927,0.5486353617814611,-0.1473154301210917 -4,88,-0.2034731183127446,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692,-0.5997440870462475,-1.6268707626302394,0.827624617684303,-1.3056540391037692 -4,89,-0.215148925629062,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083,-0.0520796489093672,1.0706727669407372,0.2834781571881385,3.0274943343874083 -4,90,0.6064317194064263,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023,-0.0883800576540255,1.8298688366760425,-0.8498887240727157,0.3617294328556023 -4,91,0.5244272005602573,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871,-0.8334261447948773,0.8460104326165239,-0.8306787084232922,-0.4453650036042871 -4,92,-0.4160522494759603,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487,1.350321469218172,0.6572555679296421,-0.9931133230551088,0.6282853705023487 -4,93,-0.2625459626333661,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686,-0.9992263103431246,0.6359063166710964,-0.2163318860335712,0.9642562105511686 -4,94,-1.0851148931024432,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051,-0.7635405661499053,-0.8288880276599218,-0.1516555757419315,-0.8330901074711051 -4,95,-0.2912304897933477,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382,-0.6666971915003546,0.7571819436119471,-0.8026449667542606,0.7981435937792382 -4,96,-0.8187074748916447,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881,-3.730120038128068,0.6010894307864201,1.486736945275556,0.7995168560801881 -4,97,0.0492718080501761,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142,-1.8018134368021572,-0.5882845110059814,0.1996588544375249,-0.4778765668524142 -4,98,-0.8062622557548957,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827,-2.966586951844483,0.3460687892555774,0.7122258787189174,1.7731643504472827 -4,99,-0.4153917948141301,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815,0.9763019660890628,-0.7464387784593907,-0.6432674437141003,1.2401001274351815 -4,100,-0.2224607283709459,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306,-1.9341599869280055,-0.5571429776627114,-1.0509036442167718,-0.6172799146920306 -4,101,-1.5140509754678362,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826,0.0115401685101198,-0.4361955547709313,1.176673643162231,0.7526864964032826 -4,102,1.0334281623735169,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289,-1.7973367751171303,0.6067623680262983,-1.2244068035018794,-0.3922040087053289 -5,103,-0.6864230377948968,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916,-0.5782800824093337,0.0443200602767032,1.3462077769017655,1.3164444471305916 -5,104,0.4121725852133129,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368,-0.1850434000530602,0.2991100780439658,-0.1375589867919389,0.420020710446368 -5,105,-0.910130468154296,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415,-0.2332258635179755,0.3259625438150267,-0.9377838244466902,0.8921979069031415 -5,106,-1.70552576193866,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861,-1.5395002171602334,-2.427626324562745,-1.0107549325024228,0.4279062963690861 -5,107,-0.5989313128779504,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617,-1.106476206464435,-0.0836893357947032,0.2910156134691695,-0.1809155329521617 -5,108,-1.768663887404953,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085,-2.129243520644403,-0.3347671453032915,-0.1324631105096152,0.5335886571652085 -5,109,0.0821914280814239,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374,0.4768143516638856,2.1555402812119433,1.7507054168018197,-0.7825217022412374 -5,110,1.390366451549932,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568,-0.1723342300598751,-1.833112610191324,-0.3134080474285327,-1.3297057074440568 -5,111,0.3326169890263175,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328,-0.6345577264308937,0.7987667198270795,-1.3845614226225136,-0.9899126599978328 -5,112,0.6734144260342821,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664,-1.3588134360661253,0.590422932866436,1.1726184657626748,-1.2241592816111664 -5,113,0.0305206223002543,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765,-1.115309203106232,0.5874688773032962,-0.2400575224647247,-1.6081151211440765 -5,114,-0.0784091712011275,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431,1.660083512711184,1.484213803841194,-0.0316580690339819,0.6893365374951431 -5,115,2.064172173892823,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892,0.5981510743069248,0.3784041225930067,0.205692450226748,1.3184511797851892 -5,116,-1.9779839409772504,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326,0.1762152669186038,-1.1598019361532663,1.232834205749278,0.2530927744153326 -5,117,0.2051671337582474,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581,0.0995596156598381,1.1771905557314233,-1.3464989957288118,-0.7218134212123581 -5,118,1.6220394426605342,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007,-0.134973127015259,-0.0541151698997675,1.253570686211627,-0.0069204705176007 -6,119,0.0473166159950642,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836,-0.7491928547518463,-1.417592127415145,0.0364353437915598,-0.4138548174567836 -6,120,-0.4115115284299588,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192,2.070533424691801,0.6783386557605176,-1.2066020838043194,-0.9217336181544192 -6,121,-1.402681056942516,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834,-0.714833705558571,2.1854436787350413,-0.6967053433394235,-1.086483742151834 -6,122,-1.3275034743892011,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567,0.1631413469278299,-2.3538868063575453,-0.7112384571825194,1.474288547233567 -6,123,0.7014665551150057,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164,1.027268717867479,0.9478340426501988,0.7918858755313075,1.5875581988032164 -6,124,-0.2035315039990889,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116,1.8808868244932129,-1.028398215435934,-0.3360562566812991,-1.898865750922116 -6,125,0.0367104465103882,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676,0.4437277986745326,0.4009052069266717,-1.0404799003110452,-0.4050814416560676 -6,126,-0.5108362781439201,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889,0.1240530371932496,-0.8704155160564115,-1.771859996402141,0.8726496980525889 -6,127,0.3179021236908106,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704,0.4209771365993368,-0.3367093052485816,-0.4402677398140227,1.8224737121284704 -6,128,0.6725802644112402,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718,0.6439655653176443,1.2432492588266604,-0.4657105598503153,0.3293755829411718 -6,129,0.8596257938486648,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218,-0.0632902816234641,0.4016836942875782,0.401291498036223,1.1353736264714218 -6,130,0.4715510300846484,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356,0.7873992206662046,-0.1137723552581951,-0.0933585093103445,-2.088924140703356 -6,131,0.5315089928295402,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333,0.1655764555283259,0.1093916180874643,-0.7592687790730879,1.1776401371612333 -6,132,0.1817244592342696,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122,-0.543886007962999,0.9732071392260258,-0.7251882238055091,0.3101310578176122 -6,133,-0.2256707905927475,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899,-1.3584102327948733,-2.439816596914091,0.9479551036955036,0.0489690373962899 -6,134,-2.16768470520022,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101,-0.1804465985609838,-0.3162304747063833,0.1754295291808443,-1.122565585229101 -6,135,0.3087019855449177,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307,1.0044578374950142,-0.4863328940227803,-0.2306481659713534,-0.1379191118897307 -6,136,-1.2897394787144127,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077,0.7537311601289707,0.4938374222149744,1.4379717883808354,0.477337569358077 -6,137,0.4621743751557871,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556,0.5841218654437593,0.4106303082042001,1.61525984431583,-0.0207534690671556 -6,138,-0.3134765343841647,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216,-0.7226482893432934,-1.759339909789725,0.0102548402674546,0.9348832049035216 -6,139,1.0522402191888502,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954,-0.5571601176468748,-0.4346723973463555,1.361121866942182,-0.804227609128954 -7,140,0.2927037400921888,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609,0.0422524056965653,-0.0240101159271131,1.4489292794691402,0.1431939714725609 -7,141,-0.8730668573777406,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085,-0.4325683214460127,1.706962509491113,0.2734455827127003,-0.4605569829841085 -7,142,-0.2922851815210742,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826,0.8465631724299651,-1.1265125524432609,-0.444622959301189,-1.0553504705140826 -7,143,-0.0649021232364764,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415,0.2871208611901518,-1.09204951025969,0.3400713838645086,0.7206026881536415 -7,144,1.2214127004424862,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971,-0.7868091893675095,0.959537720230388,0.2976658248329601,-1.718237086897971 -7,145,-0.5043967829478707,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205,-1.931844802312892,-0.228977733264822,-0.8053415549445475,0.527556676509205 -7,146,-0.0708070086155714,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898,0.8391818770701904,-0.1782134719224244,0.6898227086652969,1.4729892021615898 -7,147,-0.0692762501832949,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414,0.0019652114728092,-0.3639456962549663,-1.8001008946429178,-1.0059562338044414 -7,148,1.3045814471832968,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604,1.0951871930560133,1.6354854564047197,0.9341867423433384,1.6305569491478604 -7,149,-0.4043913713107616,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279,-1.0208678213187818,0.483662199983621,-0.8412597918918427,2.547370551387279 -7,150,-0.0446396090232183,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638,-0.1154719415024776,1.398128876416756,1.7083320785047869,2.033324551178638 -7,151,0.512499015351023,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028,-0.8707042594597949,-1.109461649094713,0.7551263629789535,0.4043282940651028 -7,152,0.5357132143740251,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976,0.0957855998835066,-0.9450227018489026,1.5294480503629078,0.4191280421631976 -7,153,-2.197173079151018,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987,0.1791648322349623,0.8008029898905117,0.4742598910276621,-1.5587069063508987 -7,154,-0.0886891865646971,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409,0.0648510199038132,1.734280560242711,-0.2552280989334006,-0.7830858337970409 -7,155,-0.2605697307740011,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356,0.2161753878561426,-1.933525731251251,0.9073813550655982,0.1371199788701356 -7,156,0.6174561809867044,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422,1.0344576013849434,0.6160296162846264,-0.5684186138849224,1.5499797081722422 -8,157,-1.0038074507140595,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776,-1.994993947549008,1.145952516208726,1.5216917853720442,1.818575785843776 -8,158,-1.059730211003972,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592,-1.0344467157761543,-0.2535340665870695,-1.4120672507051637,0.1183152450709592 -8,159,-0.3692993280894203,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993,-1.0019028093921996,-1.1000707452790448,-0.0416008039388945,0.7652662329923993 -8,160,-0.4171826559718362,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396,-0.5766936717058257,-1.096630862526761,0.4920064434795458,1.5686505707558396 -8,161,0.2393065429868705,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305,-0.9386728917772926,-0.2402721355505186,0.5365509439884095,0.1255815698914305 -8,162,-0.676895959096811,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214,-1.0166286003580864,0.467624899919605,0.3571814292703247,0.4338170324237214 -8,163,1.1797212483448458,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996,1.2624300972050062,-1.103864704777671,-0.8680772050526456,1.449813536152996 -8,164,0.3968374847149752,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021,-0.5284653415605093,-1.46937511468678,-0.2382931058528679,0.8621272110483021 -8,165,0.2299432745676143,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826,1.1616916884353274,-0.9305269292427952,0.2415737241591204,0.3234054613524826 -8,166,-1.0984706199955088,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167,-0.4651367065068575,-1.1849221842266802,-1.697582153440078,0.5064088364815167 -8,167,1.5304566581109758,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488,0.2991262309237505,-0.6698539026023236,-0.5550596231066798,1.4913472073701488 -8,168,0.7606981599458013,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657,-0.055448324522217,-0.7030253871947769,1.6289405324846409,1.023767695317657 -8,169,-0.1082555524626026,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325,0.599379484168683,0.1495451075683754,-0.35701450358857,-1.4437814578576325 -8,170,-1.7075689205534992,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456,0.3901346999802171,-2.0219509709027697,-0.3146916574309019,-1.2314791793635456 -8,171,1.5659864989309202,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573,0.7395058195373676,2.3514902202349477,-1.177203933584577,0.7673842918563573 -8,172,-0.8565031425715999,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546,-0.2618624769340897,-0.7346368194505823,-0.7864615726217858,1.6847926118412546 -8,173,-0.7512773910842393,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557,-0.4452332175533571,-0.4942753974182512,-0.8744163016610587,0.4514898135283557 -8,174,-1.3291106873309495,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917,0.7613097400139596,-0.1173079903540194,-0.2329089288259748,1.5702390064548917 -8,175,0.0402955848732538,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364,-2.2941794906187303,0.7973437933746751,-1.426007541608154,-1.4233773553881364 -8,176,-0.2798439837471386,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267,0.3184559910398074,0.2107444848003605,0.5596656048644648,-0.8348156343282267 -8,177,-0.6708471763560321,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024,-0.8105101252279568,0.7090347648978511,0.5943452906649828,1.64301604024024 -8,178,1.3065606154170957,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123,-0.4433977354954991,-0.7527960826082498,-0.7841599801769913,0.5931810417739123 -8,179,-0.4208095265891202,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598,-0.2155182381754514,0.8143933428375123,-1.1853946796917243,0.2933912934374598 -8,180,-1.290508372602977,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053,1.6744425413368984,0.996548099996558,-1.0978350788620952,1.0447321534051053 -9,181,-0.0236678016825857,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312,-1.3708388861688323,-0.5493807575389157,1.787101883196328,0.6181051753418312 -9,182,-1.3482004671679793,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057,0.3153721331558907,1.6524931520319377,0.5966684370848218,-0.4304087997159057 -9,183,-1.6032504940224688,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655,-0.9094229514381224,0.1951099471970836,-0.9985225164246512,0.4244180231779655 -9,184,0.8862769243448122,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905,-0.7201079456603995,1.9966008914240203,0.5450880972968815,-0.0579477086770905 -9,185,-0.6916024517502692,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389,-0.3897487397244845,0.0512459191431431,-0.3199173778759451,0.3949805394801389 -9,186,0.4105014455674474,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343,-0.7172381117410999,-1.9727159516935504,-2.048659318810247,-1.6105230975007343 -9,187,-0.479142102490158,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632,0.2448124704232933,-1.162959243638529,0.480689116023008,-2.243399918867632 -9,188,0.4483153370081094,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236,-0.099403340668543,-1.4228761207951308,0.5990631250227616,0.9299617676237236 -9,189,0.0831798773951058,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663,-1.521788254894823,1.1017620346543378,-1.8720492067245145,-1.4146582334712663 -9,190,0.8891055731718962,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196,0.4304399046873204,0.7137451767766787,1.1352709446954192,-0.7481546299358196 -9,191,0.1744572947226649,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832,0.8417705179306674,0.4910955558600506,-1.031973816978013,0.9978354826902832 -9,192,-1.04626647271007,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232,-0.1530678319918289,1.2299202343474671,1.4428401709642211,-1.3269464311869232 -9,193,0.9239324161922192,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386,-0.6719432184447797,-0.6076462824810253,1.3917639604269478,-1.5774782605931386 -9,194,-0.2719797371819717,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123,1.828172446219632,0.4572182235815154,-2.0796199749608832,-0.0946765671355123 -9,195,-0.5394421420914198,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012,-1.2067768937681949,-0.1934015136944914,-0.0429551689588962,-1.0427121479775012 -9,196,0.8822731035358525,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191,-1.1178231135428731,-0.2116301848583066,-0.2733847034116038,-0.8627459284058191 -9,197,-0.2855852303824563,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549,0.6450065530334209,0.2315283210129809,-0.5750141548928486,0.0995309724676549 -9,198,0.1982091219091618,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334,2.8820698132437697,-1.896381798526367,-0.1053054527556563,-0.571201566340334 -9,199,0.5878676284104647,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798,-0.5667820105949781,-2.0175121351827885,0.5531593772082467,-1.0436603387986798 diff --git a/tests/resources/source_scripts/hp_search_eval_script.py b/tests/resources/source_scripts/hp_search_eval_script.py deleted file mode 100644 index 9381766b..00000000 --- a/tests/resources/source_scripts/hp_search_eval_script.py +++ /dev/null @@ -1,42 +0,0 @@ -import json -import os -import sys - -import polars as pl - - -def main(): - if len(sys.argv) < 2: - print("Error: Missing run_name argument.") - sys.exit(1) - - run_name = sys.argv[1] - - # 3. Load predictions and calculate mean & variance - preds_path = f"outputs/predictions/sequifier-{run_name}-predictions" - - dfs = [] - for root, dir, files in os.walk(preds_path): - for file in sorted(list(files)): - # 1. Read everything as strings to avoid read-time schema crashes - df = pl.read_csv(os.path.join(preds_path, file), infer_schema_length=0) - - # 2. Cast to Int64 (strict=False turns bad strings to null) & fill nulls with -1 - df = df.with_columns(pl.all().cast(pl.Int64, strict=False).fill_null(-1)) - dfs.append(df) - df = pl.concat(dfs) - - max_freqs = df["itemId"].value_counts()["count"].max() - stdev_freqs = df["itemId"].value_counts()["count"].std() - - # 4. Save metrics back for Optuna to ingest - eval_dir = "outputs/evaluations" - os.makedirs(eval_dir, exist_ok=True) - eval_json_path = os.path.join(eval_dir, f"{run_name}.json") - - with open(eval_json_path, "w") as f: - f.write(json.dumps({"max": max_freqs, "stdev": stdev_freqs}, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-0-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-0-embeddings.csv deleted file mode 100644 index 76bd77d7..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-0-embeddings.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -0,0,7,0.8649381,0.24562168,-0.47390407,0.26047117,-0.24761012,1.3031981,0.95492613,-0.36946228,-0.91278917,-0.7628124,1.0646838,-0.84439635,0.16634521,-0.007354275,-1.7519352,-0.033109475,-0.45459607,0.115075,1.1531727,0.9546873,1.2859629,-1.0329498,1.2402246,2.6194525,-0.55354816,-0.63395625,-2.1362736,0.8346781,-1.0040193,-1.0341624,-0.8379355,0.057529,1.3040087,0.12587658,0.8301326,-0.5306769,-1.623395,0.36828652,1.856288,0.320922,-1.8282198,-1.3440526,-0.9354176,0.24922973,1.2998884,-1.236273,-0.055613205,-0.8205791,-0.4832966,1.8687013,-1.4167951,-1.1055189,1.6474618,0.9178678,-0.94887453,1.1648152,0.03853327,-0.36139467,-0.66810036,-1.3988649,-0.1772363,-0.077192,-0.42204562,1.8334289,1.367824,-0.21193206,-0.16146825,-1.3633878,1.9045291,0.64752847,-0.5658707,-1.9270079,-0.7966031,-0.4969335,-1.1129528,-0.3014826,-1.2423565,0.99004376,-0.5590482,0.210285,1.45484,0.78570837,0.4753621,-2.9085505,-0.41873848,-0.30167663,-0.785309,-0.31538683,-0.9972849,0.013730815,-0.4415555,0.761963,-1.4535736,1.3455216,0.027025485,1.8463998,1.8265476,0.24507502,0.7862814,-0.902054,0.41721246,0.29755303,0.40205243,2.0839143,0.08692597,-0.7652936,-1.7749745,0.7529008,-2.0421607,-0.78219783,-0.539601,-0.8647213,0.6763834,0.54173374,1.1983194,0.9964866,0.35037822,1.9535118,-0.9696219,1.1370679,1.1510953,0.2664108,-0.06128295,-0.7830806,-0.050288465,1.0513953,0.33808768,-0.23930782,-0.6178605,0.55309016,-1.3475106,-1.2853458,-0.20373966,-2.6442385,1.2245853,0.4053069,-0.67187744,0.47685108,1.4946405,-0.057367213,0.5233804,-0.41413814,-0.38341537,1.4250722,1.7166282,-0.8751589,-0.07256896,-1.6518211,-0.09111433,0.9957127,0.033603884,0.6290189,-0.51680666,-0.6019538,-1.1488315,0.6561611,-0.9112413,0.5100694,-0.010201941,-0.41575626,-0.99573976,0.51400137,-0.13324496,0.6003735,0.90858644,-1.756543,-0.56579715,-1.2166046,-0.4743553,0.6017386,0.7139283,0.6312486,-0.22448407,0.010416127,1.5952412,-0.31673738,-0.08042968,-1.1402948,-0.39998963,-0.92721313,-1.572918,-0.34202433,1.4257507,-0.44051456,1.3233937,0.4287483,-1.2166924,-0.44838187,0.6182652,-0.20860778,0.8979676,-0.8103249,1.3890587,-1.2660643,0.34599945,0.12778881,1.0039934,0.5634353,0.49836227,-0.8949199 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-1-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-1-embeddings.csv deleted file mode 100644 index db25681f..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-1-embeddings.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -1,0,7,0.8438418,0.1794473,-1.0610754,0.49876413,-0.18509679,1.2684177,0.7748202,0.42714408,-0.32632595,0.30871361,1.0232624,-0.531747,0.6962955,0.31235534,-0.97006154,0.4374414,-0.6124084,0.8816563,0.69690573,1.8744665,0.8528751,-1.2626123,1.3722603,2.5256085,-0.5358826,-1.2145865,-1.0444467,1.2561449,-0.30111277,-1.5428085,-0.7596274,0.93373644,1.1946712,0.8260702,0.21434239,0.16956076,-1.6884155,0.5569528,1.8079216,0.4667857,-2.5842013,-1.2288795,-0.69257486,-0.3466202,1.6240005,-0.17097999,-0.021782674,-0.7709626,0.14133824,1.3214102,-1.152685,-1.4690636,1.647548,0.30679667,-1.4932691,1.687439,0.48392302,-1.2188569,-0.082943715,-1.1727151,-0.24080916,-0.48152798,-0.54473346,1.1660991,1.0062953,-0.45552832,-0.66909534,-1.3224851,1.9710338,0.89391387,-0.83821976,-1.2250444,-0.9232601,-0.89614505,-0.1337835,-0.1138566,-0.741236,1.4156529,-0.5768202,-0.19710043,1.0930521,0.9971356,0.41112706,-2.1113818,-0.41081738,-1.1549268,-0.37958524,0.0063747503,-1.3508683,0.07076833,-0.3163995,0.5410095,-0.72964126,0.90011233,-0.29304907,1.7490932,1.6180183,-0.04848024,1.211592,-0.6006584,0.61566734,0.31913698,0.67258716,2.4460082,0.35291326,-1.0352191,-1.1832807,0.51288897,-2.5279958,-1.15038,-0.41004008,-0.3320385,0.3593691,-0.031581197,1.248297,0.87027967,0.4268465,1.9122381,-1.6881752,1.4497418,0.5821907,0.3530083,0.07751833,-0.87054706,-0.10214504,0.92046994,1.1150131,-0.62742823,-0.60133314,0.70472723,-1.2772338,-0.63218576,-0.8797032,-2.7727962,1.1135479,1.0888294,-1.2965524,0.4657736,1.8480299,-0.12805218,0.7858551,0.11978366,-0.9293707,1.4585854,1.1101878,-0.82679045,-0.4033856,-1.705105,-0.119805895,0.92903,-0.5818992,0.87437165,0.041271035,0.010319752,-1.7818887,0.45985395,-0.9583002,1.2992034,-0.17113139,-0.28721648,-1.5636964,-0.015204845,0.24306999,0.60780245,0.8181639,-1.1685832,0.26470146,-0.7132485,-0.5549229,0.40392053,0.9555501,0.25418147,-0.77363104,0.24352336,1.8109292,0.20031126,0.13125075,-1.3413204,0.03766993,-1.3070565,-1.0881963,-0.6965358,1.3141092,-0.7294182,0.76772827,0.016266245,-1.7116737,-1.1352007,0.61998254,-0.58296555,0.80039984,-0.14008771,0.9584638,-0.6666944,0.15143473,-0.16964145,1.2095227,0.10272378,0.3348041,-0.2182458 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-2-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-2-embeddings.csv deleted file mode 100644 index 5284467d..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-2-embeddings.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -2,0,7,0.52204627,-0.038092855,-0.82732695,0.52709055,0.06611072,1.0820338,0.6271256,-0.7258145,-1.0272309,0.21715637,1.1717758,-0.38762644,0.54010385,-0.33218145,-1.6269217,0.23357184,-0.8224511,0.7772591,1.2175651,1.905813,1.5552422,-0.47752312,1.6528003,2.6848164,-0.7099252,-0.78975856,-0.9663611,0.39896625,-0.5068774,-0.76180744,-0.22029436,0.49096388,1.3501009,0.4508182,0.6573443,-0.2667651,-1.7489359,0.6311765,2.0538185,-0.38108113,-2.1136858,-1.5755099,-1.4845366,-0.056731053,1.4559208,-0.87732655,0.11649373,-0.31365696,-0.968069,1.8460219,-1.2417718,-0.44821975,1.495183,0.39649376,-1.0719526,1.417287,1.2832841,-0.7492332,-0.40597665,-1.1388721,0.5925744,-0.65348125,-0.08980144,1.4410766,1.9072348,-0.4337984,0.2681212,-0.8927501,1.7772413,0.36656567,-0.4058805,-1.738713,-1.3288599,-0.72347444,-0.014828365,-0.124502756,-0.84998757,0.30157983,0.49887928,-0.1615823,0.41461873,0.18497966,0.69440186,-2.075491,-0.8384113,-1.0419928,-0.9347767,-0.67896277,-0.69964796,-0.4201842,-0.70845145,0.9878649,-1.3933247,1.8833025,0.6312973,1.695937,1.71965,0.10518575,0.3091634,-1.6875365,0.79602194,-0.057294976,0.88798237,2.0516448,0.08196111,-0.44834742,-2.015611,0.43115285,-1.5257589,-1.0001528,-0.7601532,-0.86637354,0.5525021,0.10951839,1.535792,1.4130329,0.1467389,1.818903,-1.1924548,0.6846707,0.49561536,0.82903117,-0.45645127,-0.9932831,-0.903748,0.8548094,1.3870052,-0.24820147,-0.2833696,0.53783894,-0.29969555,-0.42618462,-0.42249247,-2.6975384,0.9544928,0.89196867,-0.7268504,-0.3831172,0.40872112,-0.5766559,0.8267256,0.44900906,-0.20187785,1.2164347,1.406283,-1.4030226,0.24202895,-1.3471564,0.38567412,-0.14396489,-0.02556357,0.8743769,-0.22310354,-0.13754714,-1.4840792,0.9863184,-0.67454904,0.81428856,0.57713085,-0.9858999,-0.8832908,0.30878907,-0.0063148057,0.31424287,1.0139408,-1.8677388,-0.78900766,-1.0641052,-0.9655488,0.4306992,1.3903565,0.5520786,-0.39177105,-0.4996559,1.8079237,-0.34591374,-0.5728688,-1.5090452,-0.07140037,0.038317777,-1.3744234,-0.78208166,0.9468176,-1.0600139,1.9171584,-0.02225734,-1.8697608,-0.7089237,1.139994,-0.06938327,0.06805763,-0.57662845,0.54992193,-0.04600769,-0.17940713,-0.19065502,1.2973483,0.87212723,-0.09027165,0.08437479 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-3-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-3-embeddings.csv deleted file mode 100644 index b176d111..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-3-embeddings.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -3,0,7,0.5811147,-0.032513455,-0.47977856,0.13629222,-0.26297802,1.0946103,0.70547986,0.2546013,-0.5609061,-1.0476835,0.25876504,-0.47654045,0.6124765,-0.62587225,-2.3766463,-0.87987435,-1.1483063,-0.08349529,0.058731697,2.3143327,1.4411461,-0.7700864,1.6809956,2.562706,-1.1312455,-1.919516,-2.5979652,0.97807324,-0.58193874,-0.4056123,0.100295246,0.10704158,0.4826064,-0.3876764,1.1518319,0.3071064,-1.0756433,1.348694,1.2538676,0.8821212,-3.0179098,-1.1350209,-0.6724623,-0.84317905,2.1001053,-0.8851265,-0.45266476,-0.15717253,0.020399736,0.5467559,-1.436141,-1.0484979,1.1574883,0.36959058,-1.3153619,1.9301816,0.9880461,-0.8081846,0.796931,-0.7006053,-0.043729685,0.29161018,-0.17788444,2.3002772,1.6774901,-0.9066579,-0.12004822,-0.7499011,0.9292784,0.55876046,-1.5865698,-1.2220012,-1.0178283,-0.6064322,-0.17501302,-0.52628666,0.8076905,1.1616044,-0.3377207,-0.054776378,-0.07740326,1.052842,-0.1103256,-1.4683763,-0.9702077,-0.23154487,0.37362558,-1.6633947,-1.0713861,-0.2937544,-0.40128285,1.0818906,-1.1223569,1.1332817,-0.7912049,0.80717605,1.2827631,-0.46637723,0.97363174,-0.8316934,1.044962,0.06701209,0.36239144,1.3466328,0.17860873,-0.8557746,-1.2067758,-0.083446786,-2.647533,-1.4590422,0.3115786,-1.1877053,0.34800985,0.0067028324,1.0329384,0.6848961,0.7815907,0.70181257,-0.31994092,1.1682042,1.5868865,-0.1021363,0.20299423,-0.18094988,0.058076646,0.35854048,1.38783,0.17383336,-0.66786546,0.53052557,-0.8849052,-0.264605,-0.46346378,-2.4525568,0.87664086,1.8091627,-0.887404,-0.5623806,1.4447385,-0.614229,1.0334789,0.23856685,-0.57881784,0.8717396,1.1144764,-0.84959036,-0.7336873,-0.6120007,0.49778894,0.20692903,-0.1316462,0.57095027,0.07802366,-0.045190286,-1.3658072,0.44326764,-0.95905554,0.6394518,-0.5813267,-1.3264008,-0.718985,0.1745243,0.75313646,-0.32120827,1.118506,-0.969537,-0.62831134,-1.4774725,-0.9432864,1.0576622,1.6772305,-0.6164494,-0.5101229,-0.8483868,2.2736018,0.5569865,0.12856804,-1.1824113,0.72462106,-1.1923324,-0.3833196,-0.8572979,1.0559568,-1.1587551,0.47620925,0.71898955,-1.4884728,-1.4193738,1.1060739,0.34149924,-0.081969894,0.7028209,0.4915076,-0.47154474,1.1152692,0.46461847,0.74368006,-0.28396526,0.040208068,0.38362354 -4,0,7,-0.40144852,0.4484332,-1.9290444,0.67508656,-0.35645357,0.58294165,1.0673926,0.32582113,-1.0179955,-0.5669628,1.6901405,-0.597517,0.57684857,0.6212512,-1.3812616,-0.0031751008,-1.4166527,0.31889653,0.8719765,0.92417514,1.434082,-0.9677904,1.0067217,2.4912894,-0.5054417,-0.091208264,-1.6230117,0.6646005,0.14070033,-0.4588424,-2.0376508,0.20500316,0.6994927,0.4712299,-0.017884562,-0.041826397,-1.9103551,-0.8554847,0.9786731,0.5541552,-2.017602,-0.60309106,-0.12291661,-0.078420684,1.9937975,-1.4203902,-0.6049179,-0.4561434,-1.3776398,0.7715638,-1.5148757,-1.4664235,1.4948455,0.59697,-1.5645903,1.4915609,-0.16028762,-0.21107581,-0.6521816,-1.9952201,-0.12593468,-0.0323758,-0.73676616,1.6785882,0.386853,0.30982378,-0.23634642,-0.7451515,1.9966604,0.29396093,-0.4427039,-1.1439474,-1.4322784,-0.86600333,-0.47581324,-0.32586938,-0.4229079,1.7753755,-0.29973793,-0.80312866,0.83222604,0.6190816,0.8152262,-2.184811,-0.36325434,-0.44522017,-0.8133582,0.14973828,-0.54611415,-0.26411292,-1.6611116,0.8977264,-1.8963674,0.6349306,-0.06896561,0.85603106,1.2678437,0.65789634,1.2733372,-1.8506087,0.80270076,0.7760959,0.14549729,1.809624,-0.35460156,-1.1367061,-1.11971,0.44256684,-1.9340838,-1.3446312,-0.52430373,-0.6890866,0.25105867,-0.16935606,1.5000091,1.6533798,0.40652713,1.940414,-0.7145079,0.7842815,0.7231326,0.6299073,0.20868257,-0.022947172,0.0590606,0.015217416,-0.14524586,0.5871516,-0.20919175,0.8956564,-1.2955273,-0.28790218,0.23210756,-2.3776908,1.9674141,0.8105194,-0.7433918,-0.15029533,1.3930359,0.55439985,1.0334952,-0.16596296,-0.87932885,1.2013986,1.6930834,-1.1102449,-0.4110713,-0.88066155,0.48112375,1.262018,0.5744189,-0.23829386,-0.17633875,0.25621903,-1.2790095,0.26927826,-0.4251639,1.4009678,-0.68966246,-0.57853395,-1.9202563,0.73328453,-0.1512125,0.99056023,0.7747929,-1.3844789,-0.92885804,-1.2573935,-0.69143796,0.6731172,0.8143503,0.11032579,-0.865953,0.15180536,0.2987957,-0.6535276,0.73512334,-1.3143648,0.45279935,-0.48555213,-0.52440286,-1.1472527,1.0770756,0.40460247,0.71095395,0.8498973,-1.0886842,-0.76816595,2.1436665,-1.6361245,1.3135405,-0.39040008,0.43102646,-1.0228053,0.79288054,-0.43767598,-0.025315946,0.5831925,-0.122284114,-0.5308977 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-4-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-4-embeddings.csv deleted file mode 100644 index 45d59f99..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-4-embeddings.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -5,0,7,0.4836214,0.15431057,-0.8040745,0.29091778,-0.055900697,1.2060295,0.3452758,-0.8614426,-0.9362209,0.34898758,1.1721082,-0.4112888,0.3945304,0.2336385,-1.4738886,0.73230135,-0.5247049,0.6479498,1.5893649,1.6185886,1.3388404,-0.48648638,1.4070816,2.6896753,-0.5802976,-0.7131316,-0.4670565,0.63593763,-0.47043854,-0.74653304,-0.44683897,0.52990055,1.5743597,0.62231994,0.36112452,-0.41805673,-1.6092434,0.117180616,2.251997,-0.4125149,-1.6764935,-1.4553155,-1.3477093,0.588175,1.2021706,-0.8264717,0.13591708,-0.5834153,-0.6440799,1.8806185,-1.564533,-0.5116288,1.3243208,0.3408409,-0.9232263,1.1233313,1.1755381,-0.87264514,-0.381421,-1.2161983,0.029331272,-0.6922146,-0.08794284,1.609424,1.6640897,-0.5114714,-0.031018924,-0.7680615,1.8714914,0.6504967,-0.3274704,-1.8043759,-1.1517804,-0.81753194,-0.16838285,-0.15660566,-1.4273182,0.27939737,0.25196457,-0.15733546,0.599071,0.2938215,0.43453452,-2.450483,-0.6304489,-1.01529,-0.91700906,-0.041178755,-0.8448184,-0.22622812,-0.7264896,0.9366097,-1.4195501,2.0062637,0.6819727,1.9392235,1.7529082,0.1502222,0.32664576,-1.3147435,0.55803806,0.20468958,0.9131472,2.2310262,-0.1215383,-0.5964191,-2.0484083,0.43182093,-1.5355808,-1.2749287,-0.9757672,-0.9061006,0.8016716,0.12147521,1.4375226,1.4464892,0.098983355,1.8112254,-1.96104,0.54458094,0.40790206,0.6800015,-0.55492187,-1.3341256,-0.56690305,1.023294,1.0548493,-0.70494395,-0.26114026,0.37238428,-0.5541062,-0.5526852,-0.5225235,-2.4509475,1.124607,0.48349783,-0.8573671,0.11351146,0.65686464,-0.6089635,0.48230767,0.38274416,-0.42615348,1.0773033,1.5329567,-1.329324,0.10873803,-1.7785066,0.26635838,0.39991972,-0.10376236,0.7763999,-0.4305313,-0.23850553,-1.2875695,0.73188037,-0.58677316,0.9893427,0.1941753,-0.56284344,-1.1522082,0.4671607,0.093474194,1.139886,1.052885,-1.7801507,-0.3854622,-0.67583334,-0.81050724,0.4004889,0.7293054,0.6006033,-0.7552659,-0.325302,1.7445861,-0.48890847,-0.58957654,-1.4742821,-0.15116952,-0.10655272,-1.2754749,-0.5283034,1.1386613,-0.8321361,1.7763195,-0.21586367,-1.6490741,-0.57824636,0.8866336,-0.26279575,0.35519692,-1.1262823,1.2348262,-0.02918719,-0.45923397,-0.7515425,1.6313766,1.0427995,-0.014255836,0.1959896 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-5-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-5-embeddings.csv deleted file mode 100644 index 9a30653c..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-5-embeddings.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -6,0,7,0.6047183,0.61474156,-0.85807425,0.1360568,-0.47004148,1.3154823,0.85255265,-0.2758797,-0.94348884,-0.46887586,1.2464497,-0.17505822,0.22009045,-0.5281095,-1.6458,-0.2863077,-0.7895708,-0.032991536,0.6482207,1.1479981,1.6235281,-0.8318479,1.2820829,2.5700314,-0.74509114,-0.956326,-1.8435808,0.50691956,-0.42929974,-0.82176375,-0.688462,-0.16810319,1.0948266,0.04102623,1.1152531,-0.29527077,-1.4508649,0.15333177,1.8691535,0.65497345,-2.3797927,-1.5487301,-0.8639569,-0.12066294,2.1302707,-1.1985978,-0.4929019,-0.9896101,-0.38555038,1.4556348,-1.5805736,-1.253294,1.9447695,0.7381123,-0.87177855,1.6145153,0.29667908,-0.54530835,-0.6368157,-1.3141624,-0.17360605,0.09582736,-0.50669295,1.6515435,1.0648893,-0.32638404,-0.30910656,-1.0866282,1.7825578,0.1281249,-1.2656724,-1.9909875,-0.67408943,-0.47530064,-0.6126794,-0.78917897,-0.7749392,0.95389134,-0.13919069,0.37404194,1.517078,0.837784,0.7876206,-2.7127264,-0.9797122,0.22331813,-0.5448298,-0.37922773,-0.85313463,0.29169962,-0.72657126,0.6292672,-1.6658629,1.0823836,-0.3303371,1.5071089,1.7243761,0.09441604,0.78559613,-0.8699731,0.83902586,0.43403652,0.27791783,1.5322093,0.39030224,-1.0829405,-1.1652853,0.4393425,-2.4266343,-1.1654254,-0.8020692,-1.2343247,-0.02799856,0.082993135,1.4820228,0.81963,0.81295073,1.5777001,-0.74838066,1.0510573,1.142717,0.67160773,-0.22292933,-0.5321122,0.073675826,0.8971168,0.5200968,0.2786284,-0.6427973,0.5132947,-1.2613649,-1.1026112,-0.2773738,-2.553699,1.4465657,1.2948054,-0.9990521,-0.10682497,1.5314655,0.27273822,1.0103928,0.21165001,-0.5424684,1.0398483,1.2868812,-0.9073566,-0.4446297,-0.86511356,0.28190532,1.1098244,-0.050390765,0.50629246,-0.4595085,-0.39918143,-1.5425367,0.8516377,-0.5174903,0.82666886,-0.24608938,-0.55887544,-1.367161,0.31737787,0.38218778,0.6614556,0.62725943,-1.8203161,-0.7528492,-2.0896697,-0.8917504,0.34349948,1.1796234,0.4355885,0.14362016,-0.1739353,1.5831403,-0.103192456,-0.020828791,-1.1002008,0.052845396,-0.7443734,-1.1041548,-0.86692,1.290353,-0.6568599,0.8881055,0.80793345,-1.1829001,-0.648108,0.781555,-0.75571537,0.790254,-0.30762485,0.82678217,-1.2168562,0.5863828,0.29487747,0.7162153,0.18510085,0.6786084,-0.55795467 -7,0,7,0.6299754,0.050378714,-1.0953621,0.40204868,-0.20064756,1.2504606,0.64857304,-0.5956721,-1.1048201,0.08307071,1.2121466,-0.74361223,0.40176916,-0.19288543,-1.5207201,0.18478414,-0.75672543,0.6516608,1.2947527,1.4226474,1.5715213,-0.7016897,1.537614,2.4972186,-0.66829467,-0.7722992,-1.0611916,0.84529483,-0.6867521,-0.8948152,-0.83675677,0.5516693,1.4557326,0.597971,0.52972084,-0.3124734,-1.4932187,0.23769754,2.1977735,-0.23013769,-2.2219017,-1.3230104,-1.2486353,-0.076617986,1.3280454,-1.2714481,0.05504124,-0.5108662,-0.7244996,1.7406578,-1.2521456,-1.0216031,1.3594753,0.49166912,-1.0463053,1.4819757,0.8894106,-0.78244185,-0.44918662,-1.2543783,0.06708226,-0.60776013,-0.45414528,1.8482741,1.4049805,-0.51085305,0.007999584,-0.81303686,1.9179218,0.6898083,-0.68716633,-1.6860543,-1.1650369,-1.0256021,-0.27775717,-0.43408686,-1.197075,0.7731409,0.45193902,0.13899827,0.5074849,0.6706757,0.6787472,-2.57881,-0.58425534,-0.8426904,-0.9324049,-0.3311055,-0.9196865,-0.534395,-0.88145584,0.8438232,-1.2858,1.7702929,0.14992192,2.1282425,1.7167776,0.39477825,0.50257206,-1.4573762,0.5586969,0.08780366,0.50719386,1.8912692,-0.06565876,-0.49146792,-1.8407304,0.48491526,-1.819101,-0.97141093,-0.6114753,-0.940766,0.5585653,0.06410881,1.4343958,1.449382,0.06305862,1.8221257,-1.2712216,0.8074854,0.7395423,0.63117987,-0.38569003,-0.9561888,-0.34065723,0.9483605,0.6962596,-0.16962893,-0.6836114,0.4338564,-1.3348165,-0.5754306,-0.37627304,-2.8389518,1.3089486,0.59520245,-0.78578126,0.22991493,1.1825001,-0.4132581,0.46656233,0.17132021,-0.51955664,1.1751152,1.520865,-1.29063,-0.16482846,-1.6479331,0.20740972,0.5557091,0.031369217,0.3343893,-0.26854822,-0.23717512,-1.1977962,0.7109176,-0.8197224,0.85080427,0.07489285,-0.57192963,-1.1184924,0.9720554,0.31332842,0.8337498,1.2144716,-1.7497374,-0.4055033,-0.97871673,-0.52501994,0.294604,1.0116265,0.7438575,-0.32010132,-0.2937276,1.6995173,-0.4956802,-0.16089632,-1.3082268,0.05458243,-0.33528122,-1.3450384,-0.57403374,1.2334722,-0.7604033,1.5351142,-0.18204713,-1.5558845,-0.4553292,1.076027,-0.46304265,0.69380623,-0.6540957,1.0922314,-0.59123945,-0.09509767,-0.0446557,1.2391702,1.0227808,-0.0018399156,-0.16837811 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-6-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-6-embeddings.csv deleted file mode 100644 index 9b428c4a..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-6-embeddings.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -8,0,7,0.26348084,0.1233009,-0.9510862,0.46851432,-0.06629313,0.8160627,0.5431626,-0.9199505,-1.360739,-0.2538705,1.1684657,-0.14489299,0.10989469,-0.2309123,-1.7760984,0.3490349,-1.0261083,0.1856724,1.4605979,1.6237235,1.7129359,-0.5611574,1.6723084,2.8874109,-0.98691314,-0.65485513,-1.0679046,0.44296682,-0.5673327,-0.2541984,-0.4929436,0.35431877,1.1681324,0.25615126,0.8050912,-0.35653836,-1.7087184,0.043991115,1.7704822,-0.08917144,-1.9798214,-1.8724368,-1.4108714,0.26632398,1.5392265,-1.3474573,-0.10791889,-0.567187,-0.96988684,1.7185776,-1.6027321,-0.33695924,1.4299693,0.46550983,-0.89209276,1.3031094,1.5477902,-0.6060929,-0.40710664,-1.2166933,0.41607055,-0.3897111,-0.08740451,1.7933946,1.7434844,0.009654752,-0.067560725,-0.5996982,1.7986253,0.3483771,-0.16625577,-1.9332577,-1.0659667,-0.59093297,-0.25158393,-0.40012267,-1.1106377,0.071712896,0.39155295,-0.039082322,0.38537106,0.21039137,0.69452846,-2.3482246,-0.79463667,-0.4639145,-0.52193904,-0.5554572,-0.5127063,-0.5268354,-0.9455389,1.341622,-2.0886319,1.58943,1.0482309,1.3858846,1.7408938,0.02892668,0.5694529,-1.5788714,0.9006992,0.118018724,0.7638617,2.0551603,-0.32436588,-0.6434378,-1.8908632,0.18551913,-1.5123209,-1.4987677,-0.7352275,-0.9231083,0.4445965,0.17023665,1.6077462,1.7081463,0.22440022,1.6947187,-1.0983723,0.48353592,0.5596647,0.8932061,-0.29618305,-0.6437828,-0.31312457,0.5083116,1.2900065,-0.33875406,-0.32123098,0.313723,-0.4940811,-0.8215438,-0.10663929,-2.3547385,1.1263422,0.68281025,-0.9162914,-0.43100452,0.49630877,-0.394641,0.5690176,0.45832327,-0.61618537,1.2726052,1.3995229,-1.3063124,0.4918943,-1.4364437,0.24002609,0.3745131,0.049085103,0.45316574,-0.453979,-0.018170724,-1.1888833,1.0507466,-0.4225001,0.8939625,0.40870383,-0.8803912,-0.66381943,0.4014866,-0.33330816,1.1037079,1.3088257,-1.8285968,-1.0561757,-0.80511665,-1.1772425,0.8244654,1.09275,0.4883135,-0.6731263,-0.55346674,1.5592078,-0.95583314,-0.41993904,-1.1939453,0.3556415,0.42150888,-1.353197,-0.4794684,1.0955988,-0.4739728,1.6267781,0.053663608,-1.6591601,-0.5589501,1.5400091,-0.4875693,-0.023662472,-0.7958585,0.68492943,-0.0061785085,0.0073458375,-0.25019705,0.9735828,0.9391158,0.18115312,-0.13106072 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-7-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-7-embeddings.csv deleted file mode 100644 index 7701bce1..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-1-best-embedding-3-embeddings/sequifier-model-categorical-1-best-embedding-3-7-embeddings.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -9,0,7,0.76275426,0.18214901,-0.57188916,0.059701614,-0.28557384,1.2528464,0.79763407,-0.63960886,-0.96146375,-0.0512549,0.8373615,-0.3810237,0.24112543,-0.20450255,-1.7736192,0.36160433,-0.7304003,0.41004166,1.2904602,1.6976061,1.2359073,-0.87983704,1.8318158,2.488492,-0.795438,-1.1328822,-1.5530977,1.0552738,-0.77631116,-0.88773954,-0.4693062,0.16485235,1.0138454,0.17359263,0.7859901,-0.23536894,-1.4138858,0.38051438,2.14049,0.16130738,-1.9554428,-1.4978547,-1.225305,-0.007534434,1.8237702,-1.0094837,0.08617119,-0.4849619,-0.25551113,1.6335402,-1.7301743,-0.73824334,1.371595,0.8042116,-0.9446179,1.2468611,0.8701763,-0.7954289,-0.5617317,-1.1564339,-0.08375406,-0.4792437,-0.45387352,1.6733506,1.8638924,-0.5079436,-0.1641803,-1.058204,1.876411,0.6470958,-0.5844382,-2.1348605,-1.0387065,-0.6489218,-0.38448277,-0.53584003,-1.0877233,0.89465255,-0.070738666,0.4274419,0.9511695,0.727988,0.68438584,-2.3704088,-0.6923841,-0.68775594,-0.59505486,-0.51203656,-1.1223544,-0.11988432,-0.28750613,0.5628186,-1.4707938,1.4209483,0.17336716,1.5996127,1.5890402,0.4437642,0.9046561,-1.1071699,0.63461745,0.06332244,0.69563353,2.2999492,0.38046426,-0.77210474,-1.8445017,0.47982848,-2.1513295,-1.4039284,-0.7259288,-0.89535034,0.7229532,0.38970834,1.1962795,1.1890666,0.22372073,1.7938012,-1.1250141,0.9569801,0.8552448,0.5728794,-0.105201356,-1.0274678,0.068610765,1.1812729,0.73605824,-0.69981444,-0.71209633,0.503375,-1.2361196,-1.1348834,-0.5413534,-2.8409722,1.1658453,0.535366,-0.8362626,0.4911523,0.9966621,-0.16169278,0.5466709,0.065419264,-0.50554013,1.3522164,1.6981294,-1.1887987,-0.18314654,-1.4414601,0.17046571,0.5640569,-0.04139424,0.71503925,-0.32278606,-0.39535967,-1.3595438,0.8323629,-0.99404913,0.8279306,0.15347865,-0.36941954,-0.90245074,0.32202348,0.21524166,0.4956704,1.0135361,-1.5879138,-0.6533115,-0.97604185,-0.7554835,0.48038816,0.99044883,0.53412485,-0.16621038,-0.14424634,2.0332005,-0.21379094,-0.06764341,-1.2983478,-0.312222,-0.9194852,-1.2916971,-0.36260626,1.1965542,-0.7213257,1.3095983,-0.08372764,-1.4751688,-0.62356883,0.7289247,-0.069254085,0.41077098,-0.49018452,1.1164718,-0.7885649,0.029319612,-0.09494034,1.3525505,0.58701926,0.36867285,-0.38973525 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-0-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-0-embeddings.csv deleted file mode 100644 index 428d289b..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-0-embeddings.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -0,0,5,1.7890625,0.41992188,-1.796875,0.6953125,-0.14941406,-0.0019836426,-1.9765625,-0.31445312,0.76953125,-0.75,-1.109375,-1.25,-1.484375,0.765625,-0.36914062,0.71875,-0.046875,0.29296875,0.32617188,0.73046875,0.6640625,0.39453125,1.203125,0.86328125,-0.85546875,0.51953125,-1.0703125,-0.63671875,-0.84765625,0.35546875,-0.7109375,0.8046875,-1.4609375,0.42578125,0.9921875,0.6171875,0.515625,-1.9453125,-1.34375,0.65625,0.24902344,0.48632812,0.80859375,-0.28125,0.37109375,-0.234375,-0.921875,-1.328125,1.84375,-0.41992188,2.078125,0.80078125,-0.6796875,-0.20703125,1.03125,1.9140625,0.23242188,-0.5390625,-0.7734375,-0.734375,1.3984375,-0.038085938,-0.20898438,0.56640625,-1.1484375,1.0390625,-0.31835938,-0.2578125,-1.0234375,-0.921875,1.65625,-0.24707031,-0.021606445,0.46484375,-0.15722656,-1.3671875,-0.60546875,-0.000015974045,-0.3046875,0.546875,-0.36132812,1.953125,-0.41992188,0.110839844,0.5703125,0.09863281,-0.5703125,-0.60546875,-2.453125,1.0859375,-1.515625,-0.94921875,-2.109375,0.796875,1.734375,-0.84765625,1.0625,-0.61328125,-1.25,0.51171875,-1.4453125,1.046875,1.5546875,-1.359375,0.26367188,0.10205078,-0.053222656,-0.65625,0.19628906,2.578125,1.265625,0.671875,-0.02368164,-1.03125,0.17480469,1.0,-1.21875,0.37109375,-0.81640625,-1.359375,-2.1875,0.94140625,0.12158203,0.765625,0.8046875,-0.17773438,0.625,1.0390625,0.28320312,-0.051513672,-1.1875,-0.4921875,0.32421875,0.37890625,-0.50390625,-0.91015625,2.0,-0.13964844,0.33398438,-0.7890625,-0.33984375,-0.81640625,0.828125,0.31835938,-1.2109375,-1.7734375,-1.578125,-0.72265625,0.47460938,-0.91796875,0.3515625,-0.51953125,-1.2109375,-0.57421875,-0.7421875,-1.3203125,-0.2734375,1.1953125,0.16796875,-0.3203125,-0.67578125,-0.43164062,-1.015625,-1.2421875,0.51171875,-0.08154297,-0.36914062,-0.546875,0.12988281,-1.21875,0.2265625,-0.033203125,1.2421875,0.82421875,2.578125,1.109375,1.2421875,-0.21972656,-0.18652344,2.546875,1.6796875,0.33203125,-1.59375,-1.2890625,0.72265625,1.609375,-0.12402344,-1.6484375,1.0390625,-0.23242188,0.4140625,0.69140625,-0.064941406,0.890625,0.17089844,1.21875,2.359375,-0.31054688,-0.51171875,1.390625 -0,0,6,0.16113281,1.0703125,1.09375,0.796875,1.359375,0.56640625,-0.75,-1.1328125,1.875,-2.265625,1.1484375,-0.50390625,-2.078125,0.052001953,-1.0703125,-0.0625,0.73828125,-0.96484375,0.3828125,0.25195312,1.75,0.41796875,0.5625,0.34570312,-0.19140625,-0.33789062,-1.421875,0.45117188,0.056884766,1.71875,0.3203125,0.6953125,0.77734375,-2.09375,-0.58203125,0.96484375,-0.9765625,1.484375,-0.5859375,0.5703125,0.78125,-0.11621094,0.25585938,-0.828125,0.8046875,0.65625,0.22363281,0.50390625,-0.74609375,-1.1640625,0.36914062,0.47265625,-0.6875,-0.10253906,0.46679688,2.1875,-1.4140625,0.25195312,0.51171875,0.5234375,-0.3984375,-0.041748047,-0.18457031,-0.78515625,-0.080566406,1.203125,1.3671875,-0.984375,1.8046875,-0.46875,-1.0234375,0.23046875,0.375,-1.0703125,0.7578125,-0.26367188,1.4140625,-0.37695312,-1.296875,1.7890625,1.2109375,1.5078125,0.765625,-0.35546875,1.09375,-0.32226562,0.11230469,-2.578125,-0.60546875,-0.65234375,-0.30859375,1.3671875,0.61328125,-1.4140625,-1.5625,-1.09375,-0.2578125,-2.90625,0.1484375,-0.6796875,0.45117188,-0.49609375,-0.69921875,-0.46875,1.375,0.21289062,1.4765625,-0.62890625,-2.328125,0.18945312,1.046875,1.359375,-0.39257812,-0.25195312,1.953125,2.109375,-0.05859375,1.1953125,0.31835938,-0.49609375,-0.359375,0.037841797,-0.3046875,0.43359375,-0.921875,-1.0078125,-0.42578125,-0.032714844,1.0546875,0.8359375,-0.8359375,0.107910156,1.015625,0.7890625,0.62890625,-0.6953125,0.33398438,-1.078125,-0.51953125,-1.265625,1.0625,-0.43164062,0.24414062,0.87890625,-0.81640625,0.890625,-0.78125,0.51953125,-1.0625,1.25,-0.26171875,-0.18066406,0.26757812,0.04296875,-1.3046875,-0.6796875,-1.1015625,1.28125,1.0,0.41796875,-0.86328125,-1.09375,-0.25976562,-1.2109375,-1.4296875,0.67578125,-0.011413574,-0.515625,-3.5,-0.56640625,1.1484375,0.47851562,1.0234375,1.015625,0.796875,-1.671875,-0.6484375,0.39453125,1.0078125,-0.5703125,1.1328125,0.40429688,-2.15625,0.74609375,0.51171875,1.5390625,0.796875,-0.546875,-0.18359375,-1.609375,-0.60546875,0.17285156,-0.30078125,0.90234375,-1.125,0.24316406,-0.35546875,-1.34375,-0.16503906,-0.7421875 -0,0,7,-0.71875,-2.15625,-0.546875,1.4375,1.1015625,0.45507812,0.056640625,-1.125,1.0078125,0.859375,2.03125,-1.2265625,-1.71875,0.123046875,1.3984375,-0.9765625,0.7578125,-1.03125,0.40234375,-0.37695312,1.453125,0.045410156,-0.33789062,0.43554688,1.4609375,0.7265625,-0.3984375,0.28710938,-0.70703125,-0.27734375,0.07373047,0.14355469,1.5546875,0.28515625,0.4765625,0.45898438,1.890625,0.65625,-0.6640625,-1.2578125,-1.4609375,0.703125,-2.046875,0.49804688,0.10888672,0.203125,1.7890625,-1.75,-2.34375,-1.203125,0.14746094,-0.0119018555,-1.1953125,1.7890625,0.1875,0.8359375,-0.22070312,-1.1328125,-0.22265625,1.6015625,-0.19726562,-0.14648438,1.109375,-0.13378906,1.5234375,-0.62890625,1.6953125,-1.4140625,0.12158203,-1.3203125,0.8828125,0.17089844,1.28125,0.75,-0.55078125,0.828125,-0.65625,0.859375,-1.4375,1.1953125,-0.55078125,1.078125,-1.4609375,-1.375,-0.19335938,-1.21875,-1.890625,0.11230469,0.77734375,1.390625,-2.015625,0.4609375,0.45507812,-0.22558594,0.10595703,0.83984375,0.81640625,0.23046875,-0.052490234,0.44140625,-0.104003906,-1.1015625,1.1015625,0.6171875,0.87109375,-1.1484375,0.66015625,-0.140625,-0.092285156,-0.92578125,1.625,0.032470703,-0.9296875,0.41210938,0.58203125,-1.3359375,-0.47070312,-0.28710938,0.031982422,0.12207031,-0.8125,0.026977539,0.17578125,1.9453125,0.63671875,-0.6953125,0.25390625,-0.29101562,0.78515625,1.4296875,0.39648438,0.88671875,-0.16308594,0.94140625,-2.109375,0.8984375,1.9453125,0.37109375,-1.015625,0.5546875,1.5,-0.33007812,-0.4765625,-0.20703125,-1.875,-1.5546875,-0.71875,1.375,-0.18261719,-1.4453125,1.546875,-2.40625,-0.9921875,0.44726562,-0.22460938,-0.59375,-0.953125,0.12011719,0.21289062,0.0035095215,-1.1171875,-0.15625,-0.640625,0.23339844,-0.20507812,1.890625,0.4140625,-0.75390625,-1.21875,0.041259766,0.33984375,-0.1796875,-0.20214844,0.07714844,0.04272461,0.91015625,1.625,0.69921875,1.3046875,1.0859375,-0.018676758,0.8515625,-0.38867188,-1.5234375,0.11328125,0.0859375,-2.109375,-1.7734375,0.16992188,-1.15625,1.9921875,-0.21289062,0.35546875,-1.296875,0.4375,0.072753906,-0.51953125,-0.3046875,-1.03125,-0.99609375 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-1-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-1-embeddings.csv deleted file mode 100644 index a6d6cd23..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-1-embeddings.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -1,0,5,-0.8203125,0.5703125,1.25,1.2265625,0.125,-0.82421875,0.037841797,0.77734375,1.9296875,-2.65625,-0.11425781,-0.12451172,-0.6015625,1.171875,-0.34765625,-0.7890625,-0.4921875,-1.2109375,-0.7890625,-0.22949219,-0.5625,-1.5859375,0.27929688,-2.234375,0.123535156,-2.421875,1.7890625,-1.671875,0.07714844,-0.0859375,-1.65625,1.5859375,0.21679688,-0.921875,0.1015625,-1.046875,0.546875,0.26171875,0.39453125,-0.38085938,0.27148438,1.40625,-1.109375,-1.4375,-0.04711914,-0.7421875,-1.03125,0.45898438,-1.5703125,-2.34375,-0.98046875,1.234375,-0.48828125,-0.6640625,0.9140625,2.0,-0.921875,-0.30859375,1.734375,0.5234375,-0.875,-1.96875,0.27734375,-1.296875,-0.42382812,0.14257812,0.9140625,-1.828125,-0.76953125,-0.27929688,-1.265625,1.171875,-0.234375,0.65625,1.5,-0.72265625,0.83984375,-0.25390625,-0.71484375,1.2265625,1.75,0.70703125,1.109375,-0.5234375,0.21386719,0.671875,0.021362305,0.43945312,-0.8828125,0.28320312,0.80078125,0.421875,2.546875,-0.62890625,-0.48632812,0.24804688,0.9453125,0.15234375,-0.9765625,2.21875,-0.33789062,0.67578125,0.46484375,-1.015625,0.6484375,-0.123535156,-0.140625,0.46484375,-1.9375,0.26757812,0.029296875,-0.14746094,0.5546875,0.66796875,0.35351562,-0.56640625,0.1640625,0.6171875,0.92578125,-0.96484375,0.14257812,1.625,0.28320312,2.515625,-0.6484375,-1.7734375,-0.5703125,0.19628906,0.40820312,1.0625,0.3828125,-0.78125,0.11425781,1.0,1.1875,0.41210938,-0.796875,-0.890625,-0.76171875,0.45117188,2.140625,-0.29296875,-0.546875,0.63671875,0.0037384033,-1.0859375,-0.609375,0.26953125,-0.33398438,1.1875,1.1953125,0.31835938,0.004760742,0.65625,0.44140625,-1.703125,-0.8359375,0.828125,0.24902344,-1.1796875,0.17773438,0.31054688,1.625,0.22070312,-0.17773438,0.484375,-1.109375,-0.546875,-1.0078125,-1.1875,0.13378906,1.3125,-0.65625,-0.14355469,0.24707031,1.5390625,1.3515625,1.4296875,-0.6328125,0.28515625,-0.14160156,0.19042969,-0.11669922,-0.84375,1.1953125,1.15625,-1.3125,-1.296875,0.67578125,-1.8359375,-1.578125,-0.85546875,2.0,1.125,0.41796875,0.33398438,-0.5234375,-0.067871094,-0.41601562,-0.22363281 -1,0,6,-1.3125,-0.34960938,-0.38671875,1.65625,1.3984375,-0.6953125,-1.078125,0.061035156,-0.19335938,0.0146484375,0.53125,-0.6015625,-0.6171875,-1.3046875,0.80078125,0.25976562,-0.36132812,-1.046875,0.5546875,-0.44921875,0.67578125,-1.1015625,-0.15625,0.68359375,-0.25585938,-1.2734375,-0.61328125,0.65234375,-1.578125,-0.6484375,0.30859375,0.53515625,0.7578125,-0.6171875,-0.06982422,0.13769531,0.75,0.21386719,-0.47460938,-0.80078125,-0.47265625,0.62109375,-1.59375,-0.52734375,-0.4609375,0.014709473,0.5390625,-0.83984375,-0.875,-1.140625,0.88671875,1.421875,-2.125,2.21875,0.75390625,1.34375,0.86328125,0.30664062,0.69921875,0.3203125,-0.703125,0.578125,0.9140625,-1.328125,0.66015625,-0.30273438,0.671875,-0.2890625,-0.609375,-0.7421875,1.0078125,-0.7734375,-0.16699219,1.0078125,-0.484375,-0.296875,0.17089844,0.46289062,-2.078125,0.77734375,-0.59765625,0.36132812,-0.13085938,-2.328125,-0.28320312,-0.625,-0.578125,-0.76953125,-0.18945312,0.453125,-1.3515625,0.6171875,1.0859375,-0.6328125,-0.8515625,0.30664062,-0.29296875,-0.59765625,-1.1484375,0.79296875,1.6953125,0.10839844,1.390625,1.4296875,1.6640625,-1.015625,2.140625,0.20898438,0.34179688,-0.21972656,1.4296875,0.49023438,-0.84375,-0.18554688,1.0703125,-0.057861328,0.26367188,1.796875,0.546875,0.5390625,-0.54296875,1.5390625,-0.57421875,3.25,2.015625,-1.6015625,0.2421875,-0.3359375,0.49609375,1.1796875,-0.9140625,1.296875,-1.15625,-0.36132812,-1.828125,1.1484375,1.625,-0.33789062,-0.4765625,-1.7109375,0.8046875,-0.49414062,0.3984375,0.34765625,-0.7734375,0.24121094,-0.578125,1.625,-0.546875,-0.2265625,0.66796875,-1.8515625,-1.8828125,2.125,-0.106933594,-1.9140625,-1.9140625,-0.35546875,1.0390625,0.40234375,-0.19628906,-1.2109375,1.1640625,0.23535156,0.6171875,0.5703125,0.48242188,-1.984375,-0.06347656,1.515625,-0.07861328,0.30273438,1.1484375,0.022705078,-0.049072266,-0.6640625,1.0703125,1.34375,2.203125,0.122558594,0.9609375,-0.70703125,-0.29101562,-1.9453125,0.26171875,-0.3125,-1.6015625,-0.58203125,0.515625,-1.90625,-0.43359375,-0.23730469,1.734375,1.2734375,-0.70703125,-0.7265625,0.055908203,-0.4765625,-1.1796875,-0.734375 -1,0,7,0.76953125,0.265625,-0.25195312,1.2890625,0.87890625,-0.98046875,-0.09375,-1.21875,0.73828125,-0.092285156,0.1484375,-0.8984375,-1.125,-0.64453125,0.6875,0.65625,0.8046875,-0.26367188,1.0234375,-0.39648438,0.26171875,-0.625,-2.171875,1.34375,1.7265625,0.39648438,-0.94140625,1.2109375,0.6796875,-0.62890625,-0.75,0.30273438,0.58203125,-1.078125,-1.875,0.15722656,0.96484375,-1.828125,-0.8125,-1.6328125,-0.78515625,0.6875,-1.0703125,1.1328125,-0.61328125,-0.41796875,1.09375,-0.375,-1.0546875,-0.27734375,2.53125,0.7890625,0.484375,2.03125,-0.8046875,0.17773438,-1.1171875,-0.59765625,-0.24902344,0.013977051,1.265625,1.515625,-0.83203125,-0.515625,0.07421875,-0.81640625,0.48046875,-0.60546875,1.484375,0.19726562,-0.55859375,0.0008087158,-1.546875,0.86328125,-1.4609375,0.0006942749,1.1171875,0.51171875,-1.953125,0.004272461,1.2109375,1.3828125,-0.80078125,-1.4375,0.69140625,1.40625,-1.6640625,0.02709961,0.041259766,0.33398438,0.55078125,0.61328125,0.06542969,-0.12792969,-1.4375,0.19433594,-0.19238281,0.16308594,-1.6640625,-0.38867188,0.12988281,0.5625,-1.390625,1.984375,-0.6796875,1.40625,0.35742188,-0.5078125,-0.45703125,0.9765625,1.640625,0.953125,-1.015625,0.546875,0.33984375,0.8203125,-1.09375,1.0625,-0.7265625,-0.45117188,-1.2421875,2.359375,-1.71875,0.3671875,0.72265625,0.21777344,1.3359375,-0.59375,0.43554688,1.046875,-0.119140625,1.3046875,-0.34179688,0.07714844,-0.25,0.007019043,2.703125,-0.1953125,-0.23925781,-0.77734375,0.06591797,0.12988281,-0.6171875,-0.100097656,0.24707031,-1.484375,-0.30859375,-0.9296875,0.20800781,-1.7734375,-0.62109375,-2.15625,0.68359375,1.78125,-0.50390625,-0.49023438,-1.5625,0.3046875,-0.25976562,0.91015625,-0.671875,0.111328125,-0.578125,-0.5859375,0.90625,0.9296875,0.91015625,-0.32421875,-0.6953125,-0.7109375,-1.1484375,0.012512207,2.296875,-1.5234375,-0.033691406,0.75,0.546875,-0.671875,2.359375,1.7734375,2.34375,-0.31835938,-0.91796875,-0.15234375,0.671875,-1.2734375,0.3984375,-1.3671875,-0.73046875,-0.5390625,0.296875,-0.13671875,0.29492188,1.3828125,-1.8359375,-0.29296875,-1.1171875,-0.44726562,0.44921875,0.1640625 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-2-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-2-embeddings.csv deleted file mode 100644 index 34da42cc..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-2-embeddings.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -2,0,5,-1.140625,-1.0546875,-0.25390625,-0.48242188,0.87109375,0.18457031,0.69921875,-0.37695312,0.9453125,-0.88671875,-0.58984375,-1.2734375,-1.0625,0.084472656,-0.52734375,-0.80078125,0.515625,1.59375,1.4296875,0.65625,0.86328125,0.50390625,-0.32226562,0.9140625,0.28515625,0.55859375,0.49804688,1.28125,0.95703125,-0.40429688,-1.078125,0.100097656,0.41210938,-0.44921875,-0.47265625,-0.4296875,0.8984375,-1.6015625,-0.34375,-0.27148438,0.18945312,-0.048828125,-1.0,0.45898438,0.73828125,-1.2109375,-0.84375,0.98828125,-1.21875,-1.484375,0.453125,0.6640625,-1.40625,0.5234375,0.515625,0.4921875,-0.57421875,0.5546875,0.10888672,0.71875,-1.59375,-0.50390625,0.70703125,0.765625,-0.14355469,0.19628906,1.46875,0.48242188,0.6328125,-1.2109375,0.2109375,-1.0859375,-0.26367188,1.3125,-2.09375,0.390625,0.18261719,1.09375,-1.03125,-1.34375,-0.13378906,2.15625,-0.86328125,-0.55859375,0.94140625,0.06933594,-0.76953125,-1.8515625,0.16992188,0.53515625,-0.74609375,-0.58984375,1.140625,-0.359375,-0.19238281,0.78125,0.90625,-1.0390625,-0.9140625,1.203125,-1.328125,0.33007812,-0.66015625,0.8828125,-0.609375,1.6328125,-0.56640625,0.33984375,-2.359375,-0.70703125,2.84375,0.26367188,1.8046875,-0.92578125,0.8828125,-0.6640625,-1.0078125,-0.5859375,0.49804688,0.51171875,1.1015625,0.23339844,0.7109375,1.25,0.6015625,0.73046875,-0.37304688,-0.70703125,0.84375,1.09375,-1.2578125,-2.171875,0.74609375,1.390625,-0.6953125,-0.52734375,1.59375,-1.1171875,-1.140625,0.24609375,-0.14257812,0.44921875,-0.83984375,-0.8515625,-1.734375,-2.21875,-0.06933594,0.9609375,-1.25,-0.6640625,-0.41992188,-0.984375,0.64453125,0.20800781,-0.43164062,-0.265625,0.80859375,0.69921875,-1.109375,-0.7734375,-0.17382812,0.1015625,-1.8515625,-0.6796875,1.546875,1.3203125,-0.55078125,0.79296875,-1.8203125,2.109375,-1.203125,2.328125,1.7890625,1.2578125,0.515625,0.3125,0.83203125,0.07861328,0.057128906,3.109375,1.09375,2.015625,-1.0390625,-2.03125,-0.26171875,-0.8984375,-0.72265625,-0.38867188,0.20605469,-0.6640625,0.36132812,-1.546875,0.4296875,0.671875,0.43164062,0.29882812,0.5703125,-1.078125,-0.008300781,0.37695312 -2,0,6,-1.984375,0.23242188,-0.41210938,0.8359375,0.40429688,0.859375,-0.28320312,0.55859375,0.28515625,-0.57421875,0.43554688,-1.1484375,-1.0546875,0.66796875,-0.625,-0.41601562,-0.29296875,0.734375,1.21875,0.92578125,-0.20507812,-0.28125,1.5,0.44335938,1.5546875,-0.66796875,0.59375,-0.010253906,-0.03930664,0.2578125,-1.5546875,1.4375,-0.76953125,-1.09375,1.171875,-0.828125,0.15136719,-0.32617188,-1.1484375,0.1484375,-0.45507812,-0.59375,-0.23144531,-0.6640625,0.61328125,0.010803223,0.15429688,-0.20898438,-0.6484375,-0.60546875,0.47265625,0.18652344,-1.484375,-0.23242188,0.1171875,2.578125,-0.8671875,-1.3359375,1.9921875,1.6640625,0.578125,-0.27539062,0.62109375,0.068847656,0.71484375,0.29101562,0.19335938,-0.75,-1.4609375,-2.28125,-2.3125,0.34179688,0.6171875,-1.28125,0.62109375,-0.75390625,0.34960938,-0.43359375,-1.0078125,0.84765625,0.0065612793,1.796875,-0.25976562,-1.65625,0.42382812,-0.024169922,-2.109375,-0.83203125,0.45703125,1.5078125,0.88671875,0.8828125,1.140625,-0.72265625,-0.82421875,-0.22460938,0.84765625,-1.3125,-1.390625,1.796875,-0.22363281,-0.52734375,-0.27148438,0.27148438,-0.5703125,0.59765625,1.828125,-0.5,-1.21875,-0.46679688,-0.83984375,0.8359375,-0.72265625,-1.4140625,0.40234375,0.25195312,-1.8046875,1.2734375,-0.18261719,-0.7890625,0.32421875,-0.123535156,-1.0703125,1.5,0.47070312,-0.82421875,-0.25390625,0.5546875,0.6328125,0.86328125,-0.06591797,-0.13378906,0.18359375,0.4609375,0.1640625,-1.953125,0.23535156,-0.5859375,-1.125,-0.016967773,1.625,-0.07373047,0.29296875,1.0859375,-0.32617188,-1.3671875,-1.8046875,-0.060791016,-0.43164062,0.25976562,0.734375,-0.19433594,0.05810547,0.546875,-1.5,0.6328125,0.69921875,-0.41992188,0.6796875,-1.3515625,-1.3359375,-0.96484375,-1.21875,-0.41015625,0.15136719,-1.3515625,-0.7734375,-0.03930664,-0.98828125,-0.50390625,0.14453125,0.87890625,0.37304688,0.34765625,0.90625,1.6484375,2.359375,-0.15234375,1.0,2.109375,1.453125,2.59375,-0.859375,-2.15625,2.296875,1.828125,0.20019531,-0.51171875,1.4375,-1.453125,-0.33398438,-0.82421875,-0.16699219,2.390625,0.7421875,0.36523438,0.8671875,-0.66796875,1.171875,-1.046875 -2,0,7,1.1640625,-0.16113281,-0.31054688,0.09472656,0.9140625,-0.62109375,0.076171875,-0.022338867,-0.3828125,-0.31640625,-1.5,-3.078125,-1.546875,-0.5625,-0.06689453,0.515625,0.6484375,0.796875,0.76953125,-0.5234375,0.12988281,-0.2734375,-0.33007812,0.62890625,0.6171875,0.86328125,-1.4296875,0.37890625,-0.119140625,0.4375,-1.15625,-0.88671875,-0.6875,-0.91796875,0.23242188,-0.90234375,-0.5703125,-1.5859375,-1.0703125,-0.055908203,0.38085938,-0.578125,-0.203125,0.071777344,0.03112793,0.34765625,0.46679688,0.27148438,0.016357422,-0.8046875,0.92578125,0.68359375,-0.828125,0.30859375,1.4140625,1.3984375,-0.8125,-1.1015625,-0.40039062,0.3671875,0.66015625,0.28710938,-0.23632812,-0.13769531,0.40039062,1.21875,2.546875,0.42382812,-0.0546875,-0.75,0.640625,-1.0390625,-0.7109375,-0.14160156,1.3125,-0.14550781,-0.12988281,0.17285156,-1.828125,-0.6484375,0.31054688,3.0625,-0.7109375,-1.3359375,-0.24804688,0.58984375,-1.9765625,1.0703125,-0.10449219,0.95703125,-0.65234375,-1.1640625,1.6875,0.42578125,-0.006958008,0.5625,-0.022583008,-0.64453125,-1.6484375,-0.34179688,1.609375,0.07470703,0.97265625,0.95703125,0.859375,-0.51171875,0.1796875,-2.1875,-0.390625,-0.8046875,1.4296875,-0.08300781,0.079589844,-1.3125,0.6328125,0.68359375,0.31835938,0.8515625,0.13769531,0.45117188,0.1328125,0.75,-0.84765625,1.7265625,1.3984375,-0.23242188,0.171875,0.14648438,-0.38085938,0.42382812,-0.578125,-0.5390625,-1.1640625,-0.69140625,0.100097656,-2.15625,1.015625,-1.859375,-0.7265625,0.5859375,0.625,-1.171875,0.69921875,0.27734375,-1.421875,-2.0,-1.078125,0.30078125,-0.57421875,-1.28125,0.49414062,-1.8828125,-0.21386719,1.234375,-0.26757812,-1.3828125,0.91015625,0.38476562,1.2265625,-1.234375,-1.6171875,-0.47070312,0.12988281,-0.6875,-1.2421875,-1.1015625,-1.234375,-0.27734375,-0.32226562,1.1328125,-0.41992188,1.34375,1.0703125,1.28125,0.22167969,1.09375,0.91796875,-0.9296875,1.203125,2.3125,3.5,-0.12011719,-2.15625,-0.515625,0.7890625,-0.16699219,0.83203125,-0.17480469,1.4375,0.24902344,0.34960938,-0.04736328,0.24316406,2.359375,-0.42382812,1.0234375,2.125,-0.19238281,0.74609375,0.076171875 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-3-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-3-embeddings.csv deleted file mode 100644 index 916e7e56..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-3-embeddings.csv +++ /dev/null @@ -1,7 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -3,0,5,-0.5390625,-1.1171875,-0.26757812,-0.4453125,0.3984375,0.10986328,0.29492188,0.28515625,0.60546875,-0.703125,-1.421875,-1.4296875,-1.328125,-0.004211426,-0.671875,-0.90234375,0.49804688,0.609375,1.875,0.55859375,0.8203125,0.36328125,-0.13867188,0.78515625,0.32617188,1.125,-0.7421875,1.015625,0.83203125,0.5859375,-1.7265625,-0.06738281,-0.24414062,-0.49023438,0.484375,-0.7890625,-0.25,-1.4296875,-0.06298828,0.08886719,0.34570312,0.3515625,-0.578125,0.90625,0.83984375,-0.7890625,-0.80859375,1.5859375,-0.55859375,-1.796875,0.24804688,1.0,-1.3984375,0.6484375,0.8203125,0.8359375,-1.421875,0.11279297,-0.0005912781,0.16210938,-1.171875,-0.0061035156,1.4296875,0.93359375,-0.22363281,0.84375,0.9453125,0.51953125,0.15917969,-0.24414062,0.6171875,-1.40625,-0.30859375,1.0546875,-2.046875,0.45703125,0.90625,1.2578125,-1.6484375,-1.03125,-0.5,2.5625,-0.5,0.265625,1.046875,-0.24609375,-1.140625,-1.1875,0.003967285,0.7421875,-0.50390625,-0.34960938,0.89453125,-0.9609375,-0.35546875,-0.0390625,1.0625,-1.53125,-1.0234375,0.9453125,-0.7421875,0.9296875,-0.59375,0.94921875,-0.66015625,1.453125,-0.9375,0.087890625,-2.015625,-0.12597656,2.234375,0.27929688,2.125,-0.90234375,0.71484375,-0.03930664,-0.58203125,-0.5703125,0.115234375,0.8671875,0.78125,0.578125,0.34570312,1.3515625,0.6484375,1.125,-0.27929688,-0.11767578,1.15625,0.16015625,-1.0703125,-1.8984375,0.29101562,0.64453125,-0.43945312,-1.15625,1.5625,-0.828125,-1.125,0.14550781,-0.8125,0.41601562,-0.27148438,-0.27734375,-2.3125,-2.09375,0.047607422,0.6171875,-1.703125,-0.78125,-0.45703125,-1.1328125,0.31445312,-0.038085938,-0.77734375,-0.91796875,0.30078125,1.0625,-0.42382812,-0.51171875,0.3046875,0.100097656,-1.484375,-1.3046875,1.5,0.8671875,-0.13867188,0.2734375,-1.515625,2.125,-0.87890625,2.015625,1.8828125,1.1875,0.79296875,0.265625,0.6640625,-0.66796875,0.33984375,2.796875,2.140625,1.78125,-1.9140625,-2.171875,-0.37695312,-1.234375,-0.30273438,-1.328125,0.8671875,-0.29492188,0.032958984,-1.0390625,-0.33007812,0.9765625,0.35742188,0.421875,1.0078125,-1.0546875,0.87109375,0.09082031 -3,0,6,1.1171875,-0.46679688,-0.24707031,0.2578125,1.4296875,-2.078125,-1.5078125,-0.8046875,1.203125,0.011291504,-0.3203125,-0.58984375,-1.1640625,-1.4375,0.83203125,1.5,-0.2890625,0.3671875,0.1015625,-0.49414062,1.4453125,-0.5703125,0.515625,0.40820312,-0.28710938,-0.44726562,-1.7109375,0.23730469,0.33398438,0.036376953,-1.3671875,0.86328125,0.48242188,0.72265625,-0.3828125,0.34765625,0.81640625,-0.34179688,-0.29296875,-1.5625,-0.66796875,-0.40039062,0.65234375,-1.7109375,1.2265625,-1.40625,0.9140625,0.07373047,-0.5234375,-1.453125,2.015625,1.7265625,-0.67578125,-0.39453125,-0.52734375,-0.40039062,1.0234375,0.95703125,-0.73828125,-0.9453125,-0.00091171265,-0.52734375,-0.328125,-1.609375,0.029174805,1.4375,-0.09814453,-0.5859375,-0.64453125,-1.265625,1.125,0.8125,-1.5,0.515625,-1.3203125,-1.9296875,-0.265625,-1.84375,0.609375,1.234375,1.8125,1.8359375,0.45703125,-1.140625,0.06640625,0.050048828,-0.70703125,-0.29101562,-0.6328125,1.34375,-1.609375,1.1484375,0.421875,0.32421875,-0.8125,-0.73046875,1.3984375,-1.359375,0.3515625,0.16113281,1.1171875,0.3046875,-0.34960938,0.32421875,-0.87109375,1.75,1.4609375,0.32421875,0.796875,-0.47460938,1.0859375,0.4296875,-1.2421875,-1.1875,-0.10058594,-0.13183594,-0.8125,0.2421875,1.3125,0.59375,-0.68359375,1.1484375,1.46875,0.94140625,0.072753906,-0.62890625,-0.7578125,-1.5703125,0.66796875,1.4453125,0.27539062,-0.421875,-0.296875,0.640625,-0.81640625,-1.0,1.1875,0.007080078,-0.05102539,-0.609375,0.29492188,0.28710938,1.765625,0.7109375,-1.8984375,-0.018066406,-2.78125,1.234375,1.4921875,0.033203125,0.74609375,-1.078125,0.57421875,0.625,-0.22265625,-2.625,-1.2265625,1.3203125,0.75,0.51953125,-0.44921875,-0.4765625,0.4765625,-0.69921875,0.016723633,0.36914062,-0.22851562,0.29882812,0.25195312,0.30859375,1.1640625,0.41015625,0.55859375,0.9765625,-1.546875,-1.1484375,-0.2890625,1.921875,1.4453125,1.5390625,0.18945312,-0.83984375,-1.34375,-1.9296875,1.9765625,0.09814453,0.14648438,-0.3515625,-0.42773438,0.016723633,-0.45898438,-1.8984375,1.0859375,2.015625,-1.0859375,-0.17089844,1.1484375,-0.41601562,0.3515625,-0.5703125 -3,0,7,0.69921875,-0.6015625,-0.67578125,0.35546875,0.42578125,0.049072266,-0.7421875,0.34960938,0.671875,-1.171875,0.328125,-0.5234375,-0.6015625,0.87890625,0.87890625,-0.84375,0.8359375,-0.048583984,1.6171875,-0.75390625,1.5234375,-0.31054688,-0.16992188,1.5625,3.296875,0.95703125,-0.095703125,1.890625,1.2109375,2.15625,-0.65625,1.9609375,0.734375,-0.43164062,0.15625,0.47265625,-0.71484375,0.007080078,-0.65234375,0.890625,-1.09375,-0.2578125,-0.63671875,0.65625,2.03125,-0.62890625,0.6484375,0.078125,-1.828125,-0.671875,-0.98046875,0.24804688,-0.087890625,0.4375,0.12890625,-0.091308594,-2.078125,-0.16699219,-0.041748047,1.078125,-0.92578125,0.70703125,0.20019531,-0.016479492,0.06542969,0.48632812,1.28125,-1.0703125,-0.89453125,-0.49414062,1.03125,-0.7578125,-0.7109375,0.48242188,-0.9765625,-1.0546875,2.1875,-1.875,-1.7265625,1.578125,-0.078125,1.0546875,-0.7109375,-0.8828125,0.25195312,0.265625,-0.09277344,-0.94921875,-0.021728516,0.29296875,0.16796875,1.5703125,1.1796875,-1.3203125,-1.125,-0.8203125,1.7421875,-0.76171875,-1.5234375,0.40820312,-1.0390625,-0.59375,-1.546875,-0.89453125,-1.109375,0.58203125,0.11816406,1.5859375,0.64453125,-0.50390625,-0.095703125,-0.50390625,-1.1640625,0.91015625,1.609375,-1.40625,-1.3515625,-0.30273438,0.44140625,0.6796875,-0.20507812,0.3671875,0.69140625,-0.45117188,0.032958984,0.31640625,0.44140625,0.59765625,0.18945312,1.359375,0.6171875,-0.45898438,0.86328125,1.390625,-0.6484375,-1.5703125,0.671875,-1.0078125,-0.75390625,0.09375,1.78125,-0.53125,0.9921875,0.84375,-0.44140625,-0.9375,-0.890625,-1.5859375,-1.3125,-0.5390625,1.046875,-2.40625,1.7421875,-0.15234375,-0.21484375,-0.29101562,-1.15625,0.47070312,0.30859375,-1.3515625,-0.36328125,-0.33984375,-1.3515625,-0.609375,0.46484375,0.12890625,-1.5078125,1.4921875,-1.0234375,0.87109375,-0.10449219,1.8515625,0.91796875,0.23242188,-1.28125,0.22753906,0.984375,0.8046875,1.1875,1.109375,-0.14355469,1.6796875,-0.48046875,-2.75,1.6015625,-0.06347656,-1.4609375,-1.515625,-0.5703125,-0.34765625,0.3515625,-0.66015625,0.09423828,-0.72265625,0.796875,-1.078125,0.6796875,-0.41601562,0.31640625,-0.87109375 -4,0,5,0.421875,0.3125,-1.03125,0.5859375,-0.43359375,-1.0390625,-1.9453125,-0.5546875,1.125,-0.69921875,0.22167969,-0.18261719,-0.66015625,0.032958984,-0.6796875,0.52734375,0.25585938,0.47851562,0.65625,0.65625,1.6484375,-0.46484375,0.41992188,0.33203125,-0.9296875,-0.27539062,-1.3203125,0.16894531,-0.14160156,-0.5,-0.37109375,0.11328125,0.28320312,-0.38867188,-1.0,-0.07080078,-0.45703125,-0.75,-1.09375,-1.515625,-0.47851562,-0.18261719,-0.043701172,-1.0390625,0.53515625,-0.640625,0.5,-1.890625,0.46289062,-1.375,2.984375,1.359375,-1.2421875,1.1640625,-0.37304688,2.0,0.578125,-0.06640625,-0.52734375,0.13476562,1.640625,-0.095703125,0.55859375,-0.26367188,-0.296875,0.515625,-0.34179688,-0.75390625,1.7109375,-1.5390625,0.77734375,-0.265625,0.18457031,0.75,-2.484375,-0.33007812,-0.953125,-0.16308594,-0.54296875,0.47851562,1.703125,1.5390625,-0.89453125,-1.4921875,1.28125,1.2734375,-1.390625,-0.3359375,-1.6875,0.59375,-1.796875,0.51953125,-2.21875,0.49609375,0.03112793,-0.4140625,1.828125,-0.515625,-1.1328125,0.44726562,-0.48828125,1.2265625,0.31054688,0.4375,-0.34375,1.7578125,1.109375,-0.80078125,0.21875,1.1015625,1.8671875,0.9375,-1.34375,-1.5,0.65234375,0.59765625,-2.34375,0.765625,-0.021484375,-1.34375,-1.703125,1.3671875,-1.4140625,0.31835938,0.625,-0.05517578,0.82421875,0.34375,-0.22851562,1.34375,-1.1484375,0.33984375,0.063964844,0.7578125,-0.11035156,-0.37890625,2.671875,-0.040039062,0.3203125,-0.31835938,-0.7578125,-0.58203125,0.27734375,-0.10058594,-0.42382812,-1.671875,-1.3125,0.071777344,0.62890625,-1.2265625,0.6953125,-1.3046875,-1.0390625,1.21875,-1.5625,-0.53515625,-0.68359375,0.98828125,0.7421875,-0.36328125,-1.265625,-0.11669922,-0.52734375,-1.5390625,0.8671875,1.125,0.40625,-0.94140625,-1.1015625,-1.1875,0.41601562,0.34375,1.140625,0.115234375,1.3046875,-0.46289062,1.59375,0.59765625,1.6640625,2.40625,1.953125,0.05102539,-0.28125,-0.359375,0.52734375,0.94921875,-0.82421875,-1.3359375,-1.1484375,-0.07324219,1.1796875,0.80859375,0.28125,1.359375,-0.036376953,0.75,0.18554688,0.734375,0.15527344,0.74609375 -4,0,6,0.7421875,0.29101562,-1.859375,-0.060058594,1.2578125,0.11621094,-1.2578125,-0.5078125,-0.12792969,-1.046875,0.67578125,-2.953125,-1.8203125,0.45507812,0.6015625,0.83203125,1.1796875,0.63671875,0.12890625,0.38476562,1.109375,1.296875,1.3515625,0.6875,-1.1171875,-1.0078125,-1.125,0.45898438,-1.328125,1.0546875,-0.005706787,0.4296875,-0.30664062,-0.96484375,0.67578125,1.4765625,1.859375,-1.1328125,-0.8671875,-1.078125,-0.14648438,0.640625,0.8046875,0.30078125,0.26367188,0.050048828,-0.48828125,-1.3203125,0.96484375,-1.0859375,1.6015625,-0.30273438,-0.22851562,0.013977051,0.84375,1.4609375,0.19824219,-0.8359375,0.2578125,0.47851562,-1.0390625,-0.71484375,1.21875,-0.546875,0.91796875,0.4296875,2.0,-0.03466797,0.28320312,-1.6640625,0.18164062,1.5234375,1.1015625,0.18261719,0.82421875,-0.8671875,-0.78515625,-0.016967773,-0.37890625,1.421875,-0.29101562,-0.15429688,-0.515625,-0.75390625,1.015625,-0.9140625,0.46679688,-1.40625,-1.1328125,1.46875,-0.6484375,0.0016403198,-0.6796875,0.125,1.421875,0.47851562,0.6875,-1.8828125,-0.43945312,0.08935547,-0.4921875,-0.94921875,1.6953125,-0.8828125,1.5703125,0.17871094,1.1015625,-0.71484375,-1.59375,0.28710938,0.8359375,1.21875,0.60546875,0.18457031,0.14746094,1.328125,-0.87890625,1.53125,-0.76171875,0.36914062,-0.68359375,-1.7265625,0.27148438,0.30664062,0.10839844,0.5078125,0.58984375,0.15136719,0.14160156,-0.27148438,-0.8359375,-0.19921875,-0.671875,1.7109375,-0.921875,-0.4140625,0.765625,-0.28320312,0.109375,-1.1484375,-0.24316406,-0.57421875,1.4296875,0.671875,-1.40625,-0.2578125,-1.3984375,1.0390625,1.3203125,0.3984375,1.1640625,-0.87109375,-0.33203125,-0.66015625,-0.3359375,-1.3359375,-0.24707031,0.8828125,0.17871094,-0.34179688,-0.4921875,-2.015625,-0.97265625,-1.6953125,-1.578125,1.1953125,-0.6484375,-2.0625,-1.6953125,-0.25390625,0.55078125,-0.0071411133,0.20898438,1.234375,1.90625,0.24511719,-0.0045166016,-0.62109375,-0.22753906,1.75,1.1796875,0.4453125,-3.09375,-1.7734375,1.4375,2.21875,-0.17871094,-0.30078125,0.00680542,-0.8984375,-0.203125,-0.43359375,0.61328125,1.9921875,0.1640625,-0.02331543,1.25,-0.5859375,-1.75,0.12792969 -4,0,7,0.890625,-0.67578125,0.047851562,-0.083984375,0.5078125,0.9765625,-1.2734375,0.2890625,2.171875,-0.69921875,0.17285156,-0.49414062,-1.8203125,-1.375,-0.8515625,0.46484375,-0.029052734,-0.20605469,1.359375,-0.19335938,1.359375,-0.96484375,1.140625,0.5546875,1.7421875,-1.0703125,-0.98046875,-0.61328125,0.9609375,1.6875,-1.265625,-0.080078125,1.0390625,-1.3125,-0.076171875,0.017333984,-1.2421875,0.57421875,-0.15039062,0.35351562,-0.04321289,-1.0625,0.6171875,0.27734375,0.07763672,-1.3359375,0.61328125,2.71875,-0.953125,-0.087890625,1.1875,0.10839844,-1.1796875,-0.859375,-0.3359375,1.25,-0.4375,0.4609375,0.16992188,-0.734375,-1.171875,0.921875,0.47265625,-0.734375,0.703125,0.16699219,0.9921875,-0.7421875,0.38476562,-1.1171875,0.734375,0.9609375,0.087402344,0.98828125,0.14941406,-1.8984375,0.61328125,-1.0,-1.375,2.015625,0.01159668,1.1875,1.078125,-0.90625,-1.0390625,0.76953125,-0.796875,-1.3984375,-0.3046875,-0.106933594,0.6953125,0.91796875,0.9453125,-0.6328125,0.33984375,0.12792969,1.375,-1.7890625,-0.3828125,0.107421875,-1.0390625,-0.30859375,-0.15722656,0.64453125,-1.1484375,0.2890625,-0.1875,-0.8125,0.048339844,-0.34375,-0.5703125,1.6640625,0.7265625,-1.3046875,0.85546875,0.21777344,-0.3046875,-0.35546875,-0.11816406,-0.11425781,0.4921875,-1.0234375,-0.8984375,-0.7265625,-0.96484375,-1.1015625,-0.1796875,0.53125,-0.73046875,0.41210938,1.453125,-1.53125,0.58984375,0.68359375,1.71875,-0.28125,0.953125,-2.671875,-0.21484375,0.037841797,3.140625,0.001411438,-0.65234375,1.4453125,-0.28515625,0.859375,-2.40625,-2.3125,0.19042969,0.47070312,-1.1484375,-0.6796875,-1.2109375,0.44335938,-0.93359375,-1.3125,-0.109375,0.66015625,1.8515625,-1.8671875,-0.6171875,-0.83203125,0.11816406,-1.84375,-3.15625,0.296875,-0.23925781,0.53125,-0.91796875,1.0390625,1.140625,1.390625,0.18066406,1.703125,-0.6796875,-0.33789062,0.33398438,-0.13867188,-0.734375,0.41992188,1.5,1.3671875,-0.31640625,-0.08496094,1.078125,1.296875,-0.22265625,-0.31445312,0.6015625,-0.5546875,1.2890625,1.1015625,0.8671875,0.69921875,0.6328125,0.018920898,0.48046875,0.80078125,-0.70703125,-0.19140625 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-4-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-4-embeddings.csv deleted file mode 100644 index 8e5eb006..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-4-embeddings.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -5,0,5,0.23828125,-0.07763672,-0.24707031,-0.41210938,0.17773438,0.35742188,1.0,-0.984375,0.13183594,-0.008911133,-0.91796875,-3.046875,-1.890625,-0.22753906,0.40820312,-0.18945312,0.28515625,1.0546875,-0.25390625,-0.21484375,-0.12597656,-0.25585938,0.6015625,0.1875,0.017211914,-0.083496094,-0.057861328,-0.5859375,-1.0234375,-0.8984375,-0.5,0.51171875,-0.41601562,0.33789062,0.56640625,-0.8046875,1.0625,-0.98828125,-1.265625,-1.28125,0.35351562,0.84375,-0.44921875,-0.703125,-0.63671875,-0.40625,-0.20410156,0.26171875,-1.1171875,-0.65625,0.56640625,-0.10888672,-1.3984375,-0.017089844,2.71875,0.55859375,1.0,-0.90625,-0.24121094,0.58203125,-0.33203125,-0.36523438,-1.015625,0.765625,0.73046875,0.55859375,2.546875,-0.05102539,-0.70703125,-1.0703125,0.7421875,-0.23828125,0.24316406,-0.05029297,0.38671875,0.041748047,-1.0078125,0.52734375,0.020507812,-0.54296875,1.6171875,1.203125,-1.421875,-2.109375,0.46289062,0.609375,-1.2109375,0.08691406,-0.12207031,0.9765625,-1.8515625,-1.9765625,2.609375,1.4296875,-0.3515625,1.5703125,1.015625,0.4140625,-1.0546875,-0.14746094,0.044189453,-0.30859375,1.0625,0.7265625,1.703125,-1.15625,0.34765625,-1.359375,-1.3984375,-1.0,1.640625,-0.609375,-0.028686523,-0.58203125,0.69140625,-0.09423828,-0.44335938,0.578125,0.55859375,-0.94140625,1.296875,0.2265625,-0.6328125,2.953125,1.328125,-0.26757812,0.47460938,-0.75390625,-0.53515625,0.16894531,-0.29882812,-1.4140625,-1.6953125,0.34179688,-0.27929688,-0.34179688,1.1484375,-1.3359375,-0.53125,-0.10888672,0.05834961,-1.640625,-0.07519531,-0.39648438,-1.328125,-2.34375,-1.796875,0.20019531,0.24414062,-1.2578125,1.0625,-1.3984375,0.515625,1.578125,-0.25976562,-1.65625,0.12792969,0.65625,-0.13867188,-0.7109375,-0.39257812,-0.6015625,-0.43554688,1.0078125,0.875,-0.3515625,-0.9921875,-0.546875,0.22851562,0.87109375,-0.013793945,1.921875,-0.4140625,0.8203125,0.3203125,1.2890625,1.4921875,0.40234375,0.099609375,2.8125,0.34960938,0.625,-0.609375,-1.0859375,1.1953125,1.6484375,-0.29882812,-0.07861328,1.2265625,-0.4375,0.16113281,-1.3515625,1.328125,3.09375,-0.0008583069,0.74609375,1.4921875,0.21875,-0.41796875,0.05810547 -5,0,6,-0.68359375,0.19140625,0.78515625,1.40625,0.60546875,0.21484375,-1.390625,1.109375,0.9765625,-0.30078125,0.75390625,-0.061767578,-0.796875,-0.49023438,-0.6484375,-1.6015625,-1.5,-0.41992188,0.65625,1.8359375,0.5625,-0.93359375,2.203125,-0.421875,0.27148438,-1.2421875,0.91796875,-1.9921875,-0.81640625,0.97265625,-1.9609375,0.6875,0.0038146973,-1.078125,1.1875,0.578125,0.27929688,1.28125,0.09667969,-0.5703125,-0.4921875,0.64453125,-0.18066406,0.12890625,0.25976562,-0.9453125,0.734375,-1.421875,-2.34375,-0.48046875,-0.29101562,0.37890625,-0.953125,0.6640625,-0.34960938,1.328125,-0.43554688,-0.39453125,1.78125,1.90625,-0.103515625,-1.265625,0.95703125,-0.97265625,0.51953125,-0.50390625,-1.3828125,-0.50390625,0.23535156,-1.7890625,-0.375,1.203125,0.65625,-0.42382812,0.67578125,-0.62890625,-0.0035705566,-1.0546875,-1.296875,0.13378906,1.125,0.80078125,0.890625,-0.5078125,-0.107910156,-1.390625,-0.27539062,-1.3515625,0.69921875,0.80859375,-0.36328125,0.21386719,0.7890625,0.22851562,-0.44140625,-0.65625,0.62109375,-1.7890625,-0.9609375,1.2109375,0.099609375,-0.63671875,1.125,1.5546875,0.49414062,-0.71875,2.203125,0.029541016,-0.984375,0.29882812,-0.5546875,2.40625,-0.7734375,0.43945312,-0.083984375,1.421875,-0.88671875,0.64453125,-1.453125,-0.10253906,0.103515625,1.6875,0.0039367676,2.28125,0.067871094,-1.3515625,1.234375,1.4140625,0.96875,0.90234375,0.97265625,0.65234375,0.91015625,-0.625,-0.75390625,0.33984375,-0.06982422,0.6640625,-0.26757812,0.4453125,0.515625,-0.92578125,-0.24023438,1.0234375,-1.2421875,-0.6796875,-1.3203125,-0.890625,-0.123535156,0.6171875,0.375,-0.044921875,-1.03125,0.049072266,-1.8125,-0.50390625,-1.2421875,-0.4140625,1.1796875,-0.59765625,-0.765625,-1.0234375,-0.41796875,-1.125,-1.2578125,0.98046875,0.46679688,-1.34375,-1.03125,-1.6875,0.92578125,0.6328125,-0.53515625,1.296875,1.5390625,0.55859375,1.703125,0.578125,0.27929688,0.578125,-0.29296875,1.234375,-0.3046875,-1.46875,2.5,1.3828125,-0.36523438,-1.3125,2.171875,-2.109375,-0.3671875,0.29296875,0.15625,-1.1015625,0.30078125,-0.10986328,-1.171875,-0.328125,0.96875,-1.1875 -5,0,7,1.84375,0.55078125,0.58984375,1.203125,-0.5546875,1.4375,-0.88671875,0.75,2.875,-1.4375,0.48632812,1.21875,-1.21875,-0.33398438,-0.44140625,-1.140625,-1.234375,-1.2578125,-0.36132812,0.14746094,1.6484375,0.55078125,1.8203125,-0.27148438,-0.40429688,-0.828125,-0.51953125,-0.82421875,-0.78125,1.8203125,-1.03125,0.1875,1.4921875,-1.125,-0.49804688,-0.19726562,-0.953125,1.0078125,-0.72265625,1.265625,-0.25585938,-0.51171875,-1.71875,-0.61328125,0.08154297,-0.09765625,0.09716797,-0.4765625,-0.92578125,-0.20019531,-0.05493164,0.73046875,-2.25,-0.20507812,1.7265625,2.625,0.24902344,-0.46289062,0.31835938,-0.7734375,1.5703125,0.2890625,-0.40429688,-0.83203125,-0.578125,-0.88671875,0.51953125,-1.8046875,0.953125,-0.41796875,-0.49023438,0.8984375,-0.07324219,-0.15332031,0.51953125,-0.5703125,-0.17675781,0.3828125,-0.9765625,2.453125,0.43945312,-0.12597656,-0.13476562,-0.9453125,0.24511719,-0.65234375,0.096191406,-1.9609375,-0.546875,-0.095214844,-0.97265625,-0.34570312,-1.2734375,-0.29492188,-0.08251953,-0.63671875,0.19238281,-0.98828125,-0.8359375,-0.34960938,-1.890625,0.47851562,0.76171875,-1.546875,0.90625,0.21777344,1.4921875,-0.092285156,-0.33398438,0.5234375,0.77734375,0.7734375,-1.3671875,-0.94921875,1.8515625,0.39648438,-0.53125,0.3671875,1.2421875,-2.203125,-1.4765625,1.8125,-0.00079345703,-0.8125,-0.35351562,-1.6484375,0.00579834,-0.3203125,0.37695312,1.859375,-1.8203125,0.36328125,0.390625,0.025146484,-0.43554688,1.171875,1.203125,-0.43554688,-0.31054688,-0.73046875,1.4765625,-0.546875,-0.13574219,1.8984375,-0.48242188,-0.115234375,-0.51953125,-0.18847656,-0.44335938,0.37695312,0.038085938,1.4453125,-1.234375,0.96875,-1.6015625,-0.44921875,-0.42382812,0.9296875,0.096191406,-0.026977539,-1.5390625,0.3671875,-0.609375,-1.15625,-0.022338867,0.36523438,0.36523438,-0.70703125,-1.609375,-1.921875,0.77734375,0.3984375,0.5,0.6796875,1.484375,-0.24902344,-0.55859375,1.6171875,0.8203125,-0.8828125,0.53125,1.3046875,1.5546875,0.125,0.38085938,2.078125,0.15429688,-1.03125,-0.65234375,-1.1015625,0.546875,2.421875,0.39257812,1.546875,1.109375,-0.17089844,-0.48632812,0.1171875,-0.40234375,0.52734375 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-5-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-5-embeddings.csv deleted file mode 100644 index a656e4e9..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-5-embeddings.csv +++ /dev/null @@ -1,7 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -6,0,5,-0.578125,0.38867188,-0.64453125,0.453125,0.37304688,0.51171875,-0.83984375,0.08105469,1.546875,-1.265625,1.140625,-0.53125,-0.546875,0.41992188,0.13183594,0.2421875,0.15722656,1.9375,1.2578125,0.5,0.828125,0.18261719,0.78125,0.93359375,1.359375,-0.66015625,0.46289062,0.85546875,0.45507812,0.100097656,-0.8515625,0.8046875,-0.5546875,-1.3125,0.11669922,-0.92578125,0.0546875,-0.53125,-1.5859375,0.44921875,-0.26953125,-1.484375,0.20507812,-0.74609375,0.36914062,-0.28320312,0.30078125,-0.65625,-0.71484375,-1.40625,2.0625,0.35742188,-0.90234375,-0.10595703,-1.0078125,2.1875,-1.2890625,-0.8515625,1.375,1.25,1.2890625,0.35351562,0.4453125,-0.44140625,0.85546875,-0.03100586,0.69140625,-0.047607422,-0.54296875,-2.59375,-2.09375,0.14453125,-0.30664062,-0.59375,0.25,-0.96484375,0.23144531,-0.71875,-1.515625,1.0,-0.24511719,2.25,-0.12402344,-1.640625,0.13964844,0.31835938,-1.546875,-1.28125,0.50390625,1.46875,0.84765625,1.234375,0.328125,-0.47070312,-0.82421875,-0.10546875,0.53125,-1.265625,-1.2890625,1.546875,-0.079589844,-0.41992188,-0.19433594,0.1328125,-0.9765625,1.1640625,1.2890625,-1.0546875,-0.44335938,-0.55078125,0.08300781,0.83203125,-1.2890625,-2.328125,0.5859375,-0.072265625,-1.671875,0.75390625,-0.05078125,-0.78125,-0.81640625,0.10253906,-1.1640625,0.73046875,-0.111328125,-0.9453125,-0.49804688,0.6796875,0.34765625,1.7578125,-0.87109375,-0.025512695,1.296875,0.54296875,0.734375,-2.046875,1.265625,-0.296875,-0.86328125,-0.02722168,2.390625,-0.25195312,0.55859375,1.40625,-0.25390625,-0.49414062,-1.9921875,-1.09375,-0.30859375,0.08691406,0.09375,-0.40429688,-0.29101562,0.2265625,-1.109375,1.296875,0.609375,-0.08935547,1.0,-1.9375,-1.9609375,-0.87890625,-1.3203125,-1.1640625,-0.45117188,-0.64453125,-0.671875,0.42382812,-1.6484375,-0.80859375,-0.061767578,0.92578125,1.4296875,1.078125,0.72265625,0.59375,1.6640625,-0.43164062,1.7109375,1.8671875,1.9609375,1.8828125,-1.015625,-1.71875,1.75,0.9453125,-0.001739502,-0.061035156,0.43945312,-1.3046875,0.7265625,-0.71484375,-0.13378906,1.9140625,0.43359375,0.3515625,0.53515625,-0.27539062,0.53125,-0.64453125 -6,0,6,0.51171875,0.107421875,-0.6796875,1.734375,-1.15625,1.6015625,-1.671875,0.1953125,2.953125,-1.34375,-0.010925293,-0.42773438,-1.6171875,-0.22851562,-0.421875,-0.35351562,0.26367188,0.9296875,0.095214844,-0.64453125,1.890625,1.1484375,0.17578125,-0.234375,0.8515625,-0.75390625,-1.46875,-0.66015625,-0.94140625,0.84375,-2.453125,0.58984375,-1.203125,-1.515625,-0.5625,-0.83203125,0.41015625,-0.546875,0.045898438,1.125,0.36523438,-0.15136719,0.4453125,-0.67578125,0.4296875,-0.13378906,-0.22167969,-0.00016403198,0.20117188,-0.80859375,0.90234375,1.7890625,-0.41210938,0.62109375,1.015625,2.125,0.47265625,-0.9765625,0.84765625,-0.06640625,1.9921875,0.013793945,1.2109375,0.11767578,-0.6484375,0.064941406,-0.2734375,-0.87109375,-0.24902344,-0.34765625,-0.39648438,1.5078125,-0.58203125,0.85546875,0.19921875,-1.6875,0.6015625,0.6640625,-1.4765625,0.828125,-0.15332031,2.234375,0.37695312,-0.3515625,0.34765625,0.13671875,-2.234375,-0.35742188,-0.97265625,1.2890625,1.6328125,-0.14257812,-1.875,-0.7578125,0.55078125,-0.640625,0.47070312,-1.234375,-0.08544922,0.59765625,0.578125,-0.27734375,0.41015625,-0.26171875,-0.44140625,0.123046875,0.890625,-0.859375,-0.73828125,2.453125,1.3984375,1.9453125,-0.42773438,-1.734375,-0.28320312,0.80859375,0.017578125,0.61328125,-0.546875,-1.5859375,-1.6015625,1.09375,-0.057861328,0.46289062,-0.23242188,-0.5078125,0.05078125,0.171875,0.8984375,1.0859375,-1.3984375,0.6484375,1.328125,0.31640625,-0.52734375,-0.6328125,1.0078125,0.5390625,-1.109375,-1.15625,0.55859375,0.70703125,-0.079589844,1.3515625,-1.6796875,-1.5703125,-1.3046875,-0.390625,-1.375,-0.09814453,-0.28710938,-0.14941406,-1.4921875,-0.31054688,-0.43164062,-0.9609375,-0.30664062,1.6328125,0.3125,-0.41601562,-0.42773438,0.35351562,0.13183594,-1.609375,-0.703125,1.84375,0.46679688,-0.54296875,-1.1796875,-1.640625,0.62109375,0.6640625,0.80078125,0.79296875,1.8515625,1.2421875,-0.14746094,-0.51953125,-0.33398438,0.890625,2.84375,0.53125,-1.1875,-1.59375,-0.016479492,0.03930664,0.45898438,-0.97265625,0.52734375,-0.19335938,-0.7421875,0.69921875,-0.921875,1.3046875,0.119628906,0.37109375,-1.484375,0.6484375,-1.6953125,0.609375 -6,0,7,1.3515625,-1.140625,1.8984375,0.6640625,-0.7578125,0.32226562,-0.9375,-0.578125,1.78125,-1.8203125,-1.1484375,0.059570312,-1.5703125,-1.0390625,-1.7421875,-0.796875,-1.0546875,-0.98828125,0.92578125,-0.28515625,1.625,-0.12207031,0.56640625,-0.25390625,-1.59375,0.5703125,0.82421875,-0.61328125,-0.6484375,0.68359375,-0.85546875,0.8515625,-1.1171875,-2.203125,-0.044189453,-0.49023438,-1.8359375,2.3125,-0.20410156,1.15625,0.9609375,-0.09326172,-1.2734375,0.4140625,0.88671875,-0.087402344,-1.2265625,0.765625,-1.5546875,-1.65625,-1.7578125,1.59375,-1.5703125,1.578125,1.5390625,1.0078125,-1.375,0.47460938,0.04663086,0.17871094,0.14160156,-0.36914062,1.4453125,-1.359375,-0.5,0.703125,-0.15136719,-0.38476562,1.5390625,1.3671875,0.359375,-0.46289062,0.0025634766,0.32421875,0.31445312,1.6953125,0.63671875,0.32226562,-0.5625,1.2578125,0.8359375,1.0703125,-0.14746094,-0.32617188,1.2421875,-0.91796875,0.73046875,-1.1640625,-0.87890625,-0.72265625,-0.82421875,-0.62890625,-0.9921875,-1.28125,0.52734375,-0.20019531,0.58203125,-0.13085938,0.7890625,-0.0028839111,-2.703125,0.66015625,0.05444336,1.3515625,1.59375,-0.17871094,1.078125,0.44140625,-0.70703125,-0.609375,1.0234375,0.16210938,1.5,-1.140625,1.2578125,0.45898438,0.3203125,-0.640625,-0.26953125,-2.625,0.21582031,0.67578125,0.27734375,0.65234375,-0.77734375,0.76953125,0.453125,1.3046875,1.75,-0.20507812,-1.28125,-0.96875,0.953125,0.671875,-0.26953125,0.6484375,0.44335938,0.05859375,-1.046875,-0.34570312,0.90234375,-0.13671875,-0.16894531,1.2734375,-0.8203125,-1.2734375,1.0546875,0.027709961,-1.671875,-0.140625,0.31445312,-0.45898438,-0.6015625,1.46875,-0.66015625,-1.109375,-0.11376953,1.390625,0.296875,0.0016860962,0.39648438,0.106933594,-0.796875,-0.796875,-0.05419922,0.41992188,1.5625,1.1640625,-2.09375,0.15625,-0.20996094,1.6171875,0.89453125,1.4921875,0.734375,-0.30664062,-0.115234375,1.0078125,0.54296875,0.5859375,-0.83203125,0.22949219,-0.375,-1.3046875,-0.15234375,-0.07324219,0.1484375,-0.38476562,-1.7421875,0.21289062,-0.18066406,1.5859375,-0.56640625,-1.2734375,0.47851562,1.515625,-1.15625,0.76953125,-1.078125,-1.328125 -7,0,5,2.015625,-1.09375,0.07714844,0.09716797,1.4140625,-0.8671875,-1.234375,-0.36328125,2.03125,-0.080566406,0.23632812,-0.48242188,-2.40625,-0.97265625,0.8984375,0.25390625,-0.2734375,0.34375,-0.07373047,0.14941406,2.28125,-0.1484375,1.6171875,0.96875,-0.91015625,0.16601562,-0.90625,-0.75390625,-0.203125,0.76953125,-1.125,0.609375,0.87109375,0.12158203,-0.118652344,0.20996094,0.69921875,0.8984375,-0.84375,-0.93359375,0.4296875,-0.15332031,0.37109375,-0.33398438,1.2734375,-1.46875,1.265625,-0.24121094,-0.921875,-0.9375,1.984375,0.7890625,-0.8515625,-0.96875,-0.625,0.58203125,-0.578125,-0.4296875,-0.41992188,0.515625,-0.6015625,-1.171875,0.33007812,-1.59375,1.4375,1.1328125,-0.31835938,-0.33007812,0.421875,-2.40625,1.1953125,1.2578125,-0.0703125,-0.02746582,-0.46484375,-0.6875,-1.578125,-0.58203125,-0.27734375,2.328125,0.8125,1.5859375,-0.032958984,-0.53515625,-0.09716797,-0.91796875,-0.734375,-0.7265625,-0.43554688,1.9609375,-1.140625,0.5234375,-0.13769531,-0.40429688,0.032714844,0.22265625,1.171875,-1.8984375,0.33984375,0.037597656,-0.421875,-0.625,-0.2265625,0.42773438,-1.453125,1.9140625,0.58984375,-0.51953125,0.36523438,-0.9296875,0.29101562,1.0859375,-0.48632812,-1.6484375,-0.23925781,-0.23144531,-1.359375,-0.13769531,0.29882812,-0.33007812,-0.87890625,-0.265625,1.328125,0.27734375,-0.14355469,-0.19628906,-0.7578125,0.032226562,0.375,1.0859375,0.390625,-0.96875,0.49609375,1.0625,-1.3515625,-1.0390625,1.2578125,0.96875,-0.07080078,0.8125,1.8828125,0.73046875,1.1953125,0.921875,-2.609375,-0.3359375,-2.90625,1.046875,2.0625,0.77734375,1.2265625,-0.51171875,-0.8203125,-0.5078125,-1.0,-1.3984375,-0.22070312,1.7734375,0.4140625,-0.515625,-2.046875,0.007171631,-0.984375,-1.546875,-1.828125,1.1640625,0.32617188,-0.09814453,-1.5,-0.45507812,0.69921875,0.33007812,-0.06640625,0.96875,0.06933594,-1.4453125,-0.51171875,0.65234375,1.2890625,1.7109375,1.1953125,0.7578125,-1.78125,-1.21875,1.390625,0.6328125,-0.25390625,-0.18652344,0.029052734,0.5078125,0.81640625,-0.77734375,-0.17578125,0.47070312,1.125,0.3203125,1.4765625,-0.4296875,0.15722656,-0.72265625 -7,0,6,0.0703125,-0.5078125,-0.34960938,0.5234375,0.58984375,-0.067871094,-1.5,0.4921875,1.109375,0.8515625,0.6796875,-0.5390625,-1.484375,-0.92578125,0.703125,-0.30273438,-0.008605957,-0.03540039,0.83984375,0.17871094,1.3828125,-0.013366699,0.6015625,1.1953125,1.171875,-0.109375,-0.9375,-0.578125,1.078125,1.578125,-1.0234375,-1.2421875,1.171875,-1.140625,-0.020385742,-1.09375,-0.76953125,1.1875,-1.421875,0.94140625,-0.075683594,-1.296875,-0.34960938,1.0234375,1.15625,-1.234375,1.65625,0.8671875,-0.93359375,-0.0046691895,0.9453125,0.99609375,-0.1484375,0.019165039,-0.421875,0.88671875,-0.4921875,-0.115234375,0.3984375,0.39648438,-0.765625,0.21972656,0.15917969,-0.78125,0.90234375,-0.859375,0.20019531,-0.8984375,0.6015625,-1.5625,1.1171875,-0.484375,-0.11425781,-0.65234375,0.69140625,-1.015625,-0.5078125,-0.15429688,-2.734375,0.94140625,0.08984375,1.9765625,0.90625,-0.89453125,-1.0078125,0.70703125,-2.140625,-1.7578125,-0.12988281,0.82421875,0.203125,1.7265625,0.98828125,-1.734375,-1.2421875,-0.8046875,0.44921875,-2.59375,0.3359375,1.7109375,0.40234375,-1.171875,-0.28320312,1.6875,-0.07519531,1.5234375,0.41015625,0.20703125,-1.0859375,-0.012207031,-0.328125,0.734375,0.12597656,-0.58203125,0.33007812,0.29101562,-1.0859375,-1.0546875,0.33789062,0.87890625,0.007873535,0.890625,-0.4375,-0.49023438,-1.8828125,-0.19921875,-0.25390625,0.056152344,-0.984375,1.15625,0.58984375,-1.8203125,0.04296875,-0.3359375,-0.26367188,-0.98828125,1.5234375,-0.57421875,-0.80859375,0.5078125,1.4140625,0.021484375,-0.036376953,0.953125,-1.2578125,-0.36523438,-2.0,-0.14160156,0.063964844,1.0,-0.703125,-1.4609375,-0.84765625,0.44335938,-1.265625,-1.96875,0.080078125,0.67578125,-0.015991211,0.14648438,-1.03125,0.32617188,-0.9296875,-0.71875,-2.390625,2.5,-1.3125,0.984375,0.6796875,1.4375,1.1328125,2.53125,1.4375,1.5625,0.5546875,-0.36132812,-0.578125,0.85546875,-0.06689453,0.8984375,2.515625,0.640625,-1.2734375,-1.34375,-0.16015625,1.21875,0.07470703,-1.1015625,1.0078125,-0.94921875,1.1796875,0.55078125,-0.028808594,0.76953125,-0.53125,0.36914062,0.86328125,-0.67578125,0.83984375,-0.72265625 -7,0,7,0.3046875,-0.51953125,0.060546875,1.0703125,0.26757812,1.125,0.16992188,-1.1484375,0.076171875,-2.203125,0.71484375,-1.765625,-1.3515625,0.6640625,-1.1171875,-0.81640625,2.03125,0.12597656,2.359375,-0.83984375,1.71875,-1.109375,-0.7578125,-0.075683594,1.625,-0.6875,-0.25195312,-0.1640625,-1.5,0.59765625,-0.88671875,1.65625,-0.65625,-1.046875,-0.25585938,-1.21875,0.26367188,-0.22460938,-0.19433594,-0.8984375,0.91015625,0.40429688,0.5078125,-0.36914062,0.18164062,0.110839844,-0.6484375,1.703125,-0.890625,-1.71875,0.65234375,0.69921875,-0.53515625,0.16894531,0.8203125,1.21875,-2.984375,-0.36914062,0.45117188,0.99609375,-0.85546875,0.5546875,0.9765625,-0.546875,0.40234375,1.1171875,1.46875,-0.5,-0.028442383,0.07470703,0.75,-0.33398438,0.6953125,1.3359375,0.022705078,0.68359375,2.25,0.099609375,-1.1328125,0.54296875,-0.24511719,1.5078125,0.203125,-1.0625,-1.03125,0.23925781,-1.8203125,-0.12792969,0.37695312,-0.12158203,-0.828125,-0.76953125,1.921875,0.16699219,-0.5546875,0.70703125,0.25585938,-0.1640625,-1.90625,-0.35546875,0.671875,-0.091796875,1.5,-0.080078125,0.0065307617,-0.9453125,-0.359375,-0.4296875,-0.07080078,-1.015625,0.640625,0.20898438,-0.64453125,0.4375,0.90234375,-0.076660156,-0.53125,-0.671875,-0.15429688,-0.042236328,0.46484375,-0.734375,0.032470703,1.171875,0.99609375,-1.140625,0.90234375,1.6796875,0.890625,-0.088378906,-0.22851562,-0.17578125,-0.19042969,-0.2109375,-0.83984375,-1.5390625,-0.11376953,-1.1328125,-0.7734375,-0.32226562,1.9140625,-0.94140625,-0.028686523,-1.0078125,-0.93359375,-1.8046875,-0.62890625,-1.4140625,-1.4453125,-0.32421875,0.06347656,-0.7578125,-0.6171875,0.15722656,-0.06201172,-1.2734375,-1.609375,1.265625,2.453125,-1.046875,0.7578125,0.17773438,0.11621094,-0.7734375,0.028686523,-0.22265625,0.3984375,-1.5625,-1.3828125,0.21484375,0.25390625,2.140625,1.03125,2.09375,-0.46289062,2.546875,1.2734375,-1.0625,1.2421875,1.2109375,2.1875,2.078125,-1.9921875,-0.32421875,0.20117188,0.7578125,-0.80859375,-1.234375,0.703125,-0.71484375,0.47460938,-0.19726562,0.95703125,-0.24609375,0.89453125,-0.43164062,-0.001914978,0.5390625,-0.0016326904,-1.2109375 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-6-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-6-embeddings.csv deleted file mode 100644 index d4afd773..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-6-embeddings.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -8,0,5,0.6484375,-1.109375,-1.046875,0.515625,0.6015625,0.3203125,-1.4609375,1.8203125,1.2421875,0.6640625,0.265625,-0.5390625,-1.53125,-0.049560547,-0.8828125,0.06225586,0.59765625,-0.43164062,1.046875,0.7421875,0.91015625,-0.40820312,1.0234375,1.2421875,0.85546875,-1.4921875,-0.34375,-0.010437012,0.48046875,1.9453125,-1.1875,-1.46875,1.3671875,-0.42773438,0.30664062,0.57421875,-0.44726562,0.55859375,0.14941406,-0.18066406,-0.828125,-0.17089844,-0.5078125,0.75,0.64453125,-0.92578125,1.40625,-0.546875,-0.984375,-1.7265625,0.953125,0.71484375,-0.91015625,-1.046875,-0.43164062,1.046875,0.66796875,-0.35546875,0.59765625,1.0703125,-0.87890625,0.390625,1.359375,-0.48632812,0.1484375,-0.74609375,1.171875,-0.36523438,0.47070312,-1.0078125,0.62109375,1.2109375,1.0078125,0.17480469,0.19433594,-1.0546875,-0.66796875,0.4453125,-1.90625,0.42382812,0.51171875,1.4296875,0.06933594,-0.14160156,-0.66015625,0.36328125,-1.859375,-1.6875,0.14746094,0.015136719,-0.18945312,1.390625,0.19628906,-0.73828125,0.007385254,-1.1796875,1.4921875,-3.28125,-0.38476562,2.265625,0.1484375,-0.95703125,0.72265625,1.578125,-0.7109375,1.6171875,0.044677734,0.80859375,-0.41015625,0.47265625,0.91015625,1.625,-0.76953125,-1.4921875,0.62109375,-0.9296875,-0.57421875,-0.41796875,0.03955078,0.97265625,-0.22363281,0.44726562,-0.71875,0.98046875,-0.6171875,-0.609375,0.13183594,-0.26757812,-1.0078125,1.9140625,0.58203125,-2.53125,0.14160156,0.453125,-0.78515625,0.23828125,2.046875,-1.890625,-0.84765625,0.88671875,0.7421875,0.93359375,1.0703125,0.5546875,-2.734375,0.16992188,-2.53125,-0.115722656,0.08984375,0.80078125,-0.47265625,-1.2578125,-1.65625,-0.26757812,-0.4921875,-0.71875,0.90234375,-0.16015625,1.078125,0.00089263916,-1.2421875,-1.7734375,-0.3359375,-1.8203125,-2.65625,1.1171875,-0.69140625,-0.3984375,-0.12792969,1.078125,1.3359375,1.2578125,0.66015625,1.5,0.31445312,-0.55078125,0.84375,-0.19042969,-0.37695312,0.99609375,0.27929688,1.109375,-0.54296875,-1.7109375,-0.46484375,0.96484375,-0.11279297,-0.41210938,0.01361084,0.05908203,1.578125,-0.02758789,-0.19042969,0.57421875,1.2578125,-0.30078125,0.38476562,-0.75390625,-0.8671875,0.055419922 -8,0,6,-1.03125,-0.16796875,-0.26757812,-0.25585938,1.21875,0.37695312,0.5078125,0.85546875,0.2578125,-1.6796875,-0.23828125,-1.640625,-1.875,-0.28320312,-0.72265625,-0.33984375,1.1484375,-0.72265625,1.2421875,0.025146484,0.72265625,0.19335938,0.40820312,0.9296875,-0.578125,-0.44726562,-1.109375,0.75,-0.087890625,1.390625,0.063964844,-0.58984375,-0.12988281,-2.1875,-0.0004119873,0.22070312,-0.05419922,0.34960938,-0.40820312,0.40039062,0.87890625,0.17871094,-1.21875,0.7109375,0.65234375,0.34960938,0.16210938,0.6171875,-0.41210938,-2.3125,0.08984375,0.64453125,-1.265625,0.20410156,1.3828125,1.1953125,-0.5625,0.5,0.008605957,0.85546875,-1.6328125,-0.453125,1.1015625,0.012939453,0.10205078,0.5625,2.078125,-0.96484375,1.671875,-0.3515625,-0.08935547,-0.90234375,0.049560547,0.40234375,-0.6484375,0.4296875,0.671875,0.921875,-1.2734375,-0.296875,-0.19433594,1.75,-0.5078125,-0.5703125,1.1171875,-1.0078125,-0.39648438,-2.09375,-0.0023651123,-0.14355469,-1.0625,-0.59375,1.0,-0.796875,-0.87109375,0.53125,0.8203125,-2.546875,-1.5625,0.37890625,-0.12597656,-1.1875,-0.765625,-0.110839844,1.28125,0.93359375,1.09375,-0.3203125,-2.765625,-0.7578125,1.8515625,0.765625,1.25,0.060302734,2.015625,0.875,0.31445312,0.984375,1.296875,0.6875,0.82421875,0.27929688,-0.5078125,0.49414062,0.78125,0.55859375,-0.14746094,-0.87109375,0.6015625,1.0078125,-1.484375,-1.015625,0.42578125,0.66796875,-0.15429688,-1.1953125,0.032470703,-1.875,-0.6328125,0.38867188,0.004699707,0.045166016,0.51953125,0.40234375,-1.28125,-1.078125,-0.4765625,1.6328125,-0.7265625,0.49609375,-0.18652344,-1.5625,-0.29101562,0.55078125,0.035888672,-0.41796875,1.4921875,0.8828125,-0.20507812,0.453125,-1.21875,-0.9375,-1.5234375,-0.73046875,0.25976562,0.5,-0.66796875,-0.40234375,-3.71875,2.515625,0.43359375,1.0,1.9453125,1.1328125,1.3828125,0.056640625,0.90625,-0.13183594,0.96875,1.28125,1.984375,0.75390625,-2.359375,-1.0390625,-0.4296875,1.0234375,0.5625,-1.1484375,0.10839844,-1.171875,-0.80078125,-1.015625,0.07373047,1.84375,-0.030883789,-0.27539062,0.19628906,-1.203125,0.35742188,0.12109375 -8,0,7,1.34375,-1.4296875,-0.57421875,1.3046875,-0.796875,0.16308594,1.0,-0.24804688,3.359375,0.55859375,1.046875,-0.46875,-1.6953125,0.09863281,1.1484375,-1.8125,1.7578125,-1.078125,-1.3359375,-0.12695312,1.3515625,1.03125,0.78515625,-0.58984375,0.22363281,-0.20410156,0.12695312,-0.22070312,-0.13964844,1.7890625,-0.34960938,0.009216309,2.53125,-0.34375,1.109375,0.48046875,-0.390625,1.6875,0.046142578,0.045410156,-1.15625,0.6796875,-1.90625,-1.1875,-0.076171875,-0.33203125,1.0078125,0.030761719,-2.046875,-1.0078125,-0.76953125,0.13964844,-1.5,-0.69140625,1.15625,1.40625,0.5390625,-0.734375,-0.42382812,0.053955078,-0.22558594,0.064453125,0.59375,-0.4765625,0.19824219,-0.07080078,3.515625,-0.8671875,-0.008911133,-0.46875,-0.44140625,1.7109375,0.98828125,0.20117188,-0.6171875,-0.03955078,-0.61328125,0.9375,-1.9765625,2.84375,0.72265625,0.77734375,0.51953125,-0.52734375,-0.6328125,-1.4921875,0.4140625,-1.265625,-0.68359375,0.95703125,-0.24316406,0.110839844,0.28125,-0.53515625,0.671875,-0.2734375,1.1328125,-1.0390625,0.61328125,-0.640625,-1.46875,-0.84765625,0.7265625,-2.265625,0.049804688,-1.0625,0.40625,-1.3984375,-0.21777344,-0.71484375,1.15625,-0.33203125,-0.76171875,-1.2421875,1.0078125,-0.5546875,0.875,0.6484375,0.013244629,-1.0234375,-1.328125,-0.19726562,0.97265625,0.66015625,-1.3203125,-0.81640625,-0.31054688,-1.21875,-0.53125,1.3125,-0.53125,-0.18554688,0.04321289,1.015625,-0.80078125,0.34765625,1.046875,-0.0234375,-0.71484375,0.98828125,2.8125,0.50390625,0.23632812,0.11767578,-1.25,-0.44140625,-0.97265625,0.546875,0.83984375,0.3828125,1.2265625,0.859375,-0.65234375,0.10498047,-0.15332031,-0.1640625,-0.17773438,0.7421875,-0.14746094,-0.16210938,-0.25976562,0.55078125,-0.15625,-1.3359375,-1.375,1.5859375,-0.6796875,-0.671875,-2.265625,-0.765625,0.31054688,-0.23046875,-1.1328125,-0.057128906,-0.43359375,0.3515625,0.40039062,0.8671875,0.80859375,-0.095703125,0.103027344,1.375,0.33398438,-0.65234375,0.71484375,0.88671875,-0.24121094,-1.8125,-1.4765625,-1.0859375,1.0078125,0.47851562,0.86328125,1.4765625,1.0078125,-0.36328125,-0.390625,-0.296875,-1.609375,0.049560547 diff --git a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-7-embeddings.csv b/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-7-embeddings.csv deleted file mode 100644 index d999f205..00000000 --- a/tests/resources/target_outputs/embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-embeddings/sequifier-model-categorical-3-inf-size-best-embedding-3-7-embeddings.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,subsequenceId,itemPosition,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 -9,0,5,0.21875,0.12402344,0.19824219,-0.34765625,0.9453125,-0.2890625,-2.46875,-0.33203125,1.125,-1.0546875,-0.1171875,-1.78125,-0.98046875,-1.171875,0.94921875,1.578125,0.60546875,1.2421875,0.12207031,-1.046875,2.109375,-0.578125,-1.21875,1.59375,0.32226562,0.56640625,-0.39648438,1.0859375,-0.52734375,-0.47460938,-1.4921875,-0.10058594,0.33007812,0.19140625,-1.3671875,-0.107421875,1.046875,-0.86328125,-0.96484375,-0.5546875,-0.10986328,-0.421875,0.828125,0.061523438,0.5390625,0.14355469,0.22363281,-0.5234375,-0.4296875,-0.765625,2.703125,0.24316406,-0.13476562,1.9609375,-0.484375,0.91015625,-0.14355469,-0.31835938,-1.390625,-0.5625,0.50390625,-0.34960938,-1.296875,-0.9296875,0.48828125,0.21191406,-0.53125,-1.3125,0.15429688,0.33398438,-0.33398438,0.38867188,-0.5859375,-0.032958984,-1.5078125,-1.4765625,0.6015625,-1.296875,0.3671875,0.70703125,1.2421875,1.0859375,-0.42382812,-1.140625,0.21972656,-0.103027344,-1.1328125,-0.5234375,-0.69140625,0.578125,0.640625,0.84375,-1.0234375,0.68359375,-0.28320312,0.0015869141,1.3125,-0.41992188,-0.84765625,0.123046875,0.51171875,0.05493164,-1.515625,1.3359375,-1.9375,1.40625,-0.44921875,1.4375,0.52734375,0.796875,1.21875,0.42578125,-2.109375,0.62109375,0.55859375,0.66796875,-2.046875,-0.80859375,0.3828125,-0.71484375,-2.28125,2.328125,0.22851562,0.91015625,-0.15234375,0.049560547,0.18457031,0.24902344,-0.118652344,1.1328125,-0.048095703,0.50390625,0.13574219,-0.53515625,-0.40429688,0.28320312,2.375,0.8125,0.06738281,-0.22070312,0.20019531,-0.46289062,1.484375,-0.00014972687,-0.28710938,-1.3984375,-1.3046875,-0.99609375,0.83203125,-0.12597656,0.59765625,-2.84375,0.953125,-0.9453125,0.95703125,-1.25,-0.28515625,-0.390625,1.0078125,0.18847656,-0.37695312,0.16308594,-0.20410156,-0.96484375,-0.06689453,1.7734375,1.1640625,0.49609375,0.29296875,-1.5234375,0.7265625,0.6171875,1.7890625,0.0002937317,-0.953125,0.69140625,0.99609375,-0.453125,2.171875,2.234375,1.890625,-0.30078125,-2.078125,-1.234375,0.10839844,-0.096191406,1.3046875,-1.0078125,-0.40429688,-0.453125,0.41210938,-1.203125,0.47070312,1.734375,-1.9921875,-0.83203125,-1.078125,0.421875,1.234375,-0.03149414 -9,0,6,0.021850586,1.2890625,-0.671875,1.25,-2.15625,1.1953125,-2.15625,0.33007812,3.390625,-1.0390625,0.4609375,0.034423828,-0.92578125,-0.23925781,0.3671875,-0.078125,-0.004180908,1.265625,-1.5546875,-0.26757812,1.5703125,1.3671875,1.5625,-0.85546875,0.765625,-1.765625,-0.9765625,-0.87109375,0.38085938,-0.14355469,-1.734375,0.35351562,-0.88671875,-0.546875,-0.69921875,-0.23339844,0.15625,-0.6484375,-0.5703125,0.55078125,-0.64453125,0.16015625,-0.060058594,-1.671875,2.265625,-0.9609375,0.33398438,-0.33789062,-0.38671875,-0.12402344,0.46679688,1.65625,-0.49804688,-0.640625,1.234375,1.2421875,1.3046875,0.1953125,-0.03466797,-0.41796875,1.8359375,-0.14941406,1.28125,0.625,-0.22265625,-0.5625,1.6484375,-0.29101562,-0.8203125,-1.1328125,-1.0078125,1.8203125,-0.18457031,0.8203125,0.28320312,-1.828125,-0.53515625,0.17773438,-1.25,1.6015625,0.703125,1.078125,0.1015625,-0.39453125,0.37890625,0.90234375,-0.66796875,-0.98046875,-0.77734375,1.0703125,0.18066406,0.55078125,-1.4921875,0.052734375,0.15527344,-1.265625,0.45507812,0.25585938,0.00030136108,1.6640625,-0.44335938,-0.21679688,0.22070312,-1.0,0.20605469,0.484375,0.87109375,0.095703125,-0.37695312,0.39453125,1.359375,0.18164062,-1.6953125,-2.015625,0.078125,-0.26953125,-0.52734375,-0.86328125,0.50390625,-1.671875,-1.15625,0.49609375,0.32617188,0.671875,-0.7890625,0.123535156,0.62109375,-0.96875,-0.5078125,1.453125,-0.85546875,-0.028320312,1.7265625,1.6875,0.15527344,-0.45507812,0.09814453,-0.14648438,-0.76953125,-1.1015625,-0.20996094,-0.25,-0.14257812,0.57421875,-0.8046875,-1.0234375,-1.640625,-0.029296875,-0.49414062,0.38867188,-0.11425781,-0.51953125,-0.3359375,0.640625,-0.9921875,-0.5859375,-0.5234375,2.046875,-0.37304688,-0.86328125,-0.265625,0.18359375,0.25,-1.4296875,-0.12207031,3.171875,-0.053955078,0.60546875,-1.609375,-0.7578125,0.83984375,1.25,0.23046875,1.140625,1.03125,0.91015625,0.265625,1.3359375,-0.88671875,0.85546875,-0.12890625,0.011962891,1.1171875,-1.78125,0.42773438,1.125,-0.87109375,-0.57421875,-0.49609375,-0.55078125,-1.2890625,0.002532959,0.2890625,0.86328125,1.3984375,1.453125,-2.515625,1.25,-1.9453125,0.12792969 -9,0,7,-0.58984375,2.0,0.61328125,1.984375,1.2421875,0.34179688,-1.3671875,-0.65234375,1.5625,-0.8671875,0.5625,0.28515625,-1.09375,-0.29492188,-0.26367188,0.099121094,0.11767578,0.38085938,-0.703125,0.51171875,0.84375,0.65234375,0.17675781,-0.34765625,2.34375,0.24023438,-2.0625,1.046875,2.3125,0.62890625,-1.5390625,0.13964844,1.703125,-0.24804688,-1.1875,0.53125,-0.49023438,-0.109375,-0.44726562,0.24121094,-1.5078125,-0.54296875,0.33203125,-1.96875,1.5546875,-0.15136719,1.015625,-0.328125,-0.69921875,1.46875,0.076171875,1.0234375,-0.43945312,-0.22265625,-0.90625,2.515625,-0.5,-0.033447266,0.7578125,0.103515625,0.9375,0.14746094,-0.40429688,-0.82421875,-0.16503906,0.11621094,2.3125,-0.2578125,-0.38476562,-0.80859375,-1.90625,0.65625,0.16503906,-1.0,0.41210938,-1.2421875,1.21875,-0.73046875,-1.8671875,1.6328125,1.1640625,1.734375,0.025512695,-0.012268066,0.36914062,1.0078125,-1.25,-0.7734375,0.25195312,-0.15527344,1.2421875,2.703125,0.51171875,-1.171875,-1.75,-2.390625,-1.1484375,-1.1171875,-0.25,0.87890625,1.2265625,0.3046875,-0.828125,0.71875,-0.40039062,0.79296875,0.73046875,-0.23535156,-0.7421875,-0.7734375,0.828125,0.46484375,-1.90625,-0.6484375,0.48632812,1.328125,-1.3046875,0.421875,-0.47070312,0.08300781,-0.83203125,0.70703125,-0.35351562,0.5234375,-1.4375,-1.8671875,0.032470703,-0.921875,0.041503906,1.125,0.06347656,0.66015625,1.171875,0.6953125,0.87890625,-2.0625,0.8671875,-1.3515625,-0.95703125,-0.9296875,0.16894531,-0.703125,0.38476562,0.87890625,-0.7265625,0.44140625,-0.08300781,0.20410156,-1.6171875,1.140625,-0.6796875,-0.65625,1.25,0.8828125,-2.296875,-0.421875,-1.4765625,0.099609375,0.88671875,-0.046875,-0.6171875,-0.03491211,0.47460938,-1.1640625,-1.375,0.98046875,-0.25976562,0.58984375,-1.578125,-1.3203125,0.15722656,1.09375,0.98828125,-0.036376953,-0.34570312,-0.7265625,-0.014892578,1.6328125,0.66015625,0.25,0.68359375,0.78515625,0.5234375,-0.059326172,1.0859375,-0.39453125,-0.21875,-0.53515625,-0.69921875,-1.1796875,-0.74609375,1.1484375,-0.13085938,0.734375,-0.5234375,0.75390625,-0.65625,-1.1015625,0.8125,-1.125 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-0-predictions.csv deleted file mode 100644 index 4c3b4b21..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-0-predictions.csv +++ /dev/null @@ -1,21 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,113 -0,9,113 -0,10,113 -0,11,113 -0,12,113 -0,13,113 -0,14,113 -0,15,113 -0,16,113 -0,17,113 -0,18,113 -0,19,113 -0,20,113 -0,21,113 -0,22,113 -0,23,113 -0,24,113 -0,25,113 -0,26,113 -0,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-1-predictions.csv deleted file mode 100644 index 645bdbe4..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-1-predictions.csv +++ /dev/null @@ -1,21 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,124 -1,9,124 -1,10,124 -1,11,124 -1,12,124 -1,13,124 -1,14,124 -1,15,124 -1,16,124 -1,17,124 -1,18,124 -1,19,124 -1,20,124 -1,21,124 -1,22,124 -1,23,124 -1,24,124 -1,25,124 -1,26,124 -1,27,124 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-2-predictions.csv deleted file mode 100644 index a040fdee..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-2-predictions.csv +++ /dev/null @@ -1,21 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,113 -2,9,113 -2,10,113 -2,11,113 -2,12,113 -2,13,113 -2,14,113 -2,15,113 -2,16,113 -2,17,113 -2,18,113 -2,19,113 -2,20,113 -2,21,113 -2,22,113 -2,23,113 -2,24,113 -2,25,113 -2,26,113 -2,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-3-predictions.csv deleted file mode 100644 index c64d261b..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-3-predictions.csv +++ /dev/null @@ -1,41 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,124 -3,9,124 -3,10,124 -3,11,124 -3,12,124 -3,13,124 -3,14,124 -3,15,124 -3,16,124 -3,17,124 -3,18,124 -3,19,124 -3,20,124 -3,21,124 -3,22,124 -3,23,124 -3,24,124 -3,25,124 -3,26,124 -3,27,124 -4,8,113 -4,9,113 -4,10,113 -4,11,113 -4,12,113 -4,13,113 -4,14,113 -4,15,113 -4,16,113 -4,17,113 -4,18,113 -4,19,113 -4,20,113 -4,21,113 -4,22,113 -4,23,113 -4,24,113 -4,25,113 -4,26,113 -4,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-4-predictions.csv deleted file mode 100644 index f86b83ee..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-4-predictions.csv +++ /dev/null @@ -1,21 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,113 -5,9,113 -5,10,113 -5,11,113 -5,12,113 -5,13,113 -5,14,113 -5,15,113 -5,16,113 -5,17,113 -5,18,113 -5,19,113 -5,20,113 -5,21,113 -5,22,113 -5,23,113 -5,24,113 -5,25,113 -5,26,113 -5,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-5-predictions.csv deleted file mode 100644 index 0acf1d86..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-5-predictions.csv +++ /dev/null @@ -1,41 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,113 -6,9,113 -6,10,113 -6,11,113 -6,12,113 -6,13,113 -6,14,113 -6,15,113 -6,16,113 -6,17,113 -6,18,113 -6,19,113 -6,20,113 -6,21,113 -6,22,113 -6,23,113 -6,24,113 -6,25,113 -6,26,113 -6,27,113 -7,8,113 -7,9,113 -7,10,113 -7,11,113 -7,12,113 -7,13,113 -7,14,113 -7,15,113 -7,16,113 -7,17,113 -7,18,113 -7,19,113 -7,20,113 -7,21,113 -7,22,113 -7,23,113 -7,24,113 -7,25,113 -7,26,113 -7,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-6-predictions.csv deleted file mode 100644 index 236a8361..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-6-predictions.csv +++ /dev/null @@ -1,21 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,113 -8,9,113 -8,10,113 -8,11,113 -8,12,113 -8,13,113 -8,14,113 -8,15,113 -8,16,113 -8,17,113 -8,18,113 -8,19,113 -8,20,113 -8,21,113 -8,22,113 -8,23,113 -8,24,113 -8,25,113 -8,26,113 -8,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-7-predictions.csv deleted file mode 100644 index c97879eb..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-autoregression-predictions/sequifier-model-categorical-1-best-3-autoregression-7-predictions.csv +++ /dev/null @@ -1,21 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,113 -9,9,113 -9,10,113 -9,11,113 -9,12,113 -9,13,113 -9,14,113 -9,15,113 -9,16,113 -9,17,113 -9,18,113 -9,19,113 -9,20,113 -9,21,113 -9,22,113 -9,23,113 -9,24,113 -9,25,113 -9,26,113 -9,27,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-0-predictions.csv deleted file mode 100644 index 5aa808f6..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-1-predictions.csv deleted file mode 100644 index c936861c..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,124 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-2-predictions.csv deleted file mode 100644 index 7e8daf90..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-3-predictions.csv deleted file mode 100644 index fc6d272e..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,124 -4,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-4-predictions.csv deleted file mode 100644 index 4e9004da..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-5-predictions.csv deleted file mode 100644 index 953b3bbc..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,113 -7,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-6-predictions.csv deleted file mode 100644 index 346e8242..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-7-predictions.csv deleted file mode 100644 index ba964099..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-best-3-predictions/sequifier-model-categorical-1-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-0-predictions.csv deleted file mode 100644 index b376d486..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-0-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId -0,6,119 -0,7,103 -0,8,111 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-1-predictions.csv deleted file mode 100644 index 76b336da..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-1-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId -1,6,102 -1,7,111 -1,8,121 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-2-predictions.csv deleted file mode 100644 index 613c7045..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-2-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId -2,6,121 -2,7,102 -2,8,126 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-3-predictions.csv deleted file mode 100644 index 2d77f92b..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-3-predictions.csv +++ /dev/null @@ -1,7 +0,0 @@ -sequenceId,itemPosition,itemId -3,6,121 -3,7,109 -3,8,124 -4,6,103 -4,7,119 -4,8,120 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-4-predictions.csv deleted file mode 100644 index 670c736f..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-4-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId -5,6,126 -5,7,104 -5,8,112 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-5-predictions.csv deleted file mode 100644 index 18bdec24..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-5-predictions.csv +++ /dev/null @@ -1,7 +0,0 @@ -sequenceId,itemPosition,itemId -6,6,102 -6,7,118 -6,8,118 -7,6,109 -7,7,121 -7,8,105 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-6-predictions.csv deleted file mode 100644 index c63e7d33..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-6-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId -8,6,121 -8,7,121 -8,8,112 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-7-predictions.csv deleted file mode 100644 index 268a2feb..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-1-inf-size-best-3-predictions/sequifier-model-categorical-1-inf-size-best-3-7-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId -9,6,110 -9,7,118 -9,8,103 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-0-predictions.csv deleted file mode 100644 index 5aa808f6..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-1-predictions.csv deleted file mode 100644 index c3d900b3..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-2-predictions.csv deleted file mode 100644 index 7e8daf90..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-3-predictions.csv deleted file mode 100644 index 18e88ed1..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,113 -4,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-4-predictions.csv deleted file mode 100644 index 4e9004da..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-5-predictions.csv deleted file mode 100644 index 953b3bbc..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,113 -7,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-6-predictions.csv deleted file mode 100644 index 346e8242..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-7-predictions.csv deleted file mode 100644 index ba964099..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-best-3-predictions/sequifier-model-categorical-3-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-0-predictions.csv deleted file mode 100644 index dd4911cc..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-0-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -0,6,124,3,7 -0,7,118,4,7 -0,8,121,6,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-1-predictions.csv deleted file mode 100644 index 056092e7..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-1-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -1,6,109,4,3 -1,7,104,9,1 -1,8,124,6,2 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-2-predictions.csv deleted file mode 100644 index 735dfc03..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-2-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -2,6,121,6,1 -2,7,102,3,0 -2,8,121,6,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-3-predictions.csv deleted file mode 100644 index 041a7dbb..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-3-predictions.csv +++ /dev/null @@ -1,7 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -3,6,121,6,1 -3,7,109,3,1 -3,8,102,0,0 -4,6,124,2,1 -4,7,111,3,1 -4,8,102,4,8 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-4-predictions.csv deleted file mode 100644 index 8631d3ed..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-4-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -5,6,126,6,1 -5,7,104,4,0 -5,8,112,4,5 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-5-predictions.csv deleted file mode 100644 index 1aa02270..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-5-predictions.csv +++ /dev/null @@ -1,7 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -6,6,102,4,8 -6,7,118,4,5 -6,8,102,4,6 -7,6,109,3,1 -7,7,121,4,8 -7,8,102,1,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-6-predictions.csv deleted file mode 100644 index 1f26c457..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-6-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -8,6,121,4,1 -8,7,121,6,1 -8,8,109,4,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-7-predictions.csv deleted file mode 100644 index ff81b9fb..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-3-inf-size-best-3-predictions/sequifier-model-categorical-3-inf-size-best-3-7-predictions.csv +++ /dev/null @@ -1,4 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2 -9,6,124,3,1 -9,7,118,4,8 -9,8,103,4,8 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-0-predictions.csv deleted file mode 100644 index 5aa808f6..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-1-predictions.csv deleted file mode 100644 index c3d900b3..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-2-predictions.csv deleted file mode 100644 index 7e8daf90..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-3-predictions.csv deleted file mode 100644 index 18e88ed1..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,113 -4,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-4-predictions.csv deleted file mode 100644 index 4e9004da..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-5-predictions.csv deleted file mode 100644 index 953b3bbc..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,113 -7,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-6-predictions.csv deleted file mode 100644 index 346e8242..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-7-predictions.csv deleted file mode 100644 index ba964099..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-5-best-3-predictions/sequifier-model-categorical-5-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-0-predictions.csv deleted file mode 100644 index 7acc0370..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-1-predictions.csv deleted file mode 100644 index dea53fa9..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-2-predictions.csv deleted file mode 100644 index 8302df2f..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-3-predictions.csv deleted file mode 100644 index c780b2f6..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,122 -4,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-4-predictions.csv deleted file mode 100644 index 4e9004da..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-5-predictions.csv deleted file mode 100644 index c71ccfa4..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,113 -7,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-6-predictions.csv deleted file mode 100644 index f3ae7b5b..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-7-predictions.csv deleted file mode 100644 index ba964099..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-50-best-3-predictions/sequifier-model-categorical-50-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,113 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-0-predictions.csv deleted file mode 100644 index 405b8711..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,121 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-1-predictions.csv deleted file mode 100644 index ac1c42b4..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,117 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-2-predictions.csv deleted file mode 100644 index 04dd0078..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,121 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-3-predictions.csv deleted file mode 100644 index 6aeaeb13..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,119 -4,8,102 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-4-predictions.csv deleted file mode 100644 index 431d8b95..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,119 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-5-predictions.csv deleted file mode 100644 index b8bead8a..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,119 -7,8,119 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-6-predictions.csv deleted file mode 100644 index 0d49e5bc..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,115 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-7-predictions.csv deleted file mode 100644 index 13695e6e..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-distributed-best-3-predictions/sequifier-model-categorical-distributed-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,119 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-0-predictions.csv deleted file mode 100644 index 405b8711..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -0,8,121 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-1-predictions.csv deleted file mode 100644 index 72fb79cf..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -1,8,115 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-2-predictions.csv deleted file mode 100644 index 04dd0078..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -2,8,121 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-3-predictions.csv deleted file mode 100644 index 6aeaeb13..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -3,8,119 -4,8,102 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-4-predictions.csv deleted file mode 100644 index 431d8b95..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -5,8,119 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-5-predictions.csv deleted file mode 100644 index 8a664645..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId -6,8,121 -7,8,122 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-6-predictions.csv deleted file mode 100644 index 0d49e5bc..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -8,8,115 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-7-predictions.csv deleted file mode 100644 index 13695e6e..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-lazy-best-3-predictions/sequifier-model-categorical-lazy-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId -9,8,119 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-0-predictions.csv deleted file mode 100644 index 4e261efe..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -0,8,110,4,-0.057408422 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-1-predictions.csv deleted file mode 100644 index 0eefb672..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -1,8,103,7,-0.21608433 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-2-predictions.csv deleted file mode 100644 index aa696c55..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -2,8,100,7,-0.20284554 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-3-predictions.csv deleted file mode 100644 index 3ff84f45..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -3,8,103,0,0.074112006 -4,8,110,0,0.012103111 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-4-predictions.csv deleted file mode 100644 index 2003e2b9..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -5,8,111,7,-0.1722543 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-5-predictions.csv deleted file mode 100644 index 45c54f06..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -6,8,122,3,-0.034481153 -7,8,114,4,-0.022850327 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-6-predictions.csv deleted file mode 100644 index 7a2374cb..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -8,8,111,3,-0.088609315 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-7-predictions.csv deleted file mode 100644 index 24299a0c..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-best-3-predictions/sequifier-model-categorical-multitarget-5-best-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -9,8,115,4,-0.001879178 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-0-predictions.csv deleted file mode 100644 index 0c925c0a..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-0-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -0,8,113,4,-0.057408422 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-1-predictions.csv deleted file mode 100644 index 97d2b3a3..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-1-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -1,8,117,7,-0.21608433 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-2-predictions.csv deleted file mode 100644 index f91f4a65..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-2-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -2,8,117,7,-0.20284554 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-3-predictions.csv deleted file mode 100644 index 38f40f6a..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-3-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -3,8,108,0,0.074112006 -4,8,103,0,0.012103111 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-4-predictions.csv deleted file mode 100644 index 7413eb80..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-4-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -5,8,104,7,-0.1722543 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-5-predictions.csv deleted file mode 100644 index 1ca260e9..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-5-predictions.csv +++ /dev/null @@ -1,3 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -6,8,116,3,-0.034481153 -7,8,108,4,-0.022850327 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-6-predictions.csv deleted file mode 100644 index b6ad1aac..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-6-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -8,8,116,3,-0.088609315 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-7-predictions.csv deleted file mode 100644 index fbb74fe9..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-categorical-multitarget-5-last-3-predictions/sequifier-model-categorical-multitarget-5-last-3-7-predictions.csv +++ /dev/null @@ -1,2 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supReal3 -9,8,113,4,-0.001879178 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-real-1-best-3-autoregression-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-real-1-best-3-autoregression-predictions.csv deleted file mode 100644 index fb7b7172..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-real-1-best-3-autoregression-predictions.csv +++ /dev/null @@ -1,201 +0,0 @@ -sequenceId,itemPosition,itemValue -0,21,-0.16013545 -0,22,0.40992618 -0,23,0.29611352 -0,24,0.63355803 -0,25,0.34203795 -0,26,0.21724334 -0,27,0.080967665 -0,28,-0.18309766 -0,29,0.05850465 -0,30,-0.018368812 -0,31,0.057256702 -0,32,0.11041919 -0,33,-0.06628993 -0,34,0.10592658 -0,35,-0.11471023 -0,36,-0.0600502 -0,37,-0.09773817 -0,38,0.24320062 -0,39,0.05201533 -0,40,-0.08925214 -1,19,0.027680388 -1,20,0.28413326 -1,21,0.091450416 -1,22,0.21424827 -1,23,0.2252302 -1,24,-0.029475529 -1,25,-0.039583888 -1,26,-0.05680554 -1,27,-0.0011637344 -1,28,0.11441261 -1,29,-0.03658882 -1,30,0.06798903 -1,31,-0.014063398 -1,32,-0.0034246612 -1,33,-0.16412888 -1,34,0.1493551 -1,35,0.1333814 -1,36,0.02555888 -1,37,-0.058053486 -1,38,-0.17211573 -2,17,0.29611352 -2,18,0.079470135 -2,19,0.02830436 -2,20,0.0124554485 -2,21,-0.044326082 -2,22,0.058255058 -2,23,-0.013876207 -2,24,0.1653288 -2,25,0.06798903 -2,26,0.0435293 -2,27,0.11541097 -2,28,-0.037836764 -2,29,-0.33484784 -2,30,0.067489855 -2,31,-0.07976775 -2,32,0.16832387 -2,33,-0.090749666 -2,34,0.07447835 -2,35,0.13837317 -2,36,-0.16712394 -3,17,0.07697424 -3,18,0.27215296 -3,19,0.21025485 -3,20,0.086957805 -3,21,-0.03658882 -3,22,0.26616284 -3,23,-0.041081425 -3,24,-0.026480459 -3,25,0.1079233 -3,26,0.02393655 -3,27,-0.12818804 -3,28,-0.052562527 -3,29,0.10542741 -3,30,0.16233373 -3,31,0.08346356 -3,32,0.23421541 -3,33,0.09644219 -3,34,0.0709841 -3,35,-0.13916996 -3,36,0.045526013 -4,14,0.1493551 -4,15,-0.08725542 -4,16,0.1353781 -4,17,0.00095874834 -4,18,0.23521377 -4,19,0.035792034 -4,20,-0.019242374 -4,21,-0.1501519 -4,22,0.053263277 -4,23,-0.27095303 -4,24,0.0021754955 -4,25,0.021815043 -4,26,0.16233373 -4,27,-0.16113381 -4,28,0.15035345 -4,29,0.07747342 -4,30,-0.04582362 -4,31,0.25018913 -4,32,-0.03409293 -4,33,-0.04282855 -5,14,0.24619569 -5,15,0.34203795 -5,16,0.122898646 -5,17,0.35601494 -5,18,0.33205438 -5,19,0.10592658 -5,20,0.11990357 -5,21,0.16732551 -5,22,-0.013065042 -5,23,-0.1521486 -5,24,-0.07327843 -5,25,0.090951234 -5,26,0.13737482 -5,27,-0.06054938 -5,28,-0.19208287 -5,29,-0.05156417 -5,30,-0.014312988 -5,31,0.063496426 -5,32,-0.061547734 -5,33,0.0939463 -6,18,0.3999426 -6,19,0.43987688 -6,20,0.20426472 -6,21,0.216245 -6,22,0.19328278 -6,23,0.039036695 -6,24,-0.007917265 -6,25,0.023187783 -6,26,0.085460275 -6,27,-0.0057957578 -6,28,-0.03359375 -6,29,-0.05430965 -6,30,-0.13517654 -6,31,-0.23401384 -6,32,-0.023111006 -6,33,0.035542447 -6,34,0.011644284 -6,35,-0.05430965 -6,36,-0.1221979 -6,37,0.20725977 -7,15,0.2182417 -7,16,0.06449478 -7,17,0.12339783 -7,18,0.21424827 -7,19,0.016074492 -7,20,0.15035345 -7,21,0.2322187 -7,22,-0.003292067 -7,23,-0.075275145 -7,24,0.15235017 -7,25,-0.14915353 -7,26,0.024560522 -7,27,-0.0133770285 -7,28,0.18629429 -7,29,-0.016122509 -7,30,-0.12369544 -7,31,-0.03658882 -7,32,-0.15314695 -7,33,-0.22103521 -7,34,-0.15115024 -8,20,0.02805477 -8,21,0.050018616 -8,22,-0.02435895 -8,23,0.062498074 -8,24,-0.0053745764 -8,25,0.10592658 -8,26,-0.013189836 -8,27,0.09594302 -8,28,-0.13517654 -8,29,-0.12369544 -8,30,0.12140111 -8,31,-0.040332656 -8,32,-0.10722256 -8,33,-0.008229252 -8,34,-0.013439426 -8,35,0.11890522 -8,36,-0.019491963 -8,37,-0.014749769 -8,38,-0.12369544 -8,39,0.17032059 -9,16,0.22722691 -9,17,0.36999193 -9,18,0.22223513 -9,19,0.36999193 -9,20,0.21524663 -9,21,0.18729265 -9,22,0.28812668 -9,23,0.0040006163 -9,24,-0.034841694 -9,25,-0.06504199 -9,26,0.06499396 -9,27,-0.009227608 -9,28,0.069486566 -9,29,-0.055557594 -9,30,0.11391344 -9,31,-0.10173159 -9,32,-0.15813874 -9,33,-0.07777103 -9,34,0.012954627 -9,35,0.011644284 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-real-1-best-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-real-1-best-3-predictions.csv deleted file mode 100644 index 8a20bbbe..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-real-1-best-3-predictions.csv +++ /dev/null @@ -1,25 +0,0 @@ -sequenceId,itemPosition,itemValue -0,8,0.33205438 -0,9,-0.029600324 -0,10,0.42190647 -0,11,0.29611352 -0,12,-0.30689386 -1,8,0.3180774 -1,9,0.34603137 -1,10,0.37797877 -2,8,0.045026835 -2,9,0.14336495 -3,8,0.40992618 -3,9,0.3360478 -4,8,-0.25897273 -5,8,0.16433044 -6,8,0.38596562 -6,9,0.32606423 -6,10,0.36000836 -7,8,0.216245 -8,8,0.19228444 -8,9,-0.25398096 -8,10,0.473821 -8,11,0.46583417 -9,8,0.36999193 -9,9,0.31608066 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-real-3-best-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-real-3-best-3-predictions.csv deleted file mode 100644 index a06dd55d..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-real-3-best-3-predictions.csv +++ /dev/null @@ -1,25 +0,0 @@ -sequenceId,itemPosition,itemValue -0,8,-0.0067936005 -0,9,0.047275458 -0,10,0.06949562 -0,11,0.34379116 -0,12,0.53735346 -1,8,0.17491794 -1,9,0.031227563 -1,10,-0.15887825 -2,8,0.0593731 -2,9,-0.139127 -3,8,0.09344401 -3,9,0.183806 -4,8,0.33984092 -5,8,0.015025363 -6,8,0.35564193 -6,9,0.31218916 -6,10,0.0023722164 -7,8,0.6124082 -8,8,0.2608359 -8,9,0.30428866 -8,10,0.116651736 -8,11,0.1709677 -9,8,0.007306172 -9,9,-0.15789069 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-real-5-best-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-real-5-best-3-predictions.csv deleted file mode 100644 index fae6087b..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-real-5-best-3-predictions.csv +++ /dev/null @@ -1,25 +0,0 @@ -sequenceId,itemPosition,itemValue -0,8,-0.08213164 -0,9,-0.36485112 -0,10,-0.04796779 -0,11,-0.23358852 -0,12,-0.23358852 -1,8,-0.24276772 -1,9,-0.048351455 -1,10,0.042246565 -2,8,-0.377702 -2,9,-0.29325333 -3,8,-0.115176775 -3,9,0.27402145 -4,8,0.16019934 -5,8,-0.36485112 -6,8,0.08217611 -6,9,-0.06515011 -6,10,0.18131152 -7,8,0.20058784 -8,8,-0.22624514 -8,9,-0.115176775 -8,10,-0.29508916 -8,11,-0.29508916 -9,8,-0.14087854 -9,9,0.024806082 diff --git a/tests/resources/target_outputs/predictions/sequifier-model-real-50-best-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-model-real-50-best-3-predictions.csv deleted file mode 100644 index 953319ec..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-model-real-50-best-3-predictions.csv +++ /dev/null @@ -1,25 +0,0 @@ -sequenceId,itemPosition,itemValue -0,8,-0.061894365 -0,9,-0.20701185 -0,10,-0.11131864 -0,11,-0.020215044 -0,12,-0.03547547 -1,8,-0.035131253 -1,9,0.03623706 -1,10,-0.06484892 -2,8,-0.3391924 -2,9,-0.2226165 -3,8,0.095901884 -3,9,0.5291603 -4,8,0.41166648 -5,8,-0.13311926 -6,8,0.38780054 -6,9,0.3217103 -6,10,0.47775677 -7,8,0.41350234 -8,8,-0.054174513 -8,9,-0.03547547 -8,10,-0.03593443 -8,11,-0.1601979 -9,8,0.055054426 -9,9,0.23542577 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-0-predictions.csv deleted file mode 100644 index 9c9a70fe..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-0-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -0,8,127,6,2,0,1 -0,9,118,6,2,0,1 -0,10,118,6,2,2,1 -0,11,118,6,2,2,1 -0,12,118,6,7,2,1 -0,13,118,6,3,2,1 -0,14,118,6,3,6,1 -0,15,118,6,3,6,1 -0,16,127,6,3,other,0 -0,17,127,6,3,0,1 -0,18,127,6,3,0,1 -0,19,127,6,3,0,1 -0,20,118,6,3,0,1 -0,21,118,6,3,0,1 -0,22,118,6,3,2,1 -0,23,118,6,3,2,1 -0,24,118,6,3,2,1 -0,25,124,6,3,0,1 -0,26,124,6,3,0,1 -0,27,124,6,3,0,1 -0,28,104,6,3,0,1 -0,29,104,6,3,1,1 -0,30,109,6,3,8,1 -0,31,109,6,3,1,1 -0,32,109,4,3,8,0 -0,33,113,3,3,0,1 -0,34,122,3,5,8,0 -0,35,118,3,5,0,1 -0,36,118,6,5,8,0 -0,37,118,6,5,2,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-1-predictions.csv deleted file mode 100644 index 18c70481..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-1-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -1,8,118,6,2,2,1 -1,9,118,6,9,0,1 -1,10,118,6,9,2,1 -1,11,118,6,9,2,1 -1,12,118,6,9,2,1 -1,13,118,6,3,2,1 -1,14,124,6,3,2,1 -1,15,104,6,3,8,1 -1,16,114,6,3,5,1 -1,17,114,6,3,5,1 -1,18,114,6,3,5,1 -1,19,114,6,3,5,1 -1,20,114,6,3,5,1 -1,21,109,6,3,5,1 -1,22,127,6,3,5,1 -1,23,127,6,9,5,1 -1,24,127,6,3,5,1 -1,25,118,6,3,5,1 -1,26,118,6,3,5,1 -1,27,118,6,3,5,1 -1,28,118,6,3,5,1 -1,29,118,6,3,9,1 -1,30,118,6,3,5,1 -1,31,127,6,3,5,1 -1,32,127,6,3,5,1 -1,33,127,6,3,5,1 -1,34,127,6,3,5,1 -1,35,127,6,3,5,1 -1,36,118,6,3,5,1 -1,37,118,6,3,0,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-2-predictions.csv deleted file mode 100644 index cec8e864..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-2-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -2,8,127,6,2,0,1 -2,9,127,6,3,0,1 -2,10,127,6,3,0,1 -2,11,118,6,3,0,1 -2,12,118,6,5,2,1 -2,13,118,6,7,2,1 -2,14,118,6,7,2,1 -2,15,124,6,3,2,1 -2,16,124,6,3,2,1 -2,17,124,6,3,2,1 -2,18,124,6,3,0,1 -2,19,104,6,3,0,1 -2,20,104,6,3,1,1 -2,21,109,6,3,0,1 -2,22,109,6,3,0,1 -2,23,104,3,3,8,1 -2,24,113,6,3,8,1 -2,25,113,6,3,8,1 -2,26,113,4,3,8,0 -2,27,113,3,4,8,0 -2,28,unknown,4,4,8,2 -2,29,unknown,4,4,8,0 -2,30,109,4,4,8,2 -2,31,109,4,3,8,2 -2,32,127,3,6,8,1 -2,33,unknown,3,5,4,1 -2,34,unknown,3,9,4,1 -2,35,unknown,0,9,8,1 -2,36,127,4,3,8,0 -2,37,118,4,9,3,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-3-predictions.csv deleted file mode 100644 index cd3c4c28..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-3-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -3,8,127,2,2,2,1 -3,9,127,6,2,0,1 -3,10,127,6,3,2,1 -3,11,118,6,3,0,1 -3,12,118,6,3,2,1 -3,13,118,6,3,2,1 -3,14,118,6,3,2,1 -3,15,118,6,3,6,1 -3,16,109,6,3,8,1 -3,17,109,6,3,0,1 -3,18,109,6,3,0,1 -3,19,127,6,3,0,0 -3,20,109,6,3,0,1 -3,21,127,6,3,0,1 -3,22,118,6,3,0,1 -3,23,118,4,5,2,1 -3,24,118,6,5,2,1 -3,25,118,6,3,2,1 -3,26,118,6,3,2,1 -3,27,118,6,3,2,1 -3,28,118,6,3,0,1 -3,29,104,6,3,0,1 -3,30,104,6,3,1,1 -3,31,104,6,3,5,1 -3,32,104,6,3,1,1 -3,33,104,6,3,8,0 -3,34,109,6,3,5,1 -3,35,127,6,3,5,0 -3,36,118,6,9,8,0 -3,37,118,6,9,5,1 -4,8,127,6,2,0,1 -4,9,127,6,3,0,1 -4,10,127,6,3,0,1 -4,11,127,6,3,0,1 -4,12,118,6,3,0,1 -4,13,118,6,7,2,1 -4,14,118,1,7,2,1 -4,15,118,1,7,2,1 -4,16,118,6,5,2,1 -4,17,124,6,3,2,1 -4,18,124,6,3,2,1 -4,19,124,6,3,0,1 -4,20,109,6,3,0,1 -4,21,109,6,3,0,1 -4,22,109,6,3,0,1 -4,23,109,6,3,0,1 -4,24,109,6,3,8,1 -4,25,unknown,3,3,0,1 -4,26,124,3,5,8,1 -4,27,124,4,5,2,0 -4,28,124,6,7,2,1 -4,29,unknown,6,5,2,1 -4,30,124,6,3,2,1 -4,31,unknown,6,3,8,1 -4,32,unknown,6,3,8,1 -4,33,unknown,6,3,8,1 -4,34,104,6,3,8,1 -4,35,104,6,3,8,1 -4,36,104,6,3,8,1 -4,37,104,6,3,8,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-4-predictions.csv deleted file mode 100644 index 16a159f1..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-4-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -5,8,127,6,2,2,0 -5,9,118,6,2,0,1 -5,10,127,6,2,0,1 -5,11,127,6,3,0,1 -5,12,118,6,3,0,1 -5,13,118,6,5,2,1 -5,14,118,6,3,2,1 -5,15,124,6,3,8,1 -5,16,118,6,3,2,1 -5,17,127,6,3,8,other -5,18,109,6,3,0,1 -5,19,109,6,3,0,other -5,20,109,6,3,0,1 -5,21,112,6,3,0,1 -5,22,118,6,3,8,1 -5,23,124,6,3,8,1 -5,24,124,4,3,2,1 -5,25,124,6,5,2,1 -5,26,124,6,3,2,1 -5,27,unknown,6,3,2,1 -5,28,104,6,3,8,1 -5,29,104,6,3,8,1 -5,30,104,6,3,8,1 -5,31,104,6,3,8,1 -5,32,104,6,3,5,1 -5,33,104,6,3,8,1 -5,34,127,6,3,5,0 -5,35,109,1,9,8,0 -5,36,127,1,9,5,2 -5,37,127,9,9,5,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-5-predictions.csv deleted file mode 100644 index 07028e2d..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-5-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -6,8,127,6,2,0,1 -6,9,127,6,3,0,1 -6,10,127,6,3,0,1 -6,11,127,4,3,0,1 -6,12,127,4,5,0,0 -6,13,112,1,7,2,1 -6,14,118,1,5,2,1 -6,15,118,1,7,2,1 -6,16,118,1,5,2,1 -6,17,118,6,3,2,1 -6,18,118,6,3,2,1 -6,19,118,6,3,2,1 -6,20,118,6,3,2,1 -6,21,109,6,3,0,1 -6,22,109,6,3,0,1 -6,23,109,6,3,0,1 -6,24,109,6,3,0,1 -6,25,109,6,3,0,1 -6,26,127,6,3,0,1 -6,27,118,6,3,0,1 -6,28,118,6,5,0,1 -6,29,118,4,5,other,0 -6,30,118,6,7,0,1 -6,31,118,4,5,2,0 -6,32,118,6,7,2,1 -6,33,118,6,3,2,1 -6,34,118,6,3,0,1 -6,35,127,6,3,0,1 -6,36,127,6,3,0,1 -6,37,127,6,3,2,1 -7,8,127,6,2,2,1 -7,9,127,6,3,0,1 -7,10,127,6,3,0,1 -7,11,118,6,3,0,1 -7,12,118,6,3,2,1 -7,13,118,6,3,2,1 -7,14,118,6,3,2,1 -7,15,118,6,3,2,1 -7,16,118,6,3,0,1 -7,17,124,6,3,8,1 -7,18,unknown,6,3,0,1 -7,19,109,6,3,1,1 -7,20,109,6,3,1,0 -7,21,109,6,3,0,1 -7,22,109,6,3,0,0 -7,23,109,6,5,0,1 -7,24,118,6,5,0,0 -7,25,118,3,7,2,1 -7,26,118,1,5,2,0 -7,27,118,6,7,2,1 -7,28,118,6,5,2,1 -7,29,118,6,3,2,1 -7,30,112,6,3,2,1 -7,31,112,6,3,0,1 -7,32,112,6,3,8,1 -7,33,109,6,3,8,1 -7,34,109,6,3,5,1 -7,35,109,6,3,1,1 -7,36,109,6,3,8,0 -7,37,109,6,3,0,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-6-predictions.csv deleted file mode 100644 index bc2b4d05..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-6-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -8,8,127,6,2,0,1 -8,9,127,6,3,0,1 -8,10,127,6,3,0,1 -8,11,118,6,9,2,1 -8,12,118,6,7,2,1 -8,13,118,6,9,6,1 -8,14,127,6,3,8,1 -8,15,127,6,3,5,1 -8,16,118,6,3,0,1 -8,17,124,6,3,0,1 -8,18,124,6,3,2,1 -8,19,126,6,3,5,1 -8,20,127,6,3,5,1 -8,21,118,6,3,0,1 -8,22,118,6,3,8,1 -8,23,118,6,3,0,1 -8,24,118,6,3,8,1 -8,25,118,6,3,0,1 -8,26,104,6,3,0,1 -8,27,126,6,3,5,0 -8,28,109,6,3,0,1 -8,29,127,6,3,0,0 -8,30,109,6,3,0,1 -8,31,127,6,3,0,0 -8,32,118,3,5,0,1 -8,33,118,6,5,2,0 -8,34,118,6,7,2,1 -8,35,118,6,5,2,1 -8,36,118,6,3,2,1 -8,37,112,6,3,2,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-7-predictions.csv deleted file mode 100644 index 940e8923..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-predictions/sequifier-test-hp-search-custom-eval-run-0-best-1-7-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -9,8,127,6,2,other,1 -9,9,127,6,3,0,1 -9,10,127,6,3,0,1 -9,11,118,6,3,0,1 -9,12,118,6,3,other,1 -9,13,126,6,3,8,1 -9,14,113,6,3,8,0 -9,15,113,4,3,0,1 -9,16,118,6,3,0,1 -9,17,118,6,3,8,1 -9,18,118,6,3,0,1 -9,19,118,6,3,0,0 -9,20,118,6,3,0,1 -9,21,127,6,3,8,0 -9,22,118,6,3,0,1 -9,23,118,6,3,8,0 -9,24,109,6,3,0,1 -9,25,127,6,3,0,0 -9,26,112,6,5,0,1 -9,27,112,6,3,2,1 -9,28,118,6,3,8,1 -9,29,118,4,3,6,1 -9,30,124,6,3,8,1 -9,31,124,4,3,2,1 -9,32,124,6,3,2,1 -9,33,124,6,3,2,1 -9,34,104,6,3,1,1 -9,35,104,6,3,1,1 -9,36,104,6,3,8,1 -9,37,104,6,3,5,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-0-predictions.csv deleted file mode 100644 index c5dc282f..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-0-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -0,8,102,6,3,6,0 -0,9,102,6,3,6,0 -0,10,102,6,3,6,0 -0,11,102,6,3,6,0 -0,12,121,6,3,6,0 -0,13,102,6,3,6,0 -0,14,102,6,3,6,0 -0,15,102,6,3,6,0 -0,16,102,6,3,6,0 -0,17,102,6,3,6,0 -0,18,102,6,3,6,0 -0,19,102,6,3,6,0 -0,20,102,6,3,6,0 -0,21,102,6,3,6,0 -0,22,102,6,3,6,0 -0,23,102,6,3,6,0 -0,24,102,6,3,6,0 -0,25,102,6,3,6,0 -0,26,102,6,3,6,0 -0,27,102,6,3,6,0 -0,28,102,6,3,6,0 -0,29,102,6,3,6,0 -0,30,102,6,3,6,0 -0,31,102,6,3,6,0 -0,32,102,6,3,6,0 -0,33,102,6,3,6,0 -0,34,102,6,3,6,0 -0,35,102,6,3,6,0 -0,36,102,6,3,6,0 -0,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-1-predictions.csv deleted file mode 100644 index e842b43e..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-1-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -1,8,121,6,3,6,0 -1,9,121,6,3,6,0 -1,10,121,6,3,6,0 -1,11,121,6,3,6,0 -1,12,121,4,3,6,0 -1,13,121,6,3,8,0 -1,14,121,6,9,6,0 -1,15,121,6,9,6,0 -1,16,102,6,9,6,0 -1,17,102,6,3,6,0 -1,18,121,6,3,6,0 -1,19,121,6,9,6,0 -1,20,102,6,3,6,0 -1,21,121,6,3,6,0 -1,22,121,6,3,6,0 -1,23,121,6,3,6,0 -1,24,121,6,3,6,0 -1,25,121,6,3,6,0 -1,26,121,6,9,6,0 -1,27,102,6,3,6,0 -1,28,102,6,3,6,0 -1,29,102,6,9,6,0 -1,30,102,6,3,6,0 -1,31,102,6,3,6,0 -1,32,102,6,3,6,0 -1,33,102,6,3,6,0 -1,34,102,6,3,6,0 -1,35,102,6,3,6,0 -1,36,102,6,3,6,0 -1,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-2-predictions.csv deleted file mode 100644 index 5ee56466..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-2-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -2,8,102,6,3,6,0 -2,9,121,6,3,6,0 -2,10,102,6,3,6,0 -2,11,102,6,3,6,0 -2,12,102,6,3,6,0 -2,13,121,6,3,6,0 -2,14,102,6,3,6,0 -2,15,102,6,3,6,0 -2,16,102,6,3,6,0 -2,17,102,6,3,6,0 -2,18,102,6,3,6,0 -2,19,102,6,3,6,0 -2,20,102,6,3,6,0 -2,21,102,6,3,6,0 -2,22,102,6,3,6,0 -2,23,102,6,3,6,0 -2,24,102,6,3,6,0 -2,25,102,6,3,6,0 -2,26,102,6,3,6,0 -2,27,102,6,3,6,0 -2,28,102,6,3,6,0 -2,29,102,6,3,6,0 -2,30,102,6,3,6,0 -2,31,102,6,3,6,0 -2,32,102,6,3,6,0 -2,33,102,6,3,6,0 -2,34,102,6,3,6,0 -2,35,102,6,3,6,0 -2,36,102,6,3,6,0 -2,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-3-predictions.csv deleted file mode 100644 index d549003f..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-3-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -3,8,121,6,3,6,0 -3,9,121,6,3,6,0 -3,10,121,6,3,6,0 -3,11,102,6,3,6,0 -3,12,102,6,3,6,0 -3,13,121,6,3,6,0 -3,14,102,6,9,6,0 -3,15,102,6,3,6,0 -3,16,102,6,3,6,0 -3,17,102,6,3,6,0 -3,18,102,6,3,6,0 -3,19,102,6,3,6,0 -3,20,102,6,3,6,0 -3,21,102,6,3,6,0 -3,22,102,6,3,6,0 -3,23,102,6,3,6,0 -3,24,102,6,3,6,0 -3,25,102,6,3,6,0 -3,26,102,6,3,6,0 -3,27,102,6,3,6,0 -3,28,102,6,3,6,0 -3,29,102,6,3,6,0 -3,30,102,6,3,6,0 -3,31,102,6,3,6,0 -3,32,102,6,3,6,0 -3,33,102,6,3,6,0 -3,34,102,6,3,6,0 -3,35,102,6,3,6,0 -3,36,102,6,3,6,0 -3,37,102,6,3,6,0 -4,8,102,6,3,6,0 -4,9,121,6,3,6,0 -4,10,121,6,3,6,0 -4,11,121,6,3,6,0 -4,12,121,6,3,6,0 -4,13,121,6,3,6,0 -4,14,102,6,3,6,0 -4,15,102,6,3,6,0 -4,16,102,6,3,6,0 -4,17,102,6,3,6,0 -4,18,102,6,3,6,0 -4,19,102,6,3,6,0 -4,20,102,6,3,6,0 -4,21,102,6,3,6,0 -4,22,102,6,3,6,0 -4,23,102,6,3,6,0 -4,24,102,6,3,6,0 -4,25,102,6,3,6,0 -4,26,102,6,3,6,0 -4,27,102,6,3,6,0 -4,28,102,6,3,6,0 -4,29,102,6,3,6,0 -4,30,102,6,3,6,0 -4,31,102,6,3,6,0 -4,32,102,6,3,6,0 -4,33,102,6,3,6,0 -4,34,102,6,3,6,0 -4,35,102,6,3,6,0 -4,36,102,6,3,6,0 -4,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-4-predictions.csv deleted file mode 100644 index ee14eff8..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-4-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -5,8,102,6,3,6,0 -5,9,102,6,3,6,0 -5,10,102,6,3,6,0 -5,11,102,6,3,6,0 -5,12,102,6,3,6,0 -5,13,102,6,3,8,0 -5,14,102,6,3,6,0 -5,15,102,6,3,6,0 -5,16,102,6,3,6,0 -5,17,102,6,3,6,0 -5,18,102,6,3,6,0 -5,19,102,6,3,6,0 -5,20,102,6,3,6,0 -5,21,102,6,3,6,0 -5,22,102,6,3,6,0 -5,23,102,6,3,6,0 -5,24,102,6,3,6,0 -5,25,102,6,3,6,0 -5,26,102,6,3,6,0 -5,27,102,6,3,6,0 -5,28,102,6,3,6,0 -5,29,102,6,3,6,0 -5,30,102,6,3,6,0 -5,31,102,6,3,6,0 -5,32,102,6,3,6,0 -5,33,102,6,3,6,0 -5,34,102,6,3,6,0 -5,35,102,6,3,6,0 -5,36,102,6,3,6,0 -5,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-5-predictions.csv deleted file mode 100644 index 89e13f1d..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-5-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -6,8,121,6,3,6,0 -6,9,121,6,3,6,0 -6,10,121,6,3,6,0 -6,11,121,6,3,6,0 -6,12,121,6,3,6,0 -6,13,121,6,9,6,0 -6,14,121,6,9,6,0 -6,15,102,6,9,6,0 -6,16,102,6,3,6,0 -6,17,121,6,3,6,0 -6,18,121,6,9,6,0 -6,19,102,6,3,6,0 -6,20,121,6,3,6,0 -6,21,121,6,3,6,0 -6,22,121,6,3,6,0 -6,23,121,6,3,6,0 -6,24,121,6,3,6,0 -6,25,121,6,9,6,0 -6,26,102,6,3,6,0 -6,27,102,6,3,6,0 -6,28,102,6,9,6,0 -6,29,102,6,3,6,0 -6,30,102,6,3,6,0 -6,31,102,6,3,6,0 -6,32,102,6,3,6,0 -6,33,102,6,3,6,0 -6,34,102,6,3,6,0 -6,35,102,6,3,6,0 -6,36,102,6,3,6,0 -6,37,102,6,3,6,0 -7,8,121,6,3,6,0 -7,9,121,6,3,6,0 -7,10,121,6,9,6,0 -7,11,102,6,9,6,0 -7,12,102,6,3,6,0 -7,13,102,6,9,6,0 -7,14,102,6,3,6,0 -7,15,102,6,3,6,0 -7,16,121,6,3,6,0 -7,17,121,6,3,6,0 -7,18,121,6,3,6,0 -7,19,121,6,3,6,0 -7,20,121,6,3,6,0 -7,21,121,6,3,6,0 -7,22,102,6,9,6,0 -7,23,102,6,3,6,0 -7,24,102,6,9,6,0 -7,25,102,6,3,6,0 -7,26,102,6,3,6,0 -7,27,102,6,3,6,0 -7,28,102,6,3,6,0 -7,29,102,6,3,6,0 -7,30,121,6,3,6,0 -7,31,102,6,3,6,0 -7,32,102,6,3,6,0 -7,33,102,6,3,6,0 -7,34,102,6,3,6,0 -7,35,102,6,3,6,0 -7,36,102,6,3,6,0 -7,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-6-predictions.csv deleted file mode 100644 index 0988fb6a..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-6-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -8,8,102,6,3,6,0 -8,9,102,6,3,6,0 -8,10,102,6,3,6,0 -8,11,102,6,3,6,0 -8,12,102,6,3,6,0 -8,13,102,6,3,6,0 -8,14,102,6,3,6,0 -8,15,102,6,3,6,0 -8,16,102,6,3,6,0 -8,17,102,6,3,6,0 -8,18,102,6,3,6,0 -8,19,102,6,3,6,0 -8,20,102,6,3,6,0 -8,21,102,6,3,6,0 -8,22,102,6,3,6,0 -8,23,102,6,3,6,0 -8,24,102,6,3,6,0 -8,25,102,6,3,6,0 -8,26,102,6,3,6,0 -8,27,102,6,3,6,0 -8,28,102,6,3,6,0 -8,29,102,6,3,6,0 -8,30,102,6,3,6,0 -8,31,102,6,3,6,0 -8,32,102,6,3,6,0 -8,33,102,6,3,6,0 -8,34,102,6,3,6,0 -8,35,102,6,3,6,0 -8,36,102,6,3,6,0 -8,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-7-predictions.csv deleted file mode 100644 index f032d896..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-predictions/sequifier-test-hp-search-custom-eval-run-1-best-1-7-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -9,8,113,6,3,6,0 -9,9,102,6,3,6,0 -9,10,102,6,3,6,0 -9,11,102,6,3,6,0 -9,12,102,6,3,6,0 -9,13,121,6,3,8,0 -9,14,102,6,3,6,0 -9,15,102,6,3,6,0 -9,16,102,6,3,6,0 -9,17,102,6,3,6,0 -9,18,102,6,3,6,0 -9,19,102,6,3,6,0 -9,20,102,6,3,6,0 -9,21,102,6,3,6,0 -9,22,102,6,3,6,0 -9,23,102,6,3,6,0 -9,24,102,6,3,6,0 -9,25,102,6,3,6,0 -9,26,102,6,3,6,0 -9,27,102,6,3,6,0 -9,28,102,6,3,6,0 -9,29,102,6,3,6,0 -9,30,102,6,3,6,0 -9,31,102,6,3,6,0 -9,32,102,6,3,6,0 -9,33,102,6,3,6,0 -9,34,102,6,3,6,0 -9,35,102,6,3,6,0 -9,36,102,6,3,6,0 -9,37,102,6,3,6,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-0-predictions.csv deleted file mode 100644 index 261bca34..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-0-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -0,8,115,7,0,3,0 -0,9,107,1,2,5,1 -0,10,103,6,2,3,1 -0,11,126,6,2,0,0 -0,12,112,4,9,5,0 -0,13,112,6,3,0,0 -0,14,112,6,2,0,0 -0,15,112,6,2,0,0 -0,16,100,6,2,0,0 -0,17,110,6,2,0,2 -0,18,115,6,1,0,2 -0,19,107,6,2,0,2 -0,20,100,6,2,6,2 -0,21,112,6,2,6,2 -0,22,107,6,2,0,2 -0,23,107,6,2,0,2 -0,24,100,6,2,0,2 -0,25,100,9,2,0,2 -0,26,115,6,2,0,1 -0,27,107,9,2,0,2 -0,28,115,5,2,0,1 -0,29,107,6,2,0,1 -0,30,110,6,2,0,2 -0,31,113,9,2,0,1 -0,32,115,6,2,0,1 -0,33,103,0,2,0,1 -0,34,113,0,2,0,0 -0,35,113,4,2,0,1 -0,36,110,6,2,0,1 -0,37,110,5,2,0,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-1-predictions.csv deleted file mode 100644 index cdaed10b..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-1-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -1,8,107,7,2,7,0 -1,9,107,7,2,0,0 -1,10,110,9,2,0,0 -1,11,121,6,2,0,1 -1,12,121,4,9,8,0 -1,13,112,4,9,5,0 -1,14,112,6,3,5,0 -1,15,112,4,3,5,0 -1,16,112,6,2,4,0 -1,17,112,4,9,0,0 -1,18,112,6,9,0,0 -1,19,112,6,9,5,0 -1,20,112,6,9,5,0 -1,21,112,6,9,0,0 -1,22,100,6,9,6,0 -1,23,100,6,9,5,0 -1,24,100,6,9,5,0 -1,25,100,6,9,5,0 -1,26,100,6,9,5,0 -1,27,100,1,9,5,0 -1,28,100,6,9,5,0 -1,29,100,4,9,5,0 -1,30,100,1,9,5,0 -1,31,100,6,9,5,0 -1,32,100,4,9,5,0 -1,33,112,4,9,5,0 -1,34,112,4,9,5,0 -1,35,112,4,9,5,0 -1,36,112,4,9,5,0 -1,37,112,4,9,5,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-2-predictions.csv deleted file mode 100644 index f74eed86..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-2-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -2,8,107,1,0,9,1 -2,9,108,0,2,5,1 -2,10,110,0,2,8,1 -2,11,110,0,2,0,1 -2,12,110,0,2,0,1 -2,13,103,6,8,0,0 -2,14,112,4,8,8,0 -2,15,112,6,2,8,0 -2,16,112,4,2,0,0 -2,17,112,6,2,0,0 -2,18,110,4,2,0,0 -2,19,102,6,1,0,0 -2,20,110,6,1,0,0 -2,21,122,6,9,0,0 -2,22,112,6,9,6,0 -2,23,110,6,2,0,0 -2,24,110,6,2,0,0 -2,25,110,4,2,0,0 -2,26,110,4,2,0,0 -2,27,102,4,0,0,1 -2,28,108,6,0,5,1 -2,29,108,6,0,5,0 -2,30,108,6,9,4,0 -2,31,112,6,9,5,0 -2,32,108,6,9,0,0 -2,33,112,6,9,5,0 -2,34,112,6,9,0,0 -2,35,100,6,9,5,0 -2,36,100,6,9,5,0 -2,37,100,6,9,5,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-3-predictions.csv deleted file mode 100644 index 8ce16f14..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-3-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -3,8,110,1,2,7,1 -3,9,107,1,2,3,1 -3,10,110,0,2,3,1 -3,11,110,1,7,0,1 -3,12,108,0,7,5,1 -3,13,112,6,7,8,1 -3,14,112,6,2,0,0 -3,15,113,6,2,0,0 -3,16,110,6,2,0,0 -3,17,110,6,2,0,1 -3,18,102,6,2,0,1 -3,19,110,6,2,0,1 -3,20,102,6,2,0,1 -3,21,110,6,2,0,1 -3,22,110,6,2,0,1 -3,23,110,6,2,0,1 -3,24,110,6,2,0,1 -3,25,102,6,2,0,1 -3,26,110,6,2,0,1 -3,27,102,6,2,0,1 -3,28,110,6,2,0,1 -3,29,102,6,2,0,1 -3,30,110,6,2,0,1 -3,31,102,6,2,0,1 -3,32,110,6,2,0,1 -3,33,110,6,2,0,1 -3,34,102,6,2,0,1 -3,35,110,6,2,0,1 -3,36,102,6,2,0,1 -3,37,110,6,2,0,1 -4,8,107,7,0,3,0 -4,9,110,1,2,9,0 -4,10,119,7,0,4,0 -4,11,107,7,0,5,0 -4,12,103,6,9,5,0 -4,13,112,6,9,5,0 -4,14,112,6,9,0,0 -4,15,112,4,9,0,0 -4,16,112,6,9,5,0 -4,17,112,6,9,0,0 -4,18,100,4,9,5,0 -4,19,112,6,9,5,0 -4,20,100,6,9,0,0 -4,21,100,4,9,5,0 -4,22,112,6,9,5,0 -4,23,100,6,9,5,0 -4,24,100,4,9,5,0 -4,25,112,6,9,5,0 -4,26,100,4,9,5,0 -4,27,112,6,9,5,0 -4,28,100,4,9,5,0 -4,29,112,9,9,5,0 -4,30,112,6,9,5,0 -4,31,100,4,9,5,0 -4,32,112,9,9,5,0 -4,33,112,6,9,5,0 -4,34,112,9,9,5,0 -4,35,112,6,9,5,0 -4,36,112,9,9,5,0 -4,37,112,6,9,5,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-4-predictions.csv deleted file mode 100644 index e2d9465c..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-4-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -5,8,107,7,2,5,0 -5,9,119,7,2,9,0 -5,10,119,7,2,0,0 -5,11,119,9,0,0,0 -5,12,103,6,0,5,0 -5,13,103,4,9,0,0 -5,14,112,4,9,5,0 -5,15,112,6,9,5,0 -5,16,112,6,9,0,0 -5,17,112,4,9,5,0 -5,18,112,6,9,5,0 -5,19,112,6,9,5,0 -5,20,100,6,9,0,0 -5,21,100,4,9,5,0 -5,22,112,6,9,5,0 -5,23,100,6,9,0,0 -5,24,100,4,9,5,0 -5,25,112,6,9,5,0 -5,26,100,4,9,5,0 -5,27,112,6,9,5,0 -5,28,100,4,9,5,0 -5,29,112,4,9,5,0 -5,30,112,6,9,5,0 -5,31,112,4,9,5,0 -5,32,112,9,9,5,0 -5,33,112,6,9,5,0 -5,34,112,9,9,5,0 -5,35,112,6,9,5,0 -5,36,112,9,9,5,0 -5,37,112,6,9,5,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-5-predictions.csv deleted file mode 100644 index 328eac11..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-5-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -6,8,107,1,7,8,0 -6,9,110,6,7,5,1 -6,10,107,6,2,0,0 -6,11,110,6,9,0,0 -6,12,108,6,9,5,0 -6,13,112,6,9,8,0 -6,14,108,6,9,0,0 -6,15,112,6,9,0,0 -6,16,108,6,0,0,0 -6,17,110,6,9,0,0 -6,18,108,6,0,5,0 -6,19,110,6,9,5,0 -6,20,108,6,9,5,0 -6,21,112,6,9,5,0 -6,22,112,1,9,5,0 -6,23,112,6,0,5,0 -6,24,112,1,9,5,0 -6,25,112,6,0,5,0 -6,26,112,1,9,0,0 -6,27,112,6,0,5,0 -6,28,100,6,9,0,0 -6,29,100,4,9,5,0 -6,30,112,6,9,5,0 -6,31,100,6,9,5,0 -6,32,112,6,9,5,0 -6,33,100,6,9,5,0 -6,34,100,6,9,5,0 -6,35,100,4,9,5,0 -6,36,112,6,9,5,0 -6,37,100,9,9,5,0 -7,8,110,7,2,7,0 -7,9,119,1,2,0,0 -7,10,119,7,0,5,1 -7,11,107,6,0,5,0 -7,12,103,6,9,5,0 -7,13,112,6,9,8,0 -7,14,112,6,9,5,0 -7,15,112,6,9,0,0 -7,16,112,6,9,0,0 -7,17,100,4,9,0,0 -7,18,100,9,9,5,0 -7,19,112,6,9,5,0 -7,20,100,6,9,5,0 -7,21,100,6,9,5,0 -7,22,100,6,9,5,0 -7,23,100,6,9,5,0 -7,24,100,4,9,5,0 -7,25,112,4,9,5,0 -7,26,112,9,9,5,0 -7,27,112,6,9,5,0 -7,28,100,4,9,5,0 -7,29,112,9,9,5,0 -7,30,112,6,9,5,0 -7,31,112,9,9,5,0 -7,32,112,6,9,5,0 -7,33,112,6,9,5,0 -7,34,112,6,9,5,0 -7,35,100,6,9,5,0 -7,36,112,6,9,5,0 -7,37,100,6,9,8,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-6-predictions.csv deleted file mode 100644 index 648373ce..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-6-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -8,8,107,1,2,0,0 -8,9,119,6,2,7,1 -8,10,107,7,2,0,0 -8,11,103,6,2,0,0 -8,12,121,4,9,0,0 -8,13,112,6,9,5,0 -8,14,108,6,9,0,0 -8,15,108,6,9,0,0 -8,16,108,6,0,0,0 -8,17,110,6,0,0,0 -8,18,110,6,9,0,0 -8,19,108,6,9,5,0 -8,20,112,6,9,5,0 -8,21,112,6,9,4,0 -8,22,112,6,9,5,0 -8,23,112,6,9,5,0 -8,24,112,6,9,5,0 -8,25,112,1,9,5,0 -8,26,112,6,9,5,0 -8,27,100,1,9,0,0 -8,28,100,6,9,5,0 -8,29,100,6,9,5,0 -8,30,100,1,9,5,0 -8,31,100,6,9,5,0 -8,32,100,4,9,5,0 -8,33,112,4,9,5,0 -8,34,112,4,9,5,0 -8,35,112,4,9,5,0 -8,36,112,9,9,5,0 -8,37,112,6,9,5,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-7-predictions.csv deleted file mode 100644 index fe16cefa..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-predictions/sequifier-test-hp-search-custom-eval-run-2-best-1-7-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -9,8,107,1,2,7,1 -9,9,107,1,2,3,1 -9,10,110,0,2,3,1 -9,11,110,1,2,0,1 -9,12,103,0,7,0,1 -9,13,103,6,7,0,0 -9,14,112,6,9,0,0 -9,15,113,6,7,0,0 -9,16,110,6,2,0,0 -9,17,110,6,2,0,0 -9,18,102,6,2,0,0 -9,19,110,6,2,0,0 -9,20,102,6,2,0,1 -9,21,110,6,2,0,1 -9,22,110,6,2,0,1 -9,23,110,6,2,0,1 -9,24,110,6,2,0,1 -9,25,110,6,2,0,1 -9,26,110,6,2,0,1 -9,27,102,6,2,0,1 -9,28,110,6,2,0,1 -9,29,102,6,2,0,1 -9,30,110,6,2,0,1 -9,31,102,6,2,0,1 -9,32,110,6,2,0,1 -9,33,102,6,2,0,1 -9,34,110,6,2,0,1 -9,35,110,6,2,0,1 -9,36,102,6,2,0,1 -9,37,110,6,2,0,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-0-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-0-predictions.csv deleted file mode 100644 index 9c9a70fe..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-0-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -0,8,127,6,2,0,1 -0,9,118,6,2,0,1 -0,10,118,6,2,2,1 -0,11,118,6,2,2,1 -0,12,118,6,7,2,1 -0,13,118,6,3,2,1 -0,14,118,6,3,6,1 -0,15,118,6,3,6,1 -0,16,127,6,3,other,0 -0,17,127,6,3,0,1 -0,18,127,6,3,0,1 -0,19,127,6,3,0,1 -0,20,118,6,3,0,1 -0,21,118,6,3,0,1 -0,22,118,6,3,2,1 -0,23,118,6,3,2,1 -0,24,118,6,3,2,1 -0,25,124,6,3,0,1 -0,26,124,6,3,0,1 -0,27,124,6,3,0,1 -0,28,104,6,3,0,1 -0,29,104,6,3,1,1 -0,30,109,6,3,8,1 -0,31,109,6,3,1,1 -0,32,109,4,3,8,0 -0,33,113,3,3,0,1 -0,34,122,3,5,8,0 -0,35,118,3,5,0,1 -0,36,118,6,5,8,0 -0,37,118,6,5,2,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-1-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-1-predictions.csv deleted file mode 100644 index 18c70481..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-1-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -1,8,118,6,2,2,1 -1,9,118,6,9,0,1 -1,10,118,6,9,2,1 -1,11,118,6,9,2,1 -1,12,118,6,9,2,1 -1,13,118,6,3,2,1 -1,14,124,6,3,2,1 -1,15,104,6,3,8,1 -1,16,114,6,3,5,1 -1,17,114,6,3,5,1 -1,18,114,6,3,5,1 -1,19,114,6,3,5,1 -1,20,114,6,3,5,1 -1,21,109,6,3,5,1 -1,22,127,6,3,5,1 -1,23,127,6,9,5,1 -1,24,127,6,3,5,1 -1,25,118,6,3,5,1 -1,26,118,6,3,5,1 -1,27,118,6,3,5,1 -1,28,118,6,3,5,1 -1,29,118,6,3,9,1 -1,30,118,6,3,5,1 -1,31,127,6,3,5,1 -1,32,127,6,3,5,1 -1,33,127,6,3,5,1 -1,34,127,6,3,5,1 -1,35,127,6,3,5,1 -1,36,118,6,3,5,1 -1,37,118,6,3,0,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-2-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-2-predictions.csv deleted file mode 100644 index cec8e864..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-2-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -2,8,127,6,2,0,1 -2,9,127,6,3,0,1 -2,10,127,6,3,0,1 -2,11,118,6,3,0,1 -2,12,118,6,5,2,1 -2,13,118,6,7,2,1 -2,14,118,6,7,2,1 -2,15,124,6,3,2,1 -2,16,124,6,3,2,1 -2,17,124,6,3,2,1 -2,18,124,6,3,0,1 -2,19,104,6,3,0,1 -2,20,104,6,3,1,1 -2,21,109,6,3,0,1 -2,22,109,6,3,0,1 -2,23,104,3,3,8,1 -2,24,113,6,3,8,1 -2,25,113,6,3,8,1 -2,26,113,4,3,8,0 -2,27,113,3,4,8,0 -2,28,unknown,4,4,8,2 -2,29,unknown,4,4,8,0 -2,30,109,4,4,8,2 -2,31,109,4,3,8,2 -2,32,127,3,6,8,1 -2,33,unknown,3,5,4,1 -2,34,unknown,3,9,4,1 -2,35,unknown,0,9,8,1 -2,36,127,4,3,8,0 -2,37,118,4,9,3,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-3-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-3-predictions.csv deleted file mode 100644 index cd3c4c28..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-3-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -3,8,127,2,2,2,1 -3,9,127,6,2,0,1 -3,10,127,6,3,2,1 -3,11,118,6,3,0,1 -3,12,118,6,3,2,1 -3,13,118,6,3,2,1 -3,14,118,6,3,2,1 -3,15,118,6,3,6,1 -3,16,109,6,3,8,1 -3,17,109,6,3,0,1 -3,18,109,6,3,0,1 -3,19,127,6,3,0,0 -3,20,109,6,3,0,1 -3,21,127,6,3,0,1 -3,22,118,6,3,0,1 -3,23,118,4,5,2,1 -3,24,118,6,5,2,1 -3,25,118,6,3,2,1 -3,26,118,6,3,2,1 -3,27,118,6,3,2,1 -3,28,118,6,3,0,1 -3,29,104,6,3,0,1 -3,30,104,6,3,1,1 -3,31,104,6,3,5,1 -3,32,104,6,3,1,1 -3,33,104,6,3,8,0 -3,34,109,6,3,5,1 -3,35,127,6,3,5,0 -3,36,118,6,9,8,0 -3,37,118,6,9,5,1 -4,8,127,6,2,0,1 -4,9,127,6,3,0,1 -4,10,127,6,3,0,1 -4,11,127,6,3,0,1 -4,12,118,6,3,0,1 -4,13,118,6,7,2,1 -4,14,118,1,7,2,1 -4,15,118,1,7,2,1 -4,16,118,6,5,2,1 -4,17,124,6,3,2,1 -4,18,124,6,3,2,1 -4,19,124,6,3,0,1 -4,20,109,6,3,0,1 -4,21,109,6,3,0,1 -4,22,109,6,3,0,1 -4,23,109,6,3,0,1 -4,24,109,6,3,8,1 -4,25,unknown,3,3,0,1 -4,26,124,3,5,8,1 -4,27,124,4,5,2,0 -4,28,124,6,7,2,1 -4,29,unknown,6,5,2,1 -4,30,124,6,3,2,1 -4,31,unknown,6,3,8,1 -4,32,unknown,6,3,8,1 -4,33,unknown,6,3,8,1 -4,34,104,6,3,8,1 -4,35,104,6,3,8,1 -4,36,104,6,3,8,1 -4,37,104,6,3,8,0 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-4-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-4-predictions.csv deleted file mode 100644 index 16a159f1..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-4-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -5,8,127,6,2,2,0 -5,9,118,6,2,0,1 -5,10,127,6,2,0,1 -5,11,127,6,3,0,1 -5,12,118,6,3,0,1 -5,13,118,6,5,2,1 -5,14,118,6,3,2,1 -5,15,124,6,3,8,1 -5,16,118,6,3,2,1 -5,17,127,6,3,8,other -5,18,109,6,3,0,1 -5,19,109,6,3,0,other -5,20,109,6,3,0,1 -5,21,112,6,3,0,1 -5,22,118,6,3,8,1 -5,23,124,6,3,8,1 -5,24,124,4,3,2,1 -5,25,124,6,5,2,1 -5,26,124,6,3,2,1 -5,27,unknown,6,3,2,1 -5,28,104,6,3,8,1 -5,29,104,6,3,8,1 -5,30,104,6,3,8,1 -5,31,104,6,3,8,1 -5,32,104,6,3,5,1 -5,33,104,6,3,8,1 -5,34,127,6,3,5,0 -5,35,109,1,9,8,0 -5,36,127,1,9,5,2 -5,37,127,9,9,5,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-5-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-5-predictions.csv deleted file mode 100644 index 07028e2d..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-5-predictions.csv +++ /dev/null @@ -1,61 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -6,8,127,6,2,0,1 -6,9,127,6,3,0,1 -6,10,127,6,3,0,1 -6,11,127,4,3,0,1 -6,12,127,4,5,0,0 -6,13,112,1,7,2,1 -6,14,118,1,5,2,1 -6,15,118,1,7,2,1 -6,16,118,1,5,2,1 -6,17,118,6,3,2,1 -6,18,118,6,3,2,1 -6,19,118,6,3,2,1 -6,20,118,6,3,2,1 -6,21,109,6,3,0,1 -6,22,109,6,3,0,1 -6,23,109,6,3,0,1 -6,24,109,6,3,0,1 -6,25,109,6,3,0,1 -6,26,127,6,3,0,1 -6,27,118,6,3,0,1 -6,28,118,6,5,0,1 -6,29,118,4,5,other,0 -6,30,118,6,7,0,1 -6,31,118,4,5,2,0 -6,32,118,6,7,2,1 -6,33,118,6,3,2,1 -6,34,118,6,3,0,1 -6,35,127,6,3,0,1 -6,36,127,6,3,0,1 -6,37,127,6,3,2,1 -7,8,127,6,2,2,1 -7,9,127,6,3,0,1 -7,10,127,6,3,0,1 -7,11,118,6,3,0,1 -7,12,118,6,3,2,1 -7,13,118,6,3,2,1 -7,14,118,6,3,2,1 -7,15,118,6,3,2,1 -7,16,118,6,3,0,1 -7,17,124,6,3,8,1 -7,18,unknown,6,3,0,1 -7,19,109,6,3,1,1 -7,20,109,6,3,1,0 -7,21,109,6,3,0,1 -7,22,109,6,3,0,0 -7,23,109,6,5,0,1 -7,24,118,6,5,0,0 -7,25,118,3,7,2,1 -7,26,118,1,5,2,0 -7,27,118,6,7,2,1 -7,28,118,6,5,2,1 -7,29,118,6,3,2,1 -7,30,112,6,3,2,1 -7,31,112,6,3,0,1 -7,32,112,6,3,8,1 -7,33,109,6,3,8,1 -7,34,109,6,3,5,1 -7,35,109,6,3,1,1 -7,36,109,6,3,8,0 -7,37,109,6,3,0,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-6-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-6-predictions.csv deleted file mode 100644 index bc2b4d05..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-6-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -8,8,127,6,2,0,1 -8,9,127,6,3,0,1 -8,10,127,6,3,0,1 -8,11,118,6,9,2,1 -8,12,118,6,7,2,1 -8,13,118,6,9,6,1 -8,14,127,6,3,8,1 -8,15,127,6,3,5,1 -8,16,118,6,3,0,1 -8,17,124,6,3,0,1 -8,18,124,6,3,2,1 -8,19,126,6,3,5,1 -8,20,127,6,3,5,1 -8,21,118,6,3,0,1 -8,22,118,6,3,8,1 -8,23,118,6,3,0,1 -8,24,118,6,3,8,1 -8,25,118,6,3,0,1 -8,26,104,6,3,0,1 -8,27,126,6,3,5,0 -8,28,109,6,3,0,1 -8,29,127,6,3,0,0 -8,30,109,6,3,0,1 -8,31,127,6,3,0,0 -8,32,118,3,5,0,1 -8,33,118,6,5,2,0 -8,34,118,6,7,2,1 -8,35,118,6,5,2,1 -8,36,118,6,3,2,1 -8,37,112,6,3,2,1 diff --git a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-7-predictions.csv b/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-7-predictions.csv deleted file mode 100644 index 940e8923..00000000 --- a/tests/resources/target_outputs/predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-predictions/sequifier-test-hp-search-custom-eval-run-3-best-1-7-predictions.csv +++ /dev/null @@ -1,31 +0,0 @@ -sequenceId,itemPosition,itemId,supCat1,supCat2,supCat3,supCat4 -9,8,127,6,2,other,1 -9,9,127,6,3,0,1 -9,10,127,6,3,0,1 -9,11,118,6,3,0,1 -9,12,118,6,3,other,1 -9,13,126,6,3,8,1 -9,14,113,6,3,8,0 -9,15,113,4,3,0,1 -9,16,118,6,3,0,1 -9,17,118,6,3,8,1 -9,18,118,6,3,0,1 -9,19,118,6,3,0,0 -9,20,118,6,3,0,1 -9,21,127,6,3,8,0 -9,22,118,6,3,0,1 -9,23,118,6,3,8,0 -9,24,109,6,3,0,1 -9,25,127,6,3,0,0 -9,26,112,6,5,0,1 -9,27,112,6,3,2,1 -9,28,118,6,3,8,1 -9,29,118,4,3,6,1 -9,30,124,6,3,8,1 -9,31,124,4,3,2,1 -9,32,124,6,3,2,1 -9,33,124,6,3,2,1 -9,34,104,6,3,1,1 -9,35,104,6,3,1,1 -9,36,104,6,3,8,1 -9,37,104,6,3,5,1 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-0-probabilities.csv deleted file mode 100644 index cd526dfe..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-0-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0063816966,0.006468037,0.024559338,0.0068818387,0.03805276,0.034742553,0.018915702,0.036322363,0.0075609423,0.0050840396,0.031691603,0.021121172,0.022060119,0.035620775,0.009137776,0.27302954,0.0035919647,0.005177132,0.012216523,0.008537154,0.039849125,0.022662228,0.0051864795,0.06108719,0.03615953,0.0095728375,0.13449506,0.005642359,0.020200068,0.019690767,0.010418236,0.027883159 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-1-probabilities.csv deleted file mode 100644 index fde48406..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-1-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0049449983,0.0042691776,0.021052632,0.0058146087,0.030396372,0.032892935,0.013441515,0.028407525,0.0050566397,0.0035540466,0.026184268,0.023003984,0.023714056,0.02700193,0.010255454,0.193688,0.003523743,0.0065743346,0.0075657065,0.0084641315,0.036537226,0.017473338,0.0043345136,0.08128023,0.0313194,0.007980294,0.2656846,0.0042771567,0.018264784,0.017538315,0.00946817,0.0260359 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-2-probabilities.csv deleted file mode 100644 index 9d1b4695..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-2-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0070600286,0.005355665,0.024419116,0.006750209,0.03974409,0.060156815,0.021477934,0.029202912,0.006069319,0.0048991265,0.030470513,0.029163782,0.02428838,0.040785775,0.008904983,0.2596093,0.0037373006,0.006169808,0.0080467705,0.010179635,0.037312083,0.021897098,0.005871768,0.067005344,0.024129355,0.008555806,0.117676124,0.00547475,0.022196412,0.01896278,0.011333607,0.033093367 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-3-probabilities.csv deleted file mode 100644 index 1502f2fd..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-3-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0073428494,0.0054249666,0.023946963,0.0076724873,0.05550431,0.041024055,0.02343562,0.020106466,0.0058254926,0.005979295,0.028401894,0.027254183,0.03406939,0.03580471,0.0151072955,0.1438499,0.0050315387,0.008578817,0.010699981,0.009593445,0.039330103,0.022077711,0.0072748065,0.116141096,0.03376495,0.009846874,0.17126702,0.0052832607,0.029783443,0.016034205,0.010827838,0.023715047 -0.0064484207,0.0047859964,0.030502057,0.006627743,0.040947184,0.053503774,0.015772693,0.036306743,0.0063552163,0.0056825983,0.029170575,0.01872254,0.034786753,0.037946172,0.016469195,0.19048862,0.004163757,0.0076852962,0.012417914,0.010849618,0.02091185,0.017051233,0.0060045645,0.041049585,0.118274905,0.009881875,0.1420341,0.0046904692,0.015074657,0.022749325,0.013102149,0.019542495 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-4-probabilities.csv deleted file mode 100644 index 0842a970..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-4-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0070105107,0.005817882,0.02375718,0.0067135287,0.030807294,0.05775498,0.019987397,0.0336207,0.007363106,0.005212145,0.029612567,0.028933655,0.021020675,0.036609236,0.009110481,0.2528482,0.003447206,0.0057708235,0.008732559,0.009616723,0.03541558,0.02171815,0.0055170287,0.059915405,0.022731164,0.009284548,0.14595954,0.006151366,0.020992719,0.020696605,0.011107996,0.036763098 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-5-probabilities.csv deleted file mode 100644 index b1ea5679..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-5-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0061376016,0.0055368184,0.02686486,0.006603274,0.05257738,0.04243002,0.019543372,0.03439729,0.0066835904,0.0054204813,0.027758658,0.018920917,0.026187373,0.03562787,0.0103454115,0.21988945,0.0038413862,0.0058459127,0.011070427,0.008652827,0.04451155,0.019691685,0.0054005976,0.073532715,0.056998175,0.008044991,0.14140613,0.00463186,0.019962309,0.017421842,0.010648626,0.023414658 -0.006748481,0.0056581046,0.025895737,0.0065028435,0.036626477,0.04927831,0.01836768,0.033150148,0.006620763,0.0048519536,0.030104272,0.023016918,0.02434799,0.040022057,0.008816339,0.259297,0.0034051202,0.005711451,0.00943816,0.009649961,0.0344164,0.01987012,0.0051980447,0.06372621,0.030300407,0.008548483,0.14363155,0.005186423,0.022001177,0.019676577,0.010164736,0.029770095 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-6-probabilities.csv deleted file mode 100644 index 179c80ec..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-6-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.006577232,0.005941025,0.025182042,0.0067693973,0.04229883,0.07847597,0.0240807,0.0301303,0.0069031618,0.0057024322,0.03144487,0.028760783,0.024837973,0.04591679,0.012943257,0.22671296,0.0036830874,0.005482532,0.009327667,0.0106034735,0.033890318,0.023517158,0.005874784,0.059042808,0.030655574,0.009653993,0.10965886,0.005722431,0.023167748,0.021588275,0.0129337795,0.032519735 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-7-probabilities.csv deleted file mode 100644 index 462d3218..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-1-best-3-itemId-probabilities/sequifier-model-categorical-1-best-3-7-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0062551964,0.005907708,0.02252796,0.006632302,0.0375025,0.042552833,0.01901747,0.029515766,0.0066615692,0.0049623456,0.028662894,0.025402665,0.024885334,0.03338471,0.00894907,0.23237301,0.0036392827,0.0054352307,0.00970244,0.008878192,0.044655215,0.022057772,0.004962897,0.08231816,0.02434962,0.008952783,0.16011275,0.0052076653,0.023783736,0.018114585,0.01071558,0.03192075 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-0-probabilities.csv deleted file mode 100644 index 030ea209..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-0-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0056786733,0.0056396397,0.019625373,0.00989916,0.028172797,0.06280763,0.018479379,0.03159086,0.00802512,0.004560256,0.02441183,0.030483417,0.024728071,0.034464385,0.02173319,0.23811956,0.009270334,0.010733643,0.013194141,0.012353504,0.027120981,0.01968651,0.007962703,0.08780438,0.07940018,0.006885157,0.066043444,0.0059645167,0.032393124,0.024882888,0.012979289,0.014905925 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-1-probabilities.csv deleted file mode 100644 index 14379442..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-1-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.007233303,0.006430847,0.02017487,0.009407937,0.03021497,0.063631795,0.015276678,0.030304415,0.009666988,0.0051930123,0.022986863,0.028146453,0.02071075,0.03240998,0.026094265,0.2046195,0.012769067,0.010396391,0.013358195,0.012718733,0.019840602,0.020281564,0.011074808,0.09205814,0.100550726,0.008028014,0.06728822,0.0068513094,0.025007999,0.030172698,0.01773199,0.019368906 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-2-probabilities.csv deleted file mode 100644 index f54d9b81..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-2-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.007526629,0.0073912153,0.014185694,0.012860334,0.025072798,0.06497633,0.019334141,0.030267734,0.010712494,0.005902856,0.025737327,0.036715742,0.025636889,0.027740806,0.023948258,0.27562156,0.012211119,0.012502682,0.012710197,0.011621473,0.015836276,0.020809514,0.009763865,0.0765267,0.053563163,0.007314694,0.053682905,0.008438264,0.03344781,0.028250687,0.015079057,0.014610726 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-3-probabilities.csv deleted file mode 100644 index b5ae3c31..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-3-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.007322969,0.005654382,0.019285746,0.01174128,0.028390037,0.051265758,0.017005999,0.023170853,0.00963273,0.0050818776,0.019823872,0.027385317,0.024844429,0.025241857,0.024961751,0.27105013,0.010011087,0.008763377,0.012323763,0.010727558,0.01852274,0.019683188,0.010597888,0.06964346,0.08186063,0.0069930656,0.08686133,0.0072649037,0.02479653,0.024108676,0.017185295,0.018797552 -0.0073998687,0.0062193214,0.028439596,0.010987616,0.04028016,0.06468185,0.016779186,0.03044594,0.008741515,0.0064253476,0.019445894,0.021537095,0.028751887,0.024736227,0.023209155,0.2096015,0.013735791,0.012793584,0.016223645,0.0155749805,0.02702452,0.021603411,0.012366309,0.06640046,0.08558532,0.0070591993,0.07619427,0.007099011,0.026309213,0.02994487,0.015465732,0.018937428 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-4-probabilities.csv deleted file mode 100644 index 0c5b5d15..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-4-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.008149271,0.0075202077,0.018574426,0.013677846,0.027515505,0.07347045,0.022090634,0.027623143,0.009446033,0.004922327,0.02111737,0.029754518,0.027266419,0.030263303,0.022770183,0.26600966,0.013034052,0.0148931295,0.014900886,0.014568352,0.01946197,0.021304643,0.010476352,0.08244683,0.05353372,0.00757325,0.033484895,0.008503189,0.039844204,0.028181866,0.012981479,0.014639842 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-5-probabilities.csv deleted file mode 100644 index 0759929f..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-5-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0058703404,0.005491598,0.018997362,0.009865255,0.027035879,0.053124264,0.01636745,0.030759059,0.009746491,0.005269951,0.030089295,0.031095663,0.022614336,0.024479996,0.023500303,0.25250036,0.010035898,0.009619795,0.013611923,0.01075333,0.020063184,0.019546557,0.009071543,0.081420965,0.08086878,0.0082148705,0.07848736,0.0068253702,0.028736375,0.02457363,0.015248171,0.016114665 -0.008826475,0.00650084,0.03350764,0.011784676,0.035665788,0.057461075,0.017939368,0.026917169,0.009738677,0.006538719,0.024049368,0.028872915,0.029989129,0.031923886,0.02343755,0.1983992,0.013674415,0.0132244,0.015470912,0.01583799,0.026933711,0.020640487,0.011796321,0.09157396,0.064802006,0.007862755,0.07190949,0.0074055316,0.029487757,0.027891217,0.013090327,0.016846225 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-6-probabilities.csv deleted file mode 100644 index cecbf4eb..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-6-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0066114813,0.0059746164,0.015643341,0.009955672,0.025352968,0.06201794,0.017243594,0.029164374,0.009917572,0.0053090053,0.026186187,0.028928613,0.02072396,0.0292177,0.023453875,0.29139313,0.011147256,0.010212424,0.012978361,0.010813403,0.0158392,0.019197216,0.008891929,0.07571251,0.06993627,0.0069566243,0.05914112,0.0064757746,0.029883983,0.025710123,0.015420712,0.01458909 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-7-probabilities.csv deleted file mode 100644 index 917cbb24..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-best-3-itemId-probabilities/sequifier-model-categorical-3-best-3-7-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.006754691,0.006674459,0.016557487,0.0103658335,0.02666079,0.058823474,0.017140431,0.028328251,0.010410326,0.0055948445,0.026582949,0.03277368,0.021883957,0.027258111,0.022582687,0.2764412,0.0118644545,0.01098305,0.013153517,0.010666833,0.01935101,0.021501819,0.009382378,0.08465579,0.058386862,0.007471711,0.063156575,0.007812191,0.031189099,0.025576143,0.01507718,0.0149383 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv deleted file mode 100644 index c39d520b..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.017302375,0.01482844,0.014713044,0.015540072,0.033318657,0.022022286,0.029224692,0.023904966,0.012149988,0.009064443,0.015359024,0.049968407,0.0245197,0.020110352,0.019914918,0.056400876,0.0115936,0.012584733,0.04621322,0.035850577,0.08206279,0.09154765,0.017336203,0.032738093,0.013035035,0.021850908,0.124157034,0.013448811,0.060038418,0.022390943,0.013344151,0.023465507 -0.009482484,0.0060274336,0.046130657,0.009335471,0.06764614,0.08857251,0.05499592,0.017070245,0.009937557,0.0076791495,0.04376102,0.053096063,0.028434156,0.034147743,0.05993116,0.033161834,0.009860223,0.01984055,0.01256225,0.02168444,0.098040834,0.050862912,0.01778495,0.040789753,0.016320387,0.015451832,0.026600784,0.010373869,0.010914272,0.027834028,0.028337134,0.023332264 -0.010967831,0.011053853,0.02335534,0.016658744,0.05860075,0.048015736,0.028505739,0.027371904,0.016789401,0.013281509,0.045727536,0.03805783,0.022198936,0.065886594,0.057020094,0.06262433,0.016529106,0.017458213,0.021432064,0.024096718,0.019590493,0.026042046,0.012923263,0.09111785,0.032283496,0.028794264,0.050714724,0.009529016,0.025877263,0.026908096,0.021348508,0.029238785 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv deleted file mode 100644 index c159c246..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.017744087,0.006948684,0.00858048,0.016410597,0.055733632,0.034286235,0.036515333,0.028605288,0.013186285,0.011912816,0.023324167,0.059328143,0.045488466,0.033475645,0.042482805,0.052356903,0.014595887,0.031864792,0.020503258,0.021953864,0.05863695,0.04702418,0.0390225,0.034219332,0.057502806,0.014538983,0.023737786,0.014883765,0.034403622,0.0456665,0.022873037,0.032193214 -0.009073278,0.009965046,0.01715093,0.014555804,0.03801386,0.058020845,0.079927094,0.033448976,0.017974019,0.01410797,0.0699865,0.025571192,0.030388791,0.047355235,0.055798102,0.054081377,0.013673913,0.023626404,0.014785025,0.04074311,0.020208733,0.03655757,0.013098806,0.049145572,0.024543593,0.020248242,0.051604807,0.012114416,0.017285446,0.031925026,0.027879516,0.027140763 -0.014087621,0.012287442,0.03534718,0.01643796,0.031933516,0.06289021,0.026609892,0.083969444,0.02233677,0.018736115,0.04442197,0.026389923,0.010843629,0.01895697,0.027663156,0.03439375,0.017669836,0.021168692,0.018195163,0.06071764,0.021065582,0.020497372,0.022821855,0.041567888,0.020678319,0.021883357,0.15086576,0.016183114,0.022206273,0.032690797,0.008919726,0.015563149 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv deleted file mode 100644 index 37799880..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.018528365,0.011348305,0.026592543,0.016287476,0.10766971,0.032645565,0.019116517,0.02492655,0.019955833,0.011527015,0.02259085,0.027787218,0.03303038,0.031579427,0.01690325,0.07815983,0.013164263,0.017135935,0.020429073,0.034548,0.031517807,0.024956997,0.0139586525,0.11551274,0.068975806,0.023149172,0.035436425,0.009975799,0.044534132,0.014743276,0.015941283,0.017371824 -0.011191083,0.005224706,0.020623794,0.012053271,0.12365075,0.039831124,0.028327364,0.024147004,0.008681646,0.007843214,0.024527263,0.03959842,0.034102652,0.030959982,0.070454076,0.05114417,0.009098287,0.013604898,0.020304052,0.028584411,0.07921365,0.023622217,0.0178833,0.04620491,0.05705545,0.011323,0.041417815,0.0121953515,0.02816187,0.03845514,0.009098287,0.031416837 -0.009739021,0.0067989323,0.029710405,0.013416068,0.049846753,0.05431991,0.024651846,0.03325377,0.013156578,0.0067989323,0.031200917,0.028736616,0.030504202,0.02744746,0.040842965,0.032546956,0.011078949,0.017293995,0.013896115,0.041975174,0.037369967,0.020577284,0.021480734,0.09096873,0.022776976,0.013363764,0.080279626,0.018699272,0.08748377,0.02619055,0.0155629115,0.048030872 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv deleted file mode 100644 index 8b6aa288..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv +++ /dev/null @@ -1,7 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.01669491,0.010389542,0.026836602,0.01910696,0.12638526,0.04060527,0.023563892,0.02014098,0.014828836,0.010469111,0.022223387,0.025744986,0.03159677,0.02423024,0.015737114,0.06580435,0.010926759,0.014931464,0.018498765,0.041775487,0.035436004,0.022769153,0.012573552,0.13099544,0.051511902,0.019180572,0.056185905,0.010143914,0.028734636,0.014651826,0.018792372,0.018534083 -0.016519701,0.007162946,0.045259815,0.022103863,0.038290083,0.053124834,0.06819331,0.036727816,0.018657679,0.011355199,0.043989643,0.13988414,0.022740448,0.019094305,0.023814064,0.021139339,0.018106835,0.014832587,0.014998272,0.04460881,0.027002994,0.03233611,0.028538257,0.04015461,0.018103521,0.01528009,0.052740376,0.013800199,0.026066186,0.028910367,0.012520822,0.023942681 -0.011194919,0.010561037,0.03043257,0.029184885,0.16755833,0.032587912,0.021776065,0.02243084,0.018040746,0.011284099,0.022678632,0.04638041,0.06720232,0.021271471,0.02572572,0.031782538,0.011916202,0.008333079,0.020233061,0.030141652,0.019565124,0.017642204,0.020604435,0.042393837,0.04602931,0.016611801,0.08245273,0.01454134,0.023293085,0.027460624,0.024097573,0.024591517 -0.01608547,0.010368459,0.031037511,0.011805071,0.03809329,0.04238475,0.043802626,0.035902377,0.012958213,0.009891841,0.02051157,0.070250556,0.014836899,0.022624696,0.038268067,0.056611795,0.014446229,0.016333792,0.02795824,0.023835989,0.049290363,0.06045451,0.016494084,0.02983232,0.015678363,0.023880403,0.1506435,0.015196918,0.023785125,0.031565513,0.008330273,0.016841229 -0.0137396315,0.010914814,0.02667995,0.0098691415,0.03460263,0.034310307,0.03730518,0.018527672,0.008636964,0.009481218,0.04571112,0.032784116,0.023355061,0.099395365,0.03462587,0.048355766,0.008171825,0.0144227585,0.03637852,0.022415577,0.082270995,0.057494033,0.013951741,0.05162547,0.023641635,0.018418867,0.04009568,0.008299499,0.050505035,0.025156023,0.022480657,0.036376856 -0.011915657,0.0036924249,0.04062848,0.012023047,0.110737495,0.049395066,0.031113395,0.026186328,0.011969596,0.006231006,0.030099835,0.051332965,0.03739974,0.026679186,0.053064372,0.040329844,0.0105973575,0.011433326,0.018081808,0.02057271,0.08053413,0.015506836,0.046564084,0.03711733,0.023726063,0.011824371,0.031816028,0.013342459,0.01617631,0.02257506,0.055539753,0.041793946 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv deleted file mode 100644 index 0150b2b0..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.012020789,0.0114255985,0.013781902,0.011336684,0.030397858,0.024943626,0.019588038,0.027308403,0.0142750405,0.007791581,0.024653023,0.027215222,0.019322054,0.05623878,0.032358356,0.05221594,0.013253926,0.02056822,0.01688594,0.029197672,0.020131039,0.03461389,0.02210962,0.06372689,0.028759044,0.0143309105,0.03210654,0.013048443,0.2367741,0.017320175,0.009849482,0.04245126 -0.00968035,0.0060578086,0.02164524,0.011229403,0.049160875,0.04091531,0.09700724,0.020897496,0.006810977,0.012527305,0.029767573,0.033377804,0.042296633,0.04004565,0.060468912,0.05906815,0.01140624,0.013975218,0.029484136,0.020215027,0.053155582,0.022861931,0.017122796,0.05636322,0.05212746,0.013077319,0.04449998,0.0103855,0.009987637,0.0559246,0.02224527,0.026211333 -0.010586183,0.007959717,0.014697459,0.012869525,0.055902667,0.026143547,0.028727092,0.017867567,0.012769373,0.009161578,0.022964824,0.09621457,0.035395365,0.022852965,0.108176954,0.040501803,0.013699538,0.028454864,0.0163962,0.01607907,0.098496236,0.06434358,0.015342754,0.026869912,0.020049846,0.020049846,0.04634494,0.011268932,0.009676554,0.020686297,0.038122308,0.031327948 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv deleted file mode 100644 index 2efab20a..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv +++ /dev/null @@ -1,7 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.010618431,0.00532009,0.031241473,0.010025754,0.12621595,0.03801969,0.03556635,0.03164376,0.010138364,0.0072703697,0.0275396,0.05265158,0.03624807,0.020274848,0.062158115,0.04025004,0.010453169,0.011500197,0.021514071,0.021920329,0.09396764,0.020422643,0.019221632,0.03632739,0.034134757,0.013216465,0.06821319,0.010370556,0.018837776,0.03664193,0.012034463,0.026041366 -0.011248999,0.007763945,0.020370394,0.013426363,0.052157905,0.02627952,0.029951978,0.030582616,0.009331442,0.007465146,0.03328639,0.038111825,0.01810378,0.015171406,0.036365446,0.036902063,0.011336534,0.022397265,0.027198253,0.029846832,0.23694438,0.030660179,0.018613372,0.04210234,0.021134239,0.013412438,0.06735742,0.007580391,0.008907657,0.029101651,0.021942623,0.024945194 -0.014820769,0.016931016,0.03134662,0.017758721,0.07756528,0.030280596,0.027700873,0.026437817,0.011194134,0.014254735,0.025730982,0.038801637,0.034535516,0.03318171,0.038952313,0.064535856,0.014877869,0.03107635,0.022293469,0.017415768,0.03861853,0.074516445,0.018766109,0.05231379,0.03215885,0.030682446,0.0475016,0.010968913,0.011374928,0.018307073,0.054861203,0.020238126 -0.012825078,0.0054109595,0.04036408,0.014380072,0.06844456,0.030411042,0.0412312,0.025175504,0.0114584975,0.008511076,0.035235465,0.17975047,0.029292798,0.02909468,0.031851053,0.026281644,0.013975125,0.009772897,0.020356039,0.021315373,0.06219029,0.024319902,0.021852175,0.06849053,0.020569606,0.013285601,0.041427664,0.007992975,0.013719467,0.018521097,0.022934454,0.029558716 -0.014430656,0.004168151,0.06305564,0.021247871,0.09074368,0.07415783,0.03126866,0.020979187,0.017970206,0.010274172,0.0257828,0.059320774,0.028706122,0.025938272,0.037631854,0.03580352,0.011777239,0.01175139,0.014962524,0.015961098,0.07775944,0.011435114,0.018415455,0.09703935,0.028552026,0.013933843,0.04162163,0.008481792,0.013676437,0.024435634,0.02378487,0.024932796 -0.008010261,0.0074686627,0.023822267,0.013119117,0.074442916,0.04628194,0.04254105,0.058279544,0.0090823565,0.005861148,0.038926944,0.022764165,0.046605628,0.03756041,0.03390609,0.0453148,0.0128496755,0.017593464,0.024916999,0.030104289,0.038540415,0.029914714,0.023720885,0.05801514,0.032298174,0.012752013,0.07088667,0.011338414,0.037955638,0.02446528,0.02521379,0.035447173 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv deleted file mode 100644 index 1259f535..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.014694284,0.00484566,0.038039703,0.01950482,0.078818366,0.048180703,0.04508512,0.019164959,0.01751819,0.007865283,0.041291706,0.043697998,0.030476343,0.028685847,0.052504353,0.059263274,0.009195448,0.0085710995,0.020361185,0.016456816,0.048748642,0.016618315,0.017794061,0.0893129,0.04169692,0.01588831,0.03295278,0.010792644,0.014636996,0.03708601,0.046154283,0.024097003 -0.011956437,0.007511431,0.03889856,0.009203197,0.098943695,0.040606413,0.027962914,0.014880026,0.011863391,0.0074529764,0.039050806,0.030681275,0.035141923,0.045833707,0.02887874,0.050142225,0.0061787344,0.0146493325,0.011364432,0.027826708,0.039821014,0.049172387,0.013131577,0.13418755,0.050733287,0.021128137,0.03740838,0.008713412,0.023766605,0.01837438,0.023593169,0.020943254 -0.013887067,0.0071764276,0.0151924975,0.018254206,0.07991457,0.04781246,0.023301933,0.017418284,0.01525196,0.008724318,0.026781103,0.08342324,0.027746145,0.042691726,0.06127263,0.03917613,0.018254206,0.018218588,0.014782706,0.020644369,0.04244231,0.036910545,0.021932937,0.05985325,0.017282734,0.021299692,0.021175254,0.008931208,0.025170805,0.02839026,0.069430985,0.04725543 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv deleted file mode 100644 index a4ae747f..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-itemId-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.021899408,0.01375122,0.06875178,0.01996887,0.025484513,0.04252252,0.03902086,0.08623405,0.015073292,0.016425943,0.052713815,0.047996476,0.014524183,0.009053567,0.018360289,0.018869255,0.023249278,0.015858501,0.025478292,0.022211714,0.030988853,0.030687701,0.028464755,0.0355289,0.016980492,0.014411155,0.1662205,0.013224419,0.022462567,0.021867353,0.007360498,0.014354971 -0.02203823,0.012158787,0.019582076,0.019851638,0.061747413,0.028869862,0.03577158,0.022407154,0.016234111,0.010899066,0.018905604,0.054705177,0.01843162,0.026778596,0.03470488,0.05385705,0.018467655,0.027081026,0.022649152,0.018252501,0.13860744,0.05000458,0.029917473,0.035182618,0.025070326,0.025365846,0.045087226,0.0137239965,0.015131854,0.035354827,0.016880805,0.02627989 -0.01170118,0.0052330913,0.030678341,0.019595789,0.058046952,0.14593004,0.036824893,0.02589769,0.017668778,0.0141143175,0.025014492,0.04591892,0.020697279,0.014505581,0.07934078,0.029359365,0.017807355,0.026954826,0.011655562,0.028372828,0.08185932,0.015562217,0.02015868,0.029821709,0.016991898,0.014791678,0.0247291,0.02443503,0.010245896,0.056261037,0.010949386,0.028875977 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv deleted file mode 100644 index 0ed4b179..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.030829223,0.02203265,0.07899471,0.067452386,0.13132587,0.15056586,0.08587365,0.12193194,0.0947754,0.11232897,0.057428077,0.046461277 -0.014666316,0.022189427,0.059498083,0.06742016,0.039249096,0.14300752,0.37238505,0.06761797,0.044562005,0.027187055,0.042771243,0.09944612 -0.025165679,0.016633498,0.03282223,0.10289244,0.07257083,0.060428306,0.11959067,0.06701881,0.24063799,0.099726774,0.026998831,0.13551399 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv deleted file mode 100644 index c4f4b91a..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.042400617,0.021825965,0.08374923,0.15631144,0.031142365,0.090377815,0.19151676,0.0473013,0.07689015,0.11127522,0.05892494,0.08828422 -0.015833566,0.013437772,0.041961044,0.10164713,0.037466995,0.06844288,0.11837423,0.034047525,0.14617266,0.08426843,0.057690993,0.28065673 -0.03181457,0.05401281,0.1453952,0.045572266,0.11890011,0.059962142,0.07022276,0.047480304,0.17675562,0.0464711,0.050443903,0.15296924 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv deleted file mode 100644 index 8d04302d..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.022884028,0.023426706,0.13376229,0.06100784,0.048445486,0.04047772,0.04047772,0.064007714,0.46505603,0.03600163,0.033296064,0.031156814 -0.01766297,0.016592825,0.08159303,0.11076467,0.043122653,0.16369955,0.1496335,0.073605254,0.1455974,0.11250896,0.039494358,0.045724865 -0.024478791,0.02061321,0.15053765,0.09872501,0.050129212,0.07090094,0.15837957,0.047740296,0.19254059,0.044152558,0.0707626,0.07103955 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv deleted file mode 100644 index 26f8fed2..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv +++ /dev/null @@ -1,7 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.02404165,0.024330985,0.16612503,0.0601377,0.06399806,0.049517293,0.04449823,0.070558906,0.37823856,0.040439203,0.046034217,0.03208023 -0.027730746,0.02667491,0.066027075,0.05778757,0.0820242,0.27731502,0.11232613,0.03457894,0.06187734,0.090703204,0.050964195,0.11199069 -0.022751989,0.019618228,0.2622568,0.091747545,0.100092806,0.15698826,0.09324552,0.050576176,0.095965005,0.04294408,0.031872693,0.031940855 -0.032131083,0.03407833,0.06330054,0.047110375,0.13916276,0.113678426,0.113963254,0.09667804,0.104930215,0.11553822,0.07334705,0.066081785 -0.020889135,0.015167588,0.021204498,0.12352331,0.04426551,0.2877678,0.10738013,0.10587679,0.09809948,0.04156298,0.02445021,0.10981257 -0.014412873,0.019248405,0.102152325,0.07133191,0.055629157,0.1822007,0.25063998,0.08880837,0.04430273,0.06214931,0.067607224,0.041517083 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv deleted file mode 100644 index 7d06ac54..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.036718734,0.027393846,0.054266773,0.24703673,0.033826884,0.041445564,0.09358162,0.030679652,0.26920536,0.06927283,0.038181443,0.058390565 -0.0143717965,0.020748112,0.026745372,0.053462926,0.02802891,0.068698056,0.29321107,0.06816344,0.0434969,0.24498703,0.029374044,0.10871233 -0.021368038,0.02411876,0.05199026,0.04653555,0.04023385,0.16546689,0.30434018,0.08805062,0.03627733,0.0858431,0.037355866,0.0984196 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv deleted file mode 100644 index dc13ad4c..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv +++ /dev/null @@ -1,7 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.0132217435,0.015582825,0.09537193,0.05511677,0.04859985,0.201613,0.21431485,0.1044041,0.09673497,0.06951364,0.040298074,0.045228217 -0.02334472,0.015194411,0.06716989,0.035730656,0.055619556,0.11289076,0.21729738,0.16236128,0.06862233,0.08559951,0.039524514,0.11664504 -0.062737055,0.03526971,0.066480264,0.083916724,0.07574927,0.04294516,0.17295846,0.14586803,0.07443847,0.07331404,0.10477662,0.061546147 -0.02023797,0.019773984,0.026585264,0.04649983,0.08008181,0.31102097,0.18837911,0.0946825,0.04079707,0.068564005,0.03542132,0.067956254 -0.018193766,0.02195123,0.10250693,0.042961787,0.05208291,0.19067423,0.23882356,0.05122539,0.06386787,0.06638725,0.051385093,0.09994003 -0.019719949,0.01622515,0.09795474,0.22302167,0.03292809,0.054548316,0.14749242,0.117770776,0.15120222,0.051777475,0.046444554,0.040914692 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv deleted file mode 100644 index 01f1cf46..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.01664073,0.014233571,0.055206023,0.044014078,0.064416446,0.14152527,0.23886913,0.112393886,0.10025849,0.08669238,0.050659895,0.07509014 -0.01838463,0.01896822,0.10095148,0.10294256,0.028586118,0.078009255,0.123206116,0.07873634,0.2921128,0.026854172,0.048531745,0.08271667 -0.029839043,0.023057824,0.048528235,0.08008771,0.04224449,0.15695731,0.255764,0.12810484,0.07081965,0.06270827,0.027275093,0.07461351 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv deleted file mode 100644 index cb64c3b7..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat1-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.039938595,0.043183915,0.118075885,0.05954648,0.12374247,0.15490499,0.08697871,0.045789823,0.083974,0.07239011,0.036364503,0.13511053 -0.046179265,0.02545285,0.071640715,0.04229379,0.04180105,0.1114293,0.23961064,0.08378333,0.059353285,0.15230578,0.036175795,0.08997421 -0.02781237,0.0368454,0.15094069,0.03213713,0.0700912,0.1276023,0.24983314,0.03163889,0.04967784,0.062363237,0.035433877,0.125624 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv deleted file mode 100644 index 083b09c1..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-0-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.023895286,0.01832115,0.059314918,0.18721822,0.06704871,0.028936027,0.040173694,0.14868146,0.0849647,0.20481735,0.042764675,0.09386384 -0.013502704,0.015786262,0.1363725,0.077173345,0.068605885,0.14125212,0.054298226,0.09013671,0.08873927,0.15881403,0.12416856,0.031150412 -0.025655951,0.017495839,0.15114097,0.31996542,0.08954807,0.031434327,0.07864097,0.07727069,0.04591569,0.03618069,0.084534384,0.04221698 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv deleted file mode 100644 index d7a54c48..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-1-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.028366823,0.027280107,0.08306996,0.08640018,0.054999802,0.1901026,0.15698618,0.10560158,0.07615487,0.03628172,0.08560232,0.06915384 -0.01920806,0.017903887,0.17525947,0.30758995,0.064238675,0.062589936,0.11315601,0.053346824,0.053817756,0.045363374,0.06276591,0.02476017 -0.039392862,0.044812668,0.17967735,0.1542877,0.18250686,0.05657941,0.05983002,0.052983012,0.036575034,0.07682679,0.089294866,0.027233396 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv deleted file mode 100644 index 3cfad144..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-2-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.042999305,0.035647675,0.075098544,0.21165,0.11240646,0.044537887,0.04333655,0.11529708,0.13665152,0.056853674,0.059698623,0.06582273 -0.0210577,0.013177572,0.25059265,0.12749122,0.0773651,0.04726925,0.043631613,0.1461694,0.05774607,0.052835755,0.1179101,0.04475363 -0.017115196,0.01850594,0.13727663,0.41466334,0.06151393,0.040539283,0.028108178,0.060975652,0.062421646,0.09324955,0.050047114,0.0155835645 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv deleted file mode 100644 index d6845334..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-3-probabilities.csv +++ /dev/null @@ -1,7 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.041693583,0.031973436,0.10998214,0.16479066,0.1252256,0.043118283,0.03657029,0.09519903,0.14785722,0.09291999,0.05095015,0.059719656 -0.022328043,0.022683812,0.04283925,0.41126367,0.050769344,0.05469367,0.059796266,0.040055063,0.084618196,0.088319905,0.086037345,0.03659542 -0.038595863,0.036979344,0.16525516,0.08796479,0.14711224,0.04366683,0.09374597,0.060864523,0.09171209,0.040690783,0.15224949,0.041162893 -0.028332265,0.021141028,0.07007169,0.28262228,0.09273151,0.036750935,0.060434613,0.124088004,0.047553435,0.09717809,0.08297382,0.05612234 -0.012886485,0.011553485,0.10148387,0.28855413,0.030025361,0.045084067,0.02283268,0.114905074,0.054962385,0.22098571,0.051132176,0.045594625 -0.025287734,0.01807564,0.09002567,0.12390211,0.06067184,0.12525174,0.10664663,0.096130595,0.07915938,0.07539393,0.1290897,0.070365 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv deleted file mode 100644 index 1cc44686..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-4-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.021187872,0.01605604,0.054263867,0.5659949,0.045957677,0.034796704,0.03555238,0.069608174,0.0645029,0.0374044,0.031313643,0.023361403 -0.024042008,0.015890798,0.19133413,0.07945869,0.039024033,0.08096902,0.16238318,0.1394373,0.051296122,0.07202193,0.1016168,0.04252598 -0.017251918,0.010221423,0.046895575,0.07552666,0.05393696,0.050017677,0.11118601,0.32807288,0.07731773,0.04220145,0.096978165,0.09039358 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv deleted file mode 100644 index 7ac72445..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-5-probabilities.csv +++ /dev/null @@ -1,7 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.018481381,0.015086826,0.15493174,0.15046775,0.08715649,0.04693676,0.06383222,0.1263513,0.05064553,0.06657839,0.17764094,0.04189063 -0.016217614,0.012148656,0.08499495,0.09927823,0.077306755,0.047871754,0.055010583,0.21122654,0.062933914,0.10617896,0.112716906,0.11411521 -0.04758948,0.026389102,0.04877754,0.053574916,0.05382935,0.09806836,0.07419494,0.1068721,0.23706995,0.060697217,0.050034944,0.14290217 -0.022031544,0.017568294,0.057664018,0.3444,0.03500623,0.048234522,0.055807646,0.08084915,0.07480748,0.12028488,0.08741878,0.05592742 -0.026553975,0.020047663,0.12833178,0.15571688,0.07450259,0.064350314,0.083343506,0.10243373,0.08976791,0.038867597,0.17135589,0.044728138 -0.01926051,0.017816322,0.20410872,0.16115807,0.08684079,0.086861335,0.11499798,0.060789067,0.0708855,0.097253375,0.055153485,0.024874803 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv deleted file mode 100644 index 9c317eff..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-6-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.024021462,0.016381215,0.08735352,0.24451095,0.042655937,0.053293943,0.0703621,0.16674198,0.0637845,0.048809845,0.12784553,0.054239035 -0.019587502,0.01649433,0.1322968,0.19324411,0.07915247,0.08095043,0.03358079,0.15167905,0.1481654,0.07876693,0.03941358,0.026668562 -0.025625726,0.014773212,0.05668684,0.21879344,0.057635788,0.052529253,0.06815239,0.20714946,0.06667327,0.03907457,0.14292884,0.04997713 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv deleted file mode 100644 index 080e0d42..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-3-inf-size-best-3-supCat2-probabilities/sequifier-model-categorical-3-inf-size-best-3-7-probabilities.csv +++ /dev/null @@ -1,4 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.032925528,0.04885123,0.104025796,0.2016933,0.14358173,0.054073382,0.07711691,0.057899076,0.04113686,0.09965061,0.09252246,0.046523213 -0.022180002,0.017545827,0.026339404,0.06680181,0.056901958,0.041035004,0.08519086,0.20880033,0.061623402,0.029155063,0.22053711,0.16388926 -0.017088706,0.023911403,0.14086375,0.034385562,0.080261745,0.05502852,0.046999488,0.06905494,0.028506633,0.050992366,0.4205414,0.0323654 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-0-probabilities.csv deleted file mode 100644 index 9bf90eea..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-0-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0040172087,0.0053837127,0.01794233,0.008481664,0.041915163,0.060892984,0.015276147,0.03922581,0.0074369167,0.0065139355,0.020977434,0.020048343,0.019622974,0.037060324,0.008304551,0.23707671,0.00647016,0.01106858,0.011167494,0.012748863,0.033062108,0.018191332,0.0066894284,0.047790576,0.10322021,0.0052910694,0.11262705,0.00659916,0.017055837,0.026257407,0.015436073,0.016148428 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-1-probabilities.csv deleted file mode 100644 index a5f8bc58..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-1-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004360183,0.006277071,0.017062904,0.009641751,0.043229353,0.05727278,0.014225212,0.038007263,0.007835306,0.006881622,0.023389304,0.016517002,0.020064484,0.039711393,0.008007171,0.2261134,0.007357157,0.012218177,0.012470042,0.014183982,0.030792018,0.019355278,0.0073876814,0.04283245,0.12202452,0.0056234123,0.10076162,0.0072904723,0.015891792,0.029221293,0.018248018,0.015745874 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-2-probabilities.csv deleted file mode 100644 index 59ae4a55..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-2-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004300562,0.006707173,0.0156384,0.009617707,0.04338564,0.06583099,0.014432732,0.035469737,0.008234734,0.00742003,0.021091163,0.015702654,0.019683242,0.038769204,0.008150284,0.23311892,0.008400009,0.011828063,0.012611091,0.01447467,0.03342824,0.019685786,0.007448794,0.041252162,0.11632072,0.006234854,0.091513716,0.007690376,0.015090434,0.031744882,0.018613188,0.016109822 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-3-probabilities.csv deleted file mode 100644 index 3be3b2c1..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-3-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0042441166,0.006550821,0.014524397,0.008744351,0.049152624,0.060611952,0.017833132,0.039753407,0.007960037,0.007296914,0.020477273,0.01763899,0.020569323,0.03703013,0.009169324,0.21462496,0.0073043634,0.011937346,0.012409705,0.016439967,0.026413875,0.018571155,0.00883063,0.052616574,0.12547207,0.0054714065,0.08710683,0.0072533595,0.016600486,0.03165694,0.01850874,0.017224781 -0.0044898638,0.006292895,0.019563716,0.009088499,0.045074668,0.059290387,0.013071808,0.038151007,0.007435785,0.0067792335,0.023250628,0.017980209,0.020187698,0.033060163,0.007900615,0.21634111,0.007439023,0.0124958875,0.012788248,0.014472153,0.030570945,0.019401966,0.0072201015,0.041807372,0.12621097,0.005592084,0.10920363,0.007921556,0.014996767,0.028330075,0.018433904,0.015157071 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-4-probabilities.csv deleted file mode 100644 index 7f4da896..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-4-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004009504,0.00491257,0.020144317,0.008090519,0.03827003,0.05458871,0.012453571,0.032190487,0.0065081106,0.0065404586,0.024827298,0.0168541,0.021103444,0.02935654,0.00813333,0.23077916,0.006991138,0.008845747,0.011959966,0.010493611,0.03519008,0.017726563,0.005951777,0.04237902,0.09315022,0.005446867,0.17138276,0.0067939414,0.01596632,0.020403966,0.0153063685,0.013249553 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-5-probabilities.csv deleted file mode 100644 index c99b1ffa..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-5-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0038721918,0.005179969,0.01615901,0.008171162,0.043776285,0.065734304,0.017611375,0.04358564,0.0065292907,0.0068701566,0.021048758,0.019796705,0.021642718,0.036108084,0.008354264,0.22899278,0.0068489937,0.010631369,0.011964392,0.013607925,0.035942245,0.016927836,0.0066868635,0.05139611,0.11702679,0.0061801723,0.0860707,0.006092417,0.017596524,0.026235523,0.015397529,0.017961878 -0.004533815,0.005865554,0.01902702,0.008466478,0.04793634,0.056333646,0.01547706,0.043305673,0.00786583,0.0073028216,0.02227584,0.020118108,0.02158854,0.033464324,0.007674004,0.21536033,0.00774036,0.011820359,0.011987151,0.0145265665,0.03601687,0.01974236,0.0073520797,0.049199916,0.10748087,0.0053152973,0.11075006,0.0071330904,0.016156215,0.025402343,0.01668626,0.0160948 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-6-probabilities.csv deleted file mode 100644 index 6866d118..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-6-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0042001447,0.0057136347,0.016083458,0.008578314,0.041375857,0.061581593,0.015413483,0.03713672,0.0070986184,0.006767118,0.021731189,0.01628298,0.020695891,0.036857005,0.008185106,0.23843908,0.0069048796,0.01146324,0.011551858,0.014451719,0.030510709,0.018468594,0.0077012125,0.041727073,0.1173028,0.0058830674,0.101249166,0.0075246836,0.015359337,0.030536193,0.018259723,0.014965526 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-7-probabilities.csv deleted file mode 100644 index 283f60ec..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-5-best-3-itemId-probabilities/sequifier-model-categorical-5-best-3-7-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.003893989,0.0049262834,0.016242828,0.008228639,0.040873,0.06588315,0.017734595,0.03817924,0.0072236313,0.006978905,0.020142669,0.020148635,0.020427244,0.038231753,0.007943124,0.24722922,0.0073402775,0.010124343,0.009805043,0.010841479,0.035839595,0.018256433,0.006397891,0.058549624,0.081516184,0.0055939215,0.11330463,0.0059981574,0.018389849,0.022836696,0.013435556,0.017483389 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-0-probabilities.csv deleted file mode 100644 index dd2ce90f..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-0-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.003755447,0.005919478,0.021355113,0.0037806085,0.03258467,0.05897691,0.010546966,0.025433974,0.003790851,0.0039917994,0.024652747,0.02598865,0.024072263,0.03375422,0.015235061,0.1802716,0.004973748,0.009942133,0.011008963,0.019226586,0.0240091,0.023200186,0.0065351687,0.05277045,0.20373958,0.004230297,0.07716799,0.008635033,0.014409094,0.030130265,0.01123739,0.024673715 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-1-probabilities.csv deleted file mode 100644 index 7b7003a3..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-1-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004108263,0.0065284492,0.02557481,0.0044105044,0.0301069,0.056982104,0.009312343,0.028644396,0.0036156578,0.0050784764,0.023851369,0.023929859,0.024968062,0.034262866,0.015073786,0.18393585,0.005726918,0.010663445,0.011374998,0.020710837,0.024605207,0.022978598,0.0071213874,0.046844285,0.20492582,0.0045672082,0.06766794,0.009786485,0.015642509,0.027877597,0.012733039,0.026390014 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-2-probabilities.csv deleted file mode 100644 index fd6efa28..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-2-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004564731,0.006814505,0.024392659,0.004759701,0.032980636,0.049138952,0.009276454,0.02643774,0.0042945277,0.0050275098,0.024946013,0.024413325,0.025301483,0.029949466,0.014343448,0.16849588,0.0060743075,0.011278828,0.012514742,0.020937728,0.026535869,0.027676357,0.00742597,0.047013473,0.20633397,0.0054930253,0.075621,0.0104807485,0.014071454,0.030229164,0.013769736,0.029406633 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-3-probabilities.csv deleted file mode 100644 index ff6923be..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-3-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0041145687,0.005967945,0.019461952,0.004325763,0.0340289,0.056127317,0.01061059,0.025928281,0.0038670604,0.0041770483,0.022350615,0.030672995,0.022840748,0.030872822,0.017933363,0.15256037,0.0054863794,0.010823059,0.011521493,0.021566499,0.01982184,0.023499597,0.008011047,0.048069283,0.23439504,0.004496008,0.0691574,0.0085690105,0.014794546,0.035597444,0.012133661,0.026217332 -0.0041103526,0.006220995,0.024224846,0.004720488,0.03338627,0.055826817,0.008586799,0.028634403,0.0038456598,0.004600682,0.025519812,0.026524976,0.024987198,0.030848276,0.015773777,0.17763434,0.006000569,0.011141409,0.011032916,0.021263443,0.025327949,0.024359219,0.0073631583,0.050158545,0.18946855,0.00479376,0.07836646,0.010019454,0.014274488,0.030027406,0.012687519,0.028269513 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-4-probabilities.csv deleted file mode 100644 index ee563925..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-4-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0039387504,0.0065258797,0.024669716,0.004433713,0.030984672,0.056557093,0.008888177,0.028441487,0.003681258,0.0049070055,0.023858456,0.020984871,0.022434939,0.033650003,0.011881462,0.21709673,0.005855772,0.010228604,0.011613099,0.017855505,0.02831009,0.021852583,0.0060879337,0.04023303,0.16921678,0.00440954,0.09614935,0.009410114,0.01360511,0.0240166,0.012136324,0.026085403 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-5-probabilities.csv deleted file mode 100644 index fcf89d60..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-5-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004052816,0.006258594,0.023345444,0.00449139,0.030517468,0.05268502,0.00887704,0.026460174,0.004128396,0.004363119,0.022904512,0.023697617,0.024568599,0.032895457,0.012510463,0.19101547,0.005496111,0.010627602,0.011373989,0.01724674,0.027330758,0.024636947,0.0059708157,0.04202071,0.18282118,0.0045206607,0.10554287,0.008928312,0.014136884,0.02655903,0.011113563,0.02890221 -0.0059897667,0.008406405,0.026541125,0.0054274616,0.03536363,0.04665471,0.0095773535,0.02762081,0.005177147,0.0062065427,0.025016924,0.032284416,0.029640928,0.028332105,0.019341344,0.11613233,0.0074259285,0.013591332,0.0128795,0.027375998,0.021657849,0.031640794,0.01288579,0.055171557,0.22059953,0.0076504927,0.040872708,0.011520912,0.017828679,0.04107078,0.014468098,0.03564709 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-6-probabilities.csv deleted file mode 100644 index 52fec462..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-6-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.004102211,0.0063269846,0.02072375,0.0048008375,0.034570824,0.059226204,0.0096925255,0.028749216,0.0039989166,0.004183866,0.023596365,0.025296958,0.025585536,0.031098658,0.013962489,0.17769668,0.005346446,0.010870259,0.01055643,0.02107274,0.026247509,0.023033429,0.007330994,0.052349277,0.19195877,0.0043321247,0.08064205,0.009575042,0.016013324,0.02888181,0.012639321,0.02553845 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-7-probabilities.csv deleted file mode 100644 index cffd8dd7..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-50-best-3-itemId-probabilities/sequifier-model-categorical-50-best-3-7-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.0038631586,0.006477673,0.024767213,0.003959401,0.030919716,0.063857056,0.009385453,0.025800953,0.0038557237,0.004502775,0.024877692,0.022792442,0.027524808,0.033570554,0.013489485,0.1976561,0.0054532574,0.010784638,0.010051554,0.020462193,0.026673099,0.021765215,0.006219106,0.048690844,0.1782489,0.0051354156,0.07887633,0.009734921,0.015730219,0.027250536,0.012058978,0.025564646 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-0-probabilities.csv deleted file mode 100644 index bc35a828..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-0-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.02987246,0.0291298,0.034083534,0.026629673,0.032076977,0.030450517,0.035012987,0.029515885,0.035601407,0.02849371,0.034817744,0.030076707,0.029692352,0.030673426,0.029644514,0.038891632,0.030484164,0.032383278,0.02580936,0.035029277,0.03223794,0.033890463,0.03001799,0.031699885,0.033890437,0.025421664,0.032209013,0.029906737,0.028936805,0.03221391,0.02733048,0.033875357 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-1-probabilities.csv deleted file mode 100644 index 9e8c6ade..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-1-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.027755681,0.033875797,0.035090785,0.026336204,0.027495425,0.027336687,0.03491952,0.032417938,0.034913428,0.030351402,0.027904775,0.03262825,0.034914885,0.034497607,0.032371227,0.031979073,0.028421713,0.03136423,0.030974774,0.036030304,0.030301245,0.028893707,0.031219127,0.035561685,0.032045122,0.02882453,0.030305024,0.030230341,0.029906748,0.030945972,0.02952125,0.030665599 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-2-probabilities.csv deleted file mode 100644 index 69d54ab8..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-2-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.028207576,0.03346115,0.03521835,0.026430761,0.02787494,0.02663613,0.03487845,0.031793576,0.035627346,0.03034215,0.02791883,0.032285154,0.03488344,0.03348667,0.031713963,0.033340506,0.028663984,0.03198072,0.029641826,0.03631048,0.030261524,0.029211927,0.0310106,0.035286736,0.032737605,0.028236382,0.031136692,0.030599257,0.030495808,0.030660555,0.029510591,0.030156327 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-3-probabilities.csv deleted file mode 100644 index 98cb886d..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-3-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.033209767,0.027763555,0.02949299,0.033150658,0.034999833,0.0368729,0.02978079,0.030827697,0.02852166,0.028758308,0.037743535,0.03003544,0.027150638,0.030506711,0.031755105,0.03137323,0.03211672,0.029910667,0.030969618,0.028884642,0.033850152,0.03439652,0.030612124,0.028037883,0.030710937,0.031090267,0.030988533,0.029567717,0.030128382,0.032672625,0.029851323,0.034269065 -0.031579662,0.029196938,0.029836416,0.033177998,0.032533493,0.037377365,0.029789915,0.032062903,0.028400185,0.02797571,0.035992093,0.030920217,0.02906526,0.032699972,0.033772778,0.028461806,0.031120755,0.029319655,0.034247786,0.02993261,0.03364331,0.032858204,0.031222675,0.029189978,0.029043447,0.032523304,0.029388353,0.028918054,0.029303428,0.03236885,0.030073373,0.0340035 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-4-probabilities.csv deleted file mode 100644 index 457f32d0..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-4-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.028416378,0.031858474,0.035576776,0.026082192,0.029002782,0.027531331,0.035973124,0.031896308,0.035577897,0.030908158,0.029429477,0.031626973,0.033014473,0.03156573,0.03071435,0.035173185,0.029379372,0.031848334,0.027813641,0.03572987,0.030105326,0.031015579,0.030929359,0.034231957,0.032853644,0.02719569,0.032351676,0.03100664,0.029942783,0.03149756,0.028656607,0.031094389 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-5-probabilities.csv deleted file mode 100644 index 2175edbc..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-5-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.030749116,0.031062534,0.029946074,0.03304623,0.03177652,0.036106378,0.029489571,0.0326022,0.027348582,0.029303638,0.032161407,0.03134503,0.031155298,0.032429844,0.034513615,0.027003089,0.031428523,0.028919302,0.037302244,0.029815737,0.032031134,0.030656634,0.032251637,0.029612571,0.028429309,0.03463406,0.02905775,0.029093673,0.030223982,0.032136854,0.032039963,0.032327514 -0.029171862,0.032260604,0.031479053,0.027849672,0.031409796,0.033327498,0.031761337,0.028732147,0.03429961,0.02492806,0.036731984,0.030338226,0.03251292,0.033941925,0.031204814,0.03442956,0.030674377,0.033014756,0.031726107,0.03608367,0.033338442,0.031844705,0.030129898,0.030746242,0.031700723,0.027094038,0.029256253,0.027283229,0.028538387,0.030670708,0.028805278,0.034714192 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-6-probabilities.csv deleted file mode 100644 index deba9442..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-6-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.028799655,0.031856664,0.03283534,0.030231427,0.03015927,0.035772216,0.030314315,0.03224368,0.02983013,0.02746894,0.033414993,0.03132566,0.032006927,0.034900524,0.034404952,0.0279653,0.029755965,0.029660394,0.036329567,0.032125212,0.032573488,0.032185875,0.032224666,0.03076007,0.02825598,0.031999446,0.028718766,0.026965003,0.029454451,0.031563707,0.030569414,0.033328008 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-7-probabilities.csv deleted file mode 100644 index a882e828..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-itemId-probabilities/sequifier-model-categorical-multitarget-5-best-3-7-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129 -0.032289907,0.028264519,0.03246752,0.029104413,0.033277128,0.030759139,0.032730892,0.029931597,0.033015575,0.031707276,0.03496927,0.030008726,0.027751597,0.029273633,0.02851361,0.03743072,0.03143402,0.0318968,0.024980046,0.03104891,0.032157212,0.03514057,0.029877376,0.030226672,0.03398293,0.027080398,0.034191467,0.031496957,0.03116081,0.03200099,0.029164206,0.032665085 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-0-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-0-probabilities.csv deleted file mode 100644 index 4dbf410d..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-0-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.0748158,0.0772802,0.08608035,0.08609827,0.07993774,0.07705543,0.09423849,0.086710036,0.086828426,0.08284977,0.088354506,0.079750955 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-1-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-1-probabilities.csv deleted file mode 100644 index 6d89b556..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-1-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.07326655,0.08353559,0.07533537,0.08782462,0.08211486,0.08560346,0.08289929,0.08048919,0.08408942,0.0929573,0.089654244,0.082230076 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-2-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-2-probabilities.csv deleted file mode 100644 index bf13de6f..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-2-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.073459856,0.08505141,0.07544217,0.08925692,0.08299525,0.0825825,0.082352445,0.081173785,0.085358195,0.091914274,0.09012994,0.08028323 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-3-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-3-probabilities.csv deleted file mode 100644 index eb1f1644..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-3-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.088295944,0.07419422,0.09625292,0.075507574,0.07814089,0.08647674,0.09078418,0.089773305,0.08116939,0.07382207,0.078370996,0.08721177 -0.0871225,0.0723557,0.095413424,0.07266789,0.07581121,0.09429607,0.089163,0.08606107,0.07906439,0.076575436,0.0773663,0.09410305 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-4-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-4-probabilities.csv deleted file mode 100644 index e1753ff4..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-4-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.07255601,0.0840692,0.07761021,0.089467965,0.08273568,0.07989225,0.08776099,0.08379931,0.08662724,0.08953262,0.08896252,0.07698605 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-5-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-5-probabilities.csv deleted file mode 100644 index 4704ea71..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-5-probabilities.csv +++ /dev/null @@ -1,3 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.08670176,0.07764295,0.09074383,0.07478624,0.07692155,0.09733425,0.08432601,0.08585503,0.08131818,0.07754218,0.07455162,0.09227636 -0.078247,0.06804814,0.09125708,0.07758486,0.07693072,0.08519664,0.09631906,0.07838798,0.0837765,0.080676705,0.08734935,0.09622603 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-6-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-6-probabilities.csv deleted file mode 100644 index 037661f9..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-6-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.083966985,0.073211156,0.091535,0.07379018,0.071819365,0.09759158,0.086949356,0.0855146,0.08113236,0.08044534,0.07800937,0.096034706 diff --git a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-7-probabilities.csv b/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-7-probabilities.csv deleted file mode 100644 index fbf283d5..00000000 --- a/tests/resources/target_outputs/probabilities/sequifier-model-categorical-multitarget-5-best-3-supCat1-probabilities/sequifier-model-categorical-multitarget-5-best-3-7-probabilities.csv +++ /dev/null @@ -1,2 +0,0 @@ -unknown,other,0,1,2,3,4,5,6,7,8,9 -0.081276454,0.08213866,0.08511532,0.08706703,0.08304337,0.07355978,0.0899685,0.08830506,0.08529962,0.08146648,0.087632634,0.07512704 diff --git a/tests/unit/io/test_sequifier_dataset_from_folder_parquet_lazy.py b/tests/unit/io/test_sequifier_dataset_from_folder_parquet_lazy.py deleted file mode 100644 index 1d565fca..00000000 --- a/tests/unit/io/test_sequifier_dataset_from_folder_parquet_lazy.py +++ /dev/null @@ -1,218 +0,0 @@ -import json -from unittest.mock import MagicMock, patch - -import polars as pl -import pytest -import torch - -from sequifier.io.sequifier_dataset_from_folder_parquet_lazy import ( - SequifierDatasetFromFolderParquetLazy, -) - - -@pytest.fixture -def mock_config(): - config = MagicMock() - config.project_root = "." - config.seed = 42 - config.seq_length = 2 - config.column_types = {"item": "Float64"} - config.training_spec.batch_size = 5 - config.training_spec.num_workers = 0 - config.training_spec.sampling_strategy = "exact" - return config - - -@pytest.fixture -def dataset_path(tmp_path): - data_dir = tmp_path / "parquet_data" - data_dir.mkdir() - - # Layout matches the long-format extraction logic - schema = { - "sequenceId": pl.Int64, - "subsequenceId": pl.Int64, - "startItemPosition": pl.Int64, - "inputCol": pl.String, - "2": pl.Float64, - "1": pl.Float64, - "0": pl.Float64, - } - - # Populate 4 files with 10 rows (10 sequences) each - batch_files = [] - for i in range(1, 5): - filename = f"file_{i}.parquet" - rows = [] - for s in range(10): - rows.append((s, 0, s * 2, "item", float(s), float(s + 1), float(s + 2))) - - df = pl.DataFrame(rows, schema=schema, orient="row") - df.write_parquet(data_dir / filename) - batch_files.append({"path": filename, "samples": 10}) - - metadata = {"total_samples": 40, "batch_files": batch_files} - - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - return str(data_dir) - - -def test_initialization(mock_config, dataset_path): - """Tests that metadata is read correctly and __len__ calculates batches.""" - dataset = SequifierDatasetFromFolderParquetLazy(dataset_path, mock_config) - - # 40 total samples / batch size of 5 = 8 batches - assert len(dataset) == 8 - assert dataset.total_samples == 40 - assert dataset.target_samples == 40 - - -def test_iteration_yields_correct_batches(mock_config, dataset_path): - """Tests that the dataset iterates over files and yields structured tensors.""" - dataset = SequifierDatasetFromFolderParquetLazy( - dataset_path, mock_config, shuffle=False - ) - - batches = list(dataset) - assert len(batches) == 8 # 40 samples / batch_size 5 - - # Check structural integrity of first batch - seq_batch, tgt_batch, _, _, _ = batches[0] - assert "item" in seq_batch - assert "item" in tgt_batch - assert isinstance(seq_batch["item"], torch.Tensor) - assert seq_batch["item"].shape == (5, 2) # batch_size=5, seq_len=2 - assert tgt_batch["item"].shape == (5, 2) - - -@patch("torch.distributed.is_initialized", return_value=True) -@patch("torch.distributed.get_rank", return_value=0) -@patch("torch.distributed.get_world_size", return_value=2) -def test_distributed_sharding(mock_ws, mock_rank, mock_init, mock_config, dataset_path): - """Tests that the dataset correctly shards files across distributed GPU ranks.""" - dataset = SequifierDatasetFromFolderParquetLazy( - dataset_path, mock_config, shuffle=False - ) - - # World size = 2, Total files = 4 - # Rank 0 gets file index 0 and 2 (file_1, file_3) -> 20 samples total -> 4 batches - batches = list(dataset) - assert len(batches) == 4 - - # Verify input mapping structures - for seq_batch, _, _, _, _ in batches: - assert seq_batch["item"].shape[0] == 5 - - -def test_exact_strategy_uneven_files_exception(mock_config, tmp_path): - """Tests that FSDP validation raises an Exception when file distribution is uneven.""" - data_dir = tmp_path / "uneven_parquet_data" - data_dir.mkdir() - - # Write asymmetrical sample quotas across files - batch_files = [ - {"path": "file_1.parquet", "samples": 15}, - {"path": "file_2.parquet", "samples": 10}, - ] - metadata = {"total_samples": 25, "batch_files": batch_files} - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - with patch("torch.distributed.is_initialized", return_value=True), patch( - "torch.distributed.get_world_size", return_value=2 - ): - with pytest.raises(Exception) as exc_info: - SequifierDatasetFromFolderParquetLazy(str(data_dir), mock_config) - - assert "different number of samples per rank/GPU" in str(exc_info.value) - - -def test_oversampling_strategy(mock_config, tmp_path): - """Tests that shorter ranks oversample to equal the maximal rank count.""" - data_dir = tmp_path / "oversample_parquet_data" - data_dir.mkdir() - - schema = { - "sequenceId": pl.Int64, - "subsequenceId": pl.Int64, - "startItemPosition": pl.Int64, - "inputCol": pl.String, - "2": pl.Float64, - "1": pl.Float64, - "0": pl.Float64, - } - - # File 1 has 15 rows, File 2 has 10 rows - for i, num_rows in [(1, 15), (2, 10)]: - rows = [ - (s, 0, s * 2, "item", float(s), float(s + 1), float(s + 2)) - for s in range(num_rows) - ] - pl.DataFrame(rows, schema=schema, orient="row").write_parquet( - data_dir / f"file_{i}.parquet" - ) - - batch_files = [ - {"path": "file_1.parquet", "samples": 15}, - {"path": "file_2.parquet", "samples": 10}, - ] - metadata = {"total_samples": 25, "batch_files": batch_files} - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - mock_config.training_spec.sampling_strategy = "oversampling" - - with patch("torch.distributed.is_initialized", return_value=True), patch( - "torch.distributed.get_world_size", return_value=2 - ): - dataset = SequifierDatasetFromFolderParquetLazy( - str(data_dir), mock_config, shuffle=False - ) - # Should match max(15, 10) - assert dataset.target_samples == 15 - - -def test_undersampling_strategy(mock_config, tmp_path): - """Tests that longer ranks truncate samples down to match the minimal rank count.""" - data_dir = tmp_path / "undersample_parquet_data" - data_dir.mkdir() - - schema = { - "sequenceId": pl.Int64, - "subsequenceId": pl.Int64, - "startItemPosition": pl.Int64, - "inputCol": pl.String, - "2": pl.Float64, - "1": pl.Float64, - "0": pl.Float64, - } - - for i, num_rows in [(1, 15), (2, 10)]: - rows = [ - (s, 0, s * 2, "item", float(s), float(s + 1), float(s + 2)) - for s in range(num_rows) - ] - pl.DataFrame(rows, schema=schema, orient="row").write_parquet( - data_dir / f"file_{i}.parquet" - ) - - batch_files = [ - {"path": "file_1.parquet", "samples": 15}, - {"path": "file_2.parquet", "samples": 10}, - ] - metadata = {"total_samples": 25, "batch_files": batch_files} - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - mock_config.training_spec.sampling_strategy = "undersampling" - - with patch("torch.distributed.is_initialized", return_value=True), patch( - "torch.distributed.get_world_size", return_value=2 - ): - dataset = SequifierDatasetFromFolderParquetLazy( - str(data_dir), mock_config, shuffle=False - ) - # Should match min(15, 10) - assert dataset.target_samples == 10 diff --git a/tests/unit/io/test_sequifier_dataset_from_folder_pt_lazy.py b/tests/unit/io/test_sequifier_dataset_from_folder_pt_lazy.py deleted file mode 100644 index 8d7abb2f..00000000 --- a/tests/unit/io/test_sequifier_dataset_from_folder_pt_lazy.py +++ /dev/null @@ -1,293 +0,0 @@ -import json -from unittest.mock import MagicMock, patch - -import pytest -import torch - -from sequifier.io.sequifier_dataset_from_folder_pt_lazy import ( - SequifierDatasetFromFolderPtLazy, -) - - -# --- Fixtures --- -@pytest.fixture -def mock_config(tmp_path): - """Creates a mock configuration object.""" - config = MagicMock() - config.project_root = str(tmp_path) - config.training_spec.batch_size = 5 - config.training_spec.sampling_strategy = "exact" - config.training_spec.num_workers = 0 - config.seed = 42 - config.seq_length = 5 - config.input_columns = ["col1"] # <-- ADD THIS LINE - config.target_columns = ["col1", "tgt1"] - return config - - -@pytest.fixture -def dataset_path(tmp_path): - """Sets up a temporary data directory with metadata.json.""" - data_dir = tmp_path / "data" - data_dir.mkdir() - - # Create dummy metadata.json - # We define 4 files with 10 samples each = 40 total samples - metadata = { - "total_samples": 40, - "batch_files": [ - {"path": "file1.pt", "samples": 10}, - {"path": "file2.pt", "samples": 10}, - {"path": "file3.pt", "samples": 10}, - {"path": "file4.pt", "samples": 10}, - ], - } - - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - return str(data_dir) - - -@pytest.fixture -def mock_torch_load(): - """Mocks torch.load to return dummy tensors matching the preprocessed format.""" - with patch("torch.load") as mock_load: - - def side_effect(path, map_location, weights_only): - # Tensors size: (10 samples per file, sequence length 10 to allow slicing) - dummy_seq = {"col1": torch.ones((10, 10)), "tgt1": torch.zeros((10, 10))} - - return ( - dummy_seq, - None, - None, - None, - ) - - mock_load.side_effect = side_effect - yield mock_load - - -# --- Tests --- - - -def test_initialization(mock_config, dataset_path): - """Tests that metadata is read correctly and __len__ calculates batches.""" - dataset = SequifierDatasetFromFolderPtLazy(dataset_path, mock_config) - - # 40 total samples / batch size of 5 = 8 batches - assert len(dataset) == 8 - assert len(dataset.batch_files_info) == 4 - assert dataset.total_samples == 40 - - -def test_iteration_yields_correct_batches(mock_config, dataset_path, mock_torch_load): - """Tests that the dataset iterates over files and yields correct tensor slices.""" - dataset = SequifierDatasetFromFolderPtLazy(dataset_path, mock_config, shuffle=False) - - # Consume the generator - batches = list(dataset) - - # 4 files * 10 samples = 40 total samples. 40 / 5 batch_size = 8 batches - assert len(batches) == 8 - - # Each file has 10 samples, so torch.load should be called 4 times - assert mock_torch_load.call_count == 4 - - # Verify the structure of a yielded batch - seq_dict, tgt_dict, _, _, _ = batches[0] - - assert "col1" in seq_dict, f"{seq_dict = }" - - assert "tgt1" in tgt_dict, f"{tgt_dict = }" - # Check that batch size and sequence length truncation works properly - assert seq_dict["col1"].shape == (5, 5) - assert tgt_dict["tgt1"].shape == (5, 5) - - -@patch("torch.distributed.is_initialized", return_value=True) -@patch("torch.distributed.get_world_size", return_value=2) -@patch("torch.distributed.get_rank", return_value=0) -def test_distributed_sharding( - mock_rank, mock_ws, mock_init, mock_config, dataset_path, mock_torch_load -): - """Tests that the dataset correctly shards files across distributed GPUs.""" - dataset = SequifierDatasetFromFolderPtLazy(dataset_path, mock_config, shuffle=False) - - # World size = 2, Total files = 4 - # Rank 0 gets file index 0 and 2 (file1.pt, file3.pt) -> Total 20 samples - # 20 samples / 5 batch_size = 4 expected batches - assert len(dataset) == 4 - - batches = list(dataset) - - assert len(batches) == 4 - assert mock_torch_load.call_count == 2 - - # Verify it loaded the correct specific files - loaded_files = [call.args[0] for call in mock_torch_load.call_args_list] - assert any("file1.pt" in f for f in loaded_files) - assert any("file3.pt" in f for f in loaded_files) - assert not any("file2.pt" in f for f in loaded_files) - - -@patch("sequifier.io.sequifier_dataset_from_folder_pt_lazy.get_worker_info") -def test_dataloader_worker_sharding_continuous_boundaries( - mock_worker_info, mock_config, dataset_path, mock_torch_load -): - """Tests that continuous sample streaming assigns correct file boundaries to workers.""" - - # Simulate being DataLoader worker ID 1 out of 2 total workers - mock_info = MagicMock() - mock_info.id = 1 - mock_info.num_workers = 2 - mock_worker_info.return_value = mock_info - - mock_config.training_spec.num_workers = 2 - - dataset = SequifierDatasetFromFolderPtLazy(dataset_path, mock_config, shuffle=False) - - # Consume the generator for THIS specific worker - batches = list(dataset) - - # NEW LOGIC: Total samples = 40. - # Worker 0 boundary: samples 0 to 20 (overlaps file1.pt, file2.pt) - # Worker 1 boundary: samples 20 to 40 (overlaps file3.pt, file4.pt) - # Since we are testing Worker 1, it should yield 20 samples -> 4 batches - assert len(batches) == 4 - assert mock_torch_load.call_count == 2 - - loaded_files = [call.args[0] for call in mock_torch_load.call_args_list] - assert any("file3.pt" in f for f in loaded_files) - assert any("file4.pt" in f for f in loaded_files) - assert not any("file1.pt" in f for f in loaded_files) - - -@patch("torch.distributed.is_initialized", return_value=True) -@patch("torch.distributed.get_world_size", return_value=2) -@patch("torch.distributed.get_rank", return_value=0) -def test_exact_strategy_uneven_files_exception( - mock_rank, mock_ws, mock_init, mock_config, tmp_path -): - """Tests that 'exact' strategy raises the detailed exception on uneven rank samples.""" - - data_dir = tmp_path / "data_uneven" - data_dir.mkdir() - - # Rank 0 will get file1 (10) + file3 (10) = 20 samples - # Rank 1 will get file2 (10) + file4 (5) = 15 samples - metadata = { - "total_samples": 35, - "batch_files": [ - {"path": "file1.pt", "samples": 10}, - {"path": "file2.pt", "samples": 10}, - {"path": "file3.pt", "samples": 10}, - {"path": "file4.pt", "samples": 5}, - ], - } - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - mock_config.training_spec.sampling_strategy = "exact" - - # The dataset initialization calls _get_target_samples(), which should raise the Exception - with pytest.raises(Exception) as exc_info: - SequifierDatasetFromFolderPtLazy(str(data_dir), mock_config) - - error_msg = str(exc_info.value) - - # Assert the core error text is present - assert "Found 2 different number of samples per rank/GPU" in error_msg - - -@patch("torch.distributed.is_initialized", return_value=True) -@patch("torch.distributed.get_world_size", return_value=2) -@patch("torch.distributed.get_rank", return_value=1) -def test_oversampling_strategy( - mock_rank, mock_ws, mock_init, mock_config, tmp_path, mock_torch_load -): - """Tests that 'oversampling' pads a rank with fewer samples by looping its files.""" - data_dir = tmp_path / "data_oversample" - data_dir.mkdir() - - # Rank 0 gets file1 (10) + file3 (5) = 15 samples - # Rank 1 gets file2 (10) = 10 samples - metadata = { - "total_samples": 25, - "batch_files": [ - {"path": "file1.pt", "samples": 10}, - {"path": "file2.pt", "samples": 10}, - {"path": "file3.pt", "samples": 5}, - ], - } - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - mock_config.training_spec.sampling_strategy = "oversampling" - mock_config.training_spec.batch_size = 5 - mock_config.training_spec.num_workers = 0 - - dataset = SequifierDatasetFromFolderPtLazy( - str(data_dir), mock_config, shuffle=False - ) - - # Max samples across ranks is 15. Rank 1 must pad its 10 samples up to 15. - assert dataset.target_samples == 15 - assert len(dataset) == 3 # 15 total samples / batch_size 5 - - batches = list(dataset) - assert len(batches) == 3 - - # Rank 1 only has file2 assigned. To get 15 samples, it must load file2, - # run out of data, loop back, and load file2 again. - assert mock_torch_load.call_count == 2 - loaded_files = [call.args[0] for call in mock_torch_load.call_args_list] - assert "file2.pt" in loaded_files[0] - assert "file2.pt" in loaded_files[1] - - -@patch("torch.distributed.is_initialized", return_value=True) -@patch("torch.distributed.get_world_size", return_value=2) -@patch("torch.distributed.get_rank", return_value=0) -def test_undersampling_strategy( - mock_rank, mock_ws, mock_init, mock_config, tmp_path, mock_torch_load -): - """Tests that 'undersampling' truncates a rank with more samples to match the lightest rank.""" - data_dir = tmp_path / "data_undersample" - data_dir.mkdir() - - # Rank 0 gets file1 (10) + file3 (5) = 15 samples - # Rank 1 gets file2 (10) = 10 samples - metadata = { - "total_samples": 25, - "batch_files": [ - {"path": "file1.pt", "samples": 10}, - {"path": "file2.pt", "samples": 10}, - {"path": "file3.pt", "samples": 5}, - ], - } - with open(data_dir / "metadata.json", "w") as f: - json.dump(metadata, f) - - mock_config.training_spec.sampling_strategy = "undersampling" - mock_config.training_spec.batch_size = 5 - mock_config.training_spec.num_workers = 0 - - dataset = SequifierDatasetFromFolderPtLazy( - str(data_dir), mock_config, shuffle=False - ) - - # Min samples across ranks is 10. Rank 0 must truncate its 15 samples down to 10. - assert dataset.target_samples == 10 - assert len(dataset) == 2 # 10 total samples / batch_size 5 - - batches = list(dataset) - assert len(batches) == 2 - - # Rank 0 should only need file1 (10 samples) to meet its truncated quota of 10. - # It should never attempt to load file3. - assert mock_torch_load.call_count == 1 - loaded_files = [call.args[0] for call in mock_torch_load.call_args_list] - assert "file1.pt" in loaded_files[0] - assert not any("file3.pt" in f for f in loaded_files) diff --git a/tests/unit/test_helpers.py b/tests/unit/test_helpers.py deleted file mode 100644 index ac79cf10..00000000 --- a/tests/unit/test_helpers.py +++ /dev/null @@ -1,120 +0,0 @@ -import polars as pl -import torch - -from sequifier.helpers import construct_index_maps, numpy_to_pytorch - -# ========================================== -# 1. Test Index Map Construction -# ========================================== - - -def test_construct_index_maps_string(): - """Tests reversing a string-to-int map, ensuring 0 maps to 'unknown'.""" - id_maps: dict[str, dict[str | int, int]] = {"itemId": {"apple": 2, "banana": 3}} - target_cols = ["itemId"] - - result = construct_index_maps(id_maps, target_cols, map_to_id=True) - - # Check standard reversal - assert result["itemId"][2] == "apple" - assert result["itemId"][3] == "banana" - - # Check the special 0 index for strings - assert result["itemId"][0] == "unknown" - assert result["itemId"][1] == "other" - - -def test_construct_index_maps_integer(): - """Tests reversing an int-to-int map, ensuring 0 maps to min_id - 1.""" - id_maps: dict[str, dict[str | int, int]] = {"storeId": {100: 2, 101: 3}} - target_cols = ["storeId"] - - result = construct_index_maps(id_maps, target_cols, map_to_id=True) - - assert result["storeId"][2] == 100 - assert result["storeId"][3] == 101 - - # Check the special 0 index for integers (min value - 2) - # Min value is 100, so 2 -> 98, 1 -> 99 - assert result["storeId"][0] == 98 - assert result["storeId"][1] == 99 - - -def test_construct_index_maps_flag_false(): - """Tests that nothing is returned if map_to_id is False.""" - id_maps: dict[str, dict[str | int, int]] = {"itemId": {"a": 1}} - result = construct_index_maps(id_maps, ["itemId"], map_to_id=False) - assert result == {} - - -# ========================================== -# 2. Test Numpy to PyTorch Conversion -# ========================================== - - -def test_numpy_to_pytorch_shapes_and_shifting(): - """ - Tests that DataFrames are correctly converted to input and target Tensors. - - Logic to test: - If seq_length = 3: - - Input cols: ['3', '2', '1'] - - Target cols: ['2', '1', '0'] - """ - - # Setup: 2 sequences for feature "A" - # Seq 1: [10, 20, 30, 40] (where 40 is t=0, 30 is t=1, etc.) - data = pl.DataFrame( - { - "inputCol": ["A", "A"], - "3": [10, 11], - "2": [20, 21], - "1": [30, 31], - "0": [40, 41], - } - ) - - column_types = {"A": torch.float32} - all_columns = ["A"] - seq_length = 3 - - tensors = numpy_to_pytorch(data, column_types, all_columns, seq_length) - - # 1. Check Keys - assert "A" in tensors - assert "A_target" in tensors - - # 2. Check Input Tensor (Cols 3, 2, 1) - # Row 0: [10, 20, 30] - expected_input = torch.tensor([[10, 20, 30], [11, 21, 31]], dtype=torch.float32) - assert torch.equal(tensors["A"], expected_input) - - # 3. Check Target Tensor (Cols 2, 1, 0) -> Shifted by 1 step into future - # Row 0: [20, 30, 40] - expected_target = torch.tensor([[20, 30, 40], [21, 31, 41]], dtype=torch.float32) - assert torch.equal(tensors["A_target"], expected_target) - - -def test_numpy_to_pytorch_dtypes(): - """Tests that column_types dict is respected for tensor dtypes.""" - - # Note: numpy_to_pytorch filters by inputCol, so we need to handle how - # it selects rows. It assumes all rows matching "inputCol" have valid data - # for that type. - - # We'll test one type at a time to avoid schema conflicts in the Polars DF creation - # (Polars columns usually have a single type). - - # Case 1: Integer - data_int = pl.DataFrame({"inputCol": ["int_col"], "1": [10], "0": [20]}) - tensors_int = numpy_to_pytorch( - data_int, {"int_col": torch.int64}, ["int_col"], seq_length=1 - ) - assert tensors_int["int_col"].dtype == torch.int64 - - # Case 2: Float - data_float = pl.DataFrame({"inputCol": ["float_col"], "1": [10.5], "0": [20.5]}) - tensors_float = numpy_to_pytorch( - data_float, {"float_col": torch.float32}, ["float_col"], seq_length=1 - ) - assert tensors_float["float_col"].dtype == torch.float32 diff --git a/tests/unit/test_infer.py b/tests/unit/test_infer.py deleted file mode 100644 index 46ecc58f..00000000 --- a/tests/unit/test_infer.py +++ /dev/null @@ -1,323 +0,0 @@ -from unittest.mock import patch - -import numpy as np -import pytest -import torch - -from sequifier.config.infer_config import InfererModel -from sequifier.infer import ( - Inferer, - get_probs_preds_from_dict, - normalize, - sample_with_cumsum, -) - - -def test_normalize(): - """Tests the softmax normalization of raw logits.""" - # Create raw logits - # Row 0: exp(0)=1, exp(0)=1 -> probs: 0.5, 0.5 - # Row 1: exp(1)=e, exp(2)=e^2 -> probs: e/(e+e^2), e^2/(e+e^2) - logits = np.array([[0.0, 0.0], [1.0, 2.0], [-1.0, 0.0]]) - outs = {"target_col": logits} - - probs_dict = normalize(outs) - - assert "target_col" in probs_dict - probs = probs_dict["target_col"] - assert probs.shape == (3, 2) - - # Assert Row 0 is 50/50 - np.testing.assert_allclose(probs[0], [0.5, 0.5]) - - # Assert Row 1 is proportionally correct - e1, e2 = np.exp(1), np.exp(2) - np.testing.assert_allclose(probs[1], [e1 / (e1 + e2), e2 / (e1 + e2)]) - - # Assert all rows sum to 1.0 (valid probability distribution) - np.testing.assert_allclose(probs.sum(axis=1), [1.0, 1.0, 1.0]) - - -@patch("numpy.random.rand") -def test_sample_with_cumsum(mock_rand): - """Tests inverse CDF sampling with both raw logits and pure probabilities.""" - # Mock the random thresholds to strictly control the sampling outcome. - mock_rand.return_value = np.array([[0.05], [0.90]]) - - # Path 1: Test with logits=True (default) - raw_logits = np.array([[np.log(0.1), np.log(0.9)], [np.log(0.8), np.log(0.2)]]) - sampled_from_logits = sample_with_cumsum(raw_logits, is_log_probs=True) - np.testing.assert_array_equal(sampled_from_logits, [0, 1]) - - # Path 2: Test with logits=False (pre-normalized probabilities) - pure_probs = np.array([[0.1, 0.9], [0.8, 0.2]]) - sampled_from_probs = sample_with_cumsum(pure_probs, is_log_probs=False) - np.testing.assert_array_equal(sampled_from_probs, [0, 1]) - - -@pytest.fixture -def mock_inferer(): - """Sets up an Inferer instance with mocked heavy dependencies (ONNX/PyTorch).""" - with patch("sequifier.infer.onnxruntime.InferenceSession"), patch( - "sequifier.infer.load_inference_model" - ): - inferer = Inferer( - model_type="generative", - model_path="dummy_model.onnx", - project_root=".", - id_maps={"cat_col": {"A": 2, "B": 3}}, - selected_columns_statistics={"real_col": {"mean": 10.0, "std": 2.0}}, - map_to_id=True, - categorical_columns=["cat_col"], - real_columns=["real_col"], - input_columns=["cat_col", "real_col"], - target_columns=["cat_col", "real_col"], - target_column_types={"cat_col": "categorical", "real_col": "real"}, - sample_from_distribution_columns=None, - infer_with_dropout=False, - prediction_length=1, - inference_batch_size=4, - device="cpu", - args_config={}, - training_config_path="dummy.yaml", - ) - return inferer - - -def test_inferer_invert_normalization(mock_inferer): - """Tests that normalized real outputs are scaled back correctly.""" - # Normalized values - values = np.array([-1.0, 0.0, 1.0]) - - # Configuration dictates mean = 10.0, std = 2.0 - # Unnormalized logic: (val * (std - 1e-9)) + mean - # Expected approx: [8.0, 10.0, 12.0] - unnormalized = mock_inferer.invert_normalization(values, "real_col") - - np.testing.assert_allclose(unnormalized, [8.0, 10.0, 12.0], atol=1e-5) - - -def test_inferer_expand_to_batch_size(mock_inferer): - """Tests the array padding logic for strictly sized batches (e.g., ONNX).""" - mock_inferer.inference_batch_size = 5 - - # Input has 2 samples, batch size needs to be 5 - x = np.array([[10], [20]]) - - # Should repeat the full array twice [10, 20, 10, 20], then append the remainder [10] - expanded = mock_inferer.expand_to_batch_size(x) - - assert expanded.shape == (5, 1) - np.testing.assert_array_equal(expanded, [[10], [20], [10], [20], [10]]) - - -def test_inferer_prepare_inference_batches_pad(mock_inferer): - """Tests chunking data when padding is requested.""" - mock_inferer.inference_batch_size = 4 - x = {"cat_col": np.array([[1], [2], [3]])} # 3 total samples - - batches = mock_inferer.prepare_inference_batches(x, pad_to_batch_size=True) - - assert len(batches) == 1 - # Check that the 3 samples were padded up to the target batch size of 4 - assert batches[0]["cat_col"].shape == (4, 1) - np.testing.assert_array_equal(batches[0]["cat_col"], [[1], [2], [3], [1]]) - - -def test_inferer_prepare_inference_batches_no_pad(mock_inferer): - """Tests chunking data without padding.""" - mock_inferer.inference_batch_size = 4 - x = {"cat_col": np.array([[1], [2], [3]])} # 3 total samples - - batches = mock_inferer.prepare_inference_batches(x, pad_to_batch_size=False) - - assert len(batches) == 1 - # Check that it retained its original short size - assert batches[0]["cat_col"].shape == (3, 1) - - -def test_inferer_prepare_inference_batches_split(mock_inferer): - """Tests chunking data into multiple separated batches.""" - mock_inferer.inference_batch_size = 2 - x = {"cat_col": np.array([[1], [2], [3], [4], [5]])} # 5 total samples - - batches = mock_inferer.prepare_inference_batches(x, pad_to_batch_size=False) - - assert len(batches) == 3 - assert batches[0]["cat_col"].shape == (2, 1) - assert batches[1]["cat_col"].shape == (2, 1) - assert batches[2]["cat_col"].shape == (1, 1) # The remainder - np.testing.assert_array_equal(batches[2]["cat_col"], [[5]]) - - -# ========================================== -# Test Autoregressive Tensor Inference -# ========================================== - - -@pytest.fixture -def ar_config(): - """Provides an actual InfererModel configuration for autoregressive inference.""" - return InfererModel( - project_root=".", - metadata_config_path="dummy.json", - model_path="dummy.onnx", - model_type="generative", - data_path="tests/unit/data/dummy.parquet", - input_columns=["target_col"], - categorical_columns=[], - real_columns=["target_col"], - target_columns=["target_col"], - column_types={"target_col": "float64"}, - target_column_types={"target_col": "real"}, - seed=42, - device="cpu", - seq_length=3, - inference_batch_size=2, - output_probabilities=False, - map_to_id=False, # Set to False to bypass ID mapping requirements - autoregression=True, - autoregression_total_steps=1, - ) - - -@pytest.fixture -def ar_inferer(ar_config): - """Sets up an actual Inferer instance with mocked heavy dependencies.""" - with patch("sequifier.infer.onnxruntime.InferenceSession"), patch( - "sequifier.infer.load_inference_model" - ): - return Inferer( - model_type=ar_config.model_type, - model_path=ar_config.model_path, - project_root=ar_config.project_root, - id_maps=None, - selected_columns_statistics={"target_col": {"mean": 0.0, "std": 1.0}}, - map_to_id=ar_config.map_to_id, - categorical_columns=ar_config.categorical_columns, - real_columns=ar_config.real_columns, - input_columns=ar_config.input_columns, - target_columns=ar_config.target_columns, - target_column_types=ar_config.target_column_types, - sample_from_distribution_columns=ar_config.sample_from_distribution_columns, - infer_with_dropout=ar_config.infer_with_dropout, - prediction_length=ar_config.prediction_length, - inference_batch_size=ar_config.inference_batch_size, - device=ar_config.device, - args_config={}, - training_config_path=ar_config.training_config_path, - ) - - -def test_get_probs_preds_from_dict_shifting_and_looping(ar_config, ar_inferer): - """ - Tests that the autoregressive loop calls the model the correct number of times - and accurately shifts the input tensor to append the latest prediction. - """ - initial_data = {"target_col": torch.tensor([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]])} - - # Patch the method on the actual instance - with patch.object(ar_inferer, "infer_generative") as mock_infer: - # Step 0: Predicts 4.0 for row 0, 40.0 for row 1 - # Step 1: Predicts 5.0 for row 0, 50.0 for row 1 - mock_infer.side_effect = [ - {"target_col": np.array([[4.0], [40.0]])}, - {"target_col": np.array([[5.0], [50.0]])}, - ] - - total_steps = 2 - probs, preds = get_probs_preds_from_dict( - ar_config, ar_inferer, initial_data, total_steps=total_steps - ) - - # 1. Verify Loop Count - assert mock_infer.call_count == 2 - - # 2. Verify Tensor Shifting - expected_shifted_x = { - "target_col": np.array([[2.0, 3.0, 4.0], [20.0, 30.0, 40.0]]) - } - second_call_args = mock_infer.call_args_list[1][0][0] - - np.testing.assert_array_equal( - second_call_args["target_col"], expected_shifted_x["target_col"] - ) - - # 3. Verify Output Reshaping - assert "target_col" in preds - np.testing.assert_array_equal(preds["target_col"], [4.0, 5.0, 40.0, 50.0]) - - -@patch("sequifier.infer.sample_with_cumsum") -def test_get_probs_preds_from_dict_with_probabilities( - mock_sample, ar_config, ar_inferer -): - """ - Tests the probability branching logic. When output_probabilities=True, - `infer_generative` normalizes outputs, and passes them as probabilities - to the second call which triggers sampling with logits=False. - """ - # 1. Override the config and inferer to treat the column as categorical - ar_config.target_column_types["target_col"] = "categorical" - ar_inferer.target_column_types["target_col"] = "categorical" - - # 2. Force it to route to the sampling branch - ar_config.output_probabilities = True - ar_config.sample_from_distribution_columns = ["target_col"] - ar_inferer.sample_from_distribution_columns = ["target_col"] - - initial_data = {"target_col": torch.tensor([[1.0, 2.0]])} - - # Raw model output (Logits) - dummy_logits = {"target_col": np.array([[np.log(0.2), np.log(0.8)]])} - - # What we want our mock sample_with_cumsum to return - mock_sample.return_value = np.array([1]) - - # Mock the *inner* backend call, allowing infer_generative to execute its actual logic - with patch.object( - ar_inferer, "adjust_and_infer_generative", return_value=dummy_logits - ) as mock_adjust: - probs, preds = get_probs_preds_from_dict( - ar_config, ar_inferer, initial_data, total_steps=1 - ) - - assert mock_adjust.call_count == 1 - - # Verify sample_with_cumsum was called correctly during the second pass - mock_sample.assert_called_once() - args, kwargs = mock_sample.call_args - - # 1. Assert it was passed the normalized probabilities, NOT the raw logits - np.testing.assert_allclose(args[0], [[0.2, 0.8]]) - - # 2. Assert the new flag was toggled correctly based on (probs is None) - assert kwargs.get("is_log_probs") is False - - # Verify final outputs - assert probs is not None - np.testing.assert_allclose(probs["target_col"], [[0.2, 0.8]]) - np.testing.assert_array_equal(preds["target_col"], [1]) - - -def test_get_probs_preds_from_dict_ignores_unselected_columns(ar_config, ar_inferer): - """ - Tests that columns not explicitly defined in `config.input_columns` - are filtered out before inference. - """ - initial_data = { - "target_col": torch.tensor([[1.0, 2.0]]), - "ignored_col": torch.tensor([[9.0, 9.0]]), - } - - with patch.object(ar_inferer, "infer_generative") as mock_infer: - mock_infer.return_value = {"target_col": np.array([[3.0]])} - - _, _ = get_probs_preds_from_dict( - ar_config, ar_inferer, initial_data, total_steps=1 - ) - - first_call_args = mock_infer.call_args_list[0][0][0] - - assert "target_col" in first_call_args - assert "ignored_col" not in first_call_args diff --git a/tests/unit/test_preprocess.py b/tests/unit/test_preprocess.py deleted file mode 100644 index 98191bad..00000000 --- a/tests/unit/test_preprocess.py +++ /dev/null @@ -1,203 +0,0 @@ -import numpy as np -import polars as pl -import pytest - -from sequifier.preprocess import ( - _get_column_statistics, - create_id_map, - extract_subsequences, - get_batch_limits, - get_combined_statistics, -) - -# ========================================== -# 1. Test Sequence Extraction (Sliding Window) -# ========================================== - - -def test_extract_subsequences_basic(): - """Tests basic sliding window extraction with sufficient length.""" - input_data = {"col1": [10, 11, 12, 13, 14, 15]} - seq_length = 3 - stride = 1 - columns = ["col1"] - - # Expected behavior: Window size is seq_length + 1 (history + target) - # Windows: [10,11,12,13], [11,12,13,14], [12,13,14,15] - - result = extract_subsequences( - input_data, seq_length, stride, columns, subsequence_start_mode="distribute" - ) - - assert len(result["col1"]) == 3 - assert result["col1"][0] == [10, 11, 12, 13] - assert result["col1"][2] == [12, 13, 14, 15] - - -def test_extract_subsequences_padding(): - """Tests that sequences shorter than seq_length are padded with 0s.""" - input_data = {"col1": [1, 2]} # Length 2 - seq_length = 4 # Req length 5 (4+1) - stride = 1 - columns = ["col1"] - - # Expected: [0, 0, 0, 1, 2] -> 3 zeroes padding - - result = extract_subsequences( - input_data, seq_length, stride, columns, subsequence_start_mode="distribute" - ) - - assert len(result["col1"]) == 1 - assert result["col1"][0] == [0, 0, 0, 1, 2] - - -@pytest.mark.parametrize("mode", ["distribute", "exact"]) -def test_extract_subsequences_modes(mode): - """Tests logic for 'distribute' vs 'exact' modes.""" - # Length 10. Seq_len 2 (window 3). - # distribute: adjusts stride to cover data evenly. - # exact: strictly adheres to stride, throws error if misalignment. - input_data = {"col1": list(range(10))} - seq_length = 2 - columns = ["col1"] - - if mode == "distribute": - stride = 4 - # distribute might adjust indices to maximize coverage - result = extract_subsequences(input_data, seq_length, stride, columns, mode) - assert len(result["col1"]) > 0 - - elif mode == "exact": - stride = ( - 3 # (10-1) - 2 = 7. 7 % 3 != 0. Should fail or require specific alignment - ) - # Testing a failing exact case - with pytest.raises(ValueError): - extract_subsequences(input_data, seq_length, 4, columns, mode) - - # Testing a passing exact case - # (10-1) - 2 = 7. If we change input len to 11: (11-1)-2 = 8. stride 4 works. - input_data_exact = {"col1": list(range(11))} - result = extract_subsequences(input_data_exact, seq_length, 4, columns, mode) - assert len(result["col1"]) > 0 - - -# ========================================== -# 2. Test Batch Limits (Index Math) -# ========================================== - - -def test_get_batch_limits_perfect_split(): - """Tests splitting where batch boundaries align perfectly with sequences.""" - # 3 sequences, each length 10. Total 30 rows. - # If we want 3 batches, we should get 3 chunks of 10. - data = pl.DataFrame({"sequenceId": np.repeat([1, 2, 3], 10), "val": np.arange(30)}) - - limits = get_batch_limits(data, n_batches=3) - - assert len(limits) == 3 - assert limits == [(0, 10), (10, 20), (20, 30)] - - -def test_get_batch_limits_uneven_split(): - """Tests that a batch never splits a sequenceId in half.""" - # Seq 1: 5 rows - # Seq 2: 15 rows - # Seq 3: 5 rows - # Total 25 rows. Request 2 batches. Ideal size 12.5. - # Split point should occur at index 5 (Seq 1 end) or 20 (Seq 2 end), - # NOT at index 12 (middle of Seq 2). - data = pl.DataFrame( - {"sequenceId": np.repeat([1, 2, 3], [5, 15, 5]), "val": np.arange(25)} - ) - - limits = get_batch_limits(data, n_batches=2) - - # Check that split points are valid sequence boundaries - for start, end in limits: - # Start of batch must match start of a sequence (unless 0) - if start != 0: - prev_id = data["sequenceId"][start - 1] - curr_id = data["sequenceId"][start] - assert prev_id != curr_id, f"Batch split at {start} broke a sequence" - - -# ========================================== -# 3. Test Statistics (Mathematical Logic) -# ========================================== - - -def test_get_combined_statistics_logic(): - """Tests Welford's algorithm logic for merging stats.""" - # Create two chunks of data - chunk1 = np.random.normal(loc=10, scale=2, size=100) - chunk2 = np.random.normal(loc=20, scale=5, size=50) - full_data = np.concatenate([chunk1, chunk2]) - - # Real stats - mean1, std1 = np.mean(chunk1), np.std(chunk1, ddof=1) - mean2, std2 = np.mean(chunk2), np.std(chunk2, ddof=1) - - # Function output - comb_mean, comb_std = get_combined_statistics( - len(chunk1), float(mean1), float(std1), len(chunk2), float(mean2), float(std2) - ) - - # Expected stats - expected_mean = np.mean(full_data) - expected_std = np.std(full_data, ddof=1) - - np.testing.assert_almost_equal(comb_mean, expected_mean) - np.testing.assert_almost_equal(comb_std, expected_std) - - -def test_get_column_statistics_state_accumulation(): - """Tests that processing data in chunks yields same stats as processing at once.""" - data_full = pl.DataFrame( - { - "cat_col": ["a", "b", "a", "c", "b", "d"], - "num_col": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], - } - ) - - # Split into two chunks - chunk1 = data_full.slice(0, 3) - chunk2 = data_full.slice(3, 3) - - id_maps = {} - stats = {} - running_count = 0 - - # Pass 1 - id_maps, stats = _get_column_statistics( - chunk1, ["cat_col", "num_col"], id_maps, stats, running_count, {} - ) - running_count += len(chunk1) - - # Pass 2 - id_maps, stats = _get_column_statistics( - chunk2, ["cat_col", "num_col"], id_maps, stats, running_count, {} - ) - - # Validations - # 1. Categorical: Should contain all unique keys a,b,c,d - assert len(id_maps["cat_col"]) == 4 - assert set(id_maps["cat_col"].keys()) == {"a", "b", "c", "d"} - - # 2. Numerical: Should match full dataset calculation - expected_mean = data_full["num_col"].mean() - expected_std = data_full["num_col"].std() - - np.testing.assert_almost_equal(stats["num_col"]["mean"], expected_mean) - np.testing.assert_almost_equal(stats["num_col"]["std"], expected_std) - - -def test_create_id_map(): - """Tests basic ID mapping creation.""" - df = pl.DataFrame({"A": ["z", "x", "y", "x"]}) - mapping = create_id_map(df, "A") - - # Sorted unique values: x, y, z -> 2, 3, 4 - assert mapping["x"] == 2 - assert mapping["y"] == 3 - assert mapping["z"] == 4 diff --git a/tests/unit/test_train.py b/tests/unit/test_train.py deleted file mode 100644 index 2f8397b7..00000000 --- a/tests/unit/test_train.py +++ /dev/null @@ -1,185 +0,0 @@ -import pytest -import torch - -from sequifier.config.train_config import ModelSpecModel, TrainingSpecModel, TrainModel -from sequifier.train import TransformerModel - - -@pytest.fixture -def model_config(tmp_path): - """Creates a valid TrainModel configuration for testing.""" - project_root = str(tmp_path) - - # Ensure necessary directories exist to avoid init errors (logging) - (tmp_path / "logs").mkdir(exist_ok=True) - - model_spec = ModelSpecModel( - initial_embedding_dim=16, - dim_model=16, - n_head=4, - dim_feedforward=32, - num_layers=2, - prediction_length=1, - # Embedding dims must sum to dim_model (15 + 1 = 16) - feature_embedding_dims={"cat_col": 15, "real_col": 1}, - ) - - training_spec = TrainingSpecModel( - device="cpu", - epochs=1, - save_interval_epochs=1, - batch_size=4, - learning_rate=0.001, - criterion={"cat_col": "CrossEntropyLoss", "real_col": "MSELoss"}, - optimizer={"name": "Adam"}, - scheduler={"name": "StepLR", "step_size": 1, "gamma": 0.1}, - loss_weights={"cat_col": 1.0, "real_col": 1.0}, - ) - - config = TrainModel( - project_root=project_root, - model_name="unit-test-model", - metadata_config_path="metadata.json", # Dummy path - training_data_path="data/train.pt", # Dummy path - validation_data_path="data/val.pt", # Dummy path - input_columns=["cat_col", "real_col"], - target_columns=["cat_col", "real_col"], - target_column_types={"cat_col": "categorical", "real_col": "real"}, - column_types={"cat_col": "int64", "real_col": "float64"}, - categorical_columns=["cat_col"], - real_columns=["real_col"], - # id_maps is needed for constructing index_maps in model init - id_maps={"cat_col": {"a": 1, "b": 2, "c": 3, "d": 4}}, - n_classes={"cat_col": 5}, # 0 + 4 classes - seq_length=10, - inference_batch_size=4, - seed=42, - export_generative_model=True, - export_embedding_model=False, - model_spec=model_spec, - training_spec=training_spec, - ) - return config - - -@pytest.fixture -def model(model_config): - """Instantiates the TransformerModel with the mock config.""" - return TransformerModel(model_config) - - -def test_transformer_model_initialization(model, model_config): - """Tests that the model initializes with the correct layers.""" - # Check if encoder dicts were created - assert "cat_col" in model.encoder - assert model.pos_encoder is None or "cat_col" in model.pos_encoder - - # Check decoder existence - assert "cat_col" in model.decoder - assert "real_col" in model.decoder - - # Check embedding sizes - assert model.dim_model == 16 - assert model.encoder["cat_col"].embedding_dim == 15 - # Real column 'real_col' has feature_embedding_dims=1, but it goes through a Linear layer - # if dim > 1, or direct if dim == 1. In setup: - # if feature_embedding_dims[col] > 1 -> Linear - # else -> checked to be 1, then no encoder added to self.encoder for 'direct' columns? - # Let's check logic in train.py: - # if self.feature_embedding_dims[col] > 1: ... self.encoder[col] = nn.Linear(...) - # else: self.real_columns_direct.append(col) - # Since we set real_col dim to 1, it should NOT be in model.encoder - if model.feature_embedding_dims["real_col"] == 1: - assert "real_col" not in model.encoder - else: - assert "real_col" in model.encoder - - -def test_forward_train_shapes(model, model_config): - """Tests the output shapes of the forward_train method.""" - batch_size = model_config.training_spec.batch_size - seq_len = model_config.seq_length - - # Create dummy inputs - # Categorical: (batch, seq_len) integers - x_cat = torch.randint(0, model_config.n_classes["cat_col"], (batch_size, seq_len)) - # Real: (batch, seq_len) floats - x_real = torch.randn(batch_size, seq_len) - - src = {"cat_col": x_cat, "real_col": x_real} - - # forward_train returns a dict of tensors - outputs = model.forward_train(src) - - assert "cat_col" in outputs - assert "real_col" in outputs - - # Expected output shape for training: (seq_len, batch_size, n_classes_or_1) - # Note: PyTorch Transformer default is (S, N, E) unless batch_first=True. - # Sequifier seems to use default, so (S, B, OutputDim) - - out_cat = outputs["cat_col"] - assert out_cat.shape == (seq_len, batch_size, model_config.n_classes["cat_col"]) - - out_real = outputs["real_col"] - assert out_real.shape == (seq_len, batch_size, 1) - - -def test_forward_inference_shapes(model, model_config): - """Tests the output shapes of the forward (inference) method.""" - batch_size = model_config.training_spec.batch_size - seq_len = model_config.seq_length - prediction_length = model_config.model_spec.prediction_length # 1 - - x_cat = torch.randint(0, model_config.n_classes["cat_col"], (batch_size, seq_len)) - x_real = torch.randn(batch_size, seq_len) - src = {"cat_col": x_cat, "real_col": x_real} - - # forward returns predictions for the *last* prediction_length tokens - # And applies softmax to categorical outputs - outputs = model.forward(src) - - # Expected shape: (prediction_length, batch_size, n_classes_or_1) - # If prediction_length is 1, dim 0 is size 1. - - out_cat = outputs["cat_col"] - assert out_cat.shape == ( - prediction_length, - batch_size, - model_config.n_classes["cat_col"], - ) - - # Check if Softmax/LogSoftmax was applied (values should be <= 0 for LogSoftmax) - # Sequifier uses LogSoftmax for categorical - assert (out_cat <= 0).all() - - out_real = outputs["real_col"] - assert out_real.shape == (prediction_length, batch_size, 1) - - -def test_calculate_loss(model, model_config): - """Tests that loss calculation returns a scalar tensor.""" - batch_size = model_config.training_spec.batch_size - seq_len = model_config.seq_length - - # Inputs - x_cat = torch.randint(0, model_config.n_classes["cat_col"], (batch_size, seq_len)) - x_real = torch.randn(batch_size, seq_len) - src = {"cat_col": x_cat, "real_col": x_real} - - # Targets (must match sequence length for training) - y_cat = torch.randint(0, model_config.n_classes["cat_col"], (batch_size, seq_len)) - y_real = torch.randn(batch_size, seq_len) - targets = {"cat_col": y_cat, "real_col": y_real} - - # Run forward pass - outputs = model.forward_train(src) - - # Calculate loss - total_loss, component_losses = model._calculate_loss(outputs, targets) - - # Assertions - assert total_loss.dim() == 0 # Scalar - assert total_loss.item() > 0 # Valid loss value - assert "cat_col" in component_losses - assert "real_col" in component_losses diff --git a/tools/analysis.py b/tools/analysis.py index 9e13e322..fd642571 100644 --- a/tools/analysis.py +++ b/tools/analysis.py @@ -4,16 +4,7 @@ def invert_normalization(values, target_column, selected_columns_statistics): - """ - Invert the normalization of values for a target column. - - Args: - values: Normalized values. - target_column: Target column name. - - Returns: - Denormalized values. - """ + """Invert target-column normalization.""" std = selected_columns_statistics[target_column]["std"] mean = selected_columns_statistics[target_column]["mean"] return (values * (std - 1e-9)) + mean diff --git a/tools/convert_to_pt.py b/tools/convert_to_pt.py index 060b5af6..bb42f2ee 100644 --- a/tools/convert_to_pt.py +++ b/tools/convert_to_pt.py @@ -18,7 +18,6 @@ def main(): assert os.path.exists(in_path), f"Input file not found: {in_path}" - # 1. Read Data if in_path.endswith(".csv"): df = pl.read_csv(in_path) elif in_path.endswith(".parquet"): @@ -26,7 +25,6 @@ def main(): else: raise ValueError("Input must be .csv or .parquet") - # 2. Validate Schema required_meta = {"sequenceId", "subsequenceId", "startItemPosition", "inputCol"} assert required_meta.issubset( df.columns @@ -35,7 +33,6 @@ def main(): seq_cols = sorted([c for c in df.columns if c.isdigit()], key=int) assert len(seq_cols) > 1, "No numbered sequence columns found" - # 3. Aggregate feature_names = df["inputCol"].unique().to_list() aggs = [ pl.concat_list(seq_cols).filter(pl.col("inputCol") == f).flatten().alias(f) @@ -48,7 +45,6 @@ def main(): ) grouped = grouped.sort(["sequenceId", "subsequenceId"]) - # 4. Create Tensors seq_ids = torch.from_numpy(grouped["sequenceId"].to_numpy().astype(np.int64)) sub_ids = torch.from_numpy(grouped["subsequenceId"].to_numpy().astype(np.int64)) start_pos = torch.from_numpy( @@ -70,7 +66,6 @@ def main(): total_rows = len(seq_ids) - # 5. Save if chunk_size is not None and total_rows > chunk_size: assert not os.path.isfile( out_path @@ -83,7 +78,6 @@ def main(): for i in range(0, total_rows, chunk_size): end = i + chunk_size - # Slice everything s_ids_chunk = seq_ids[i:end] sub_ids_chunk = sub_ids[i:end] start_pos_chunk = start_pos[i:end] diff --git a/tools/resize_pt_files.py b/tools/resize_pt_files.py index c3d1475a..ae7ff89e 100644 --- a/tools/resize_pt_files.py +++ b/tools/resize_pt_files.py @@ -2,16 +2,13 @@ import json import os import sys -from typing import Any, Dict, List, Tuple # Added List +from typing import Any, Dict, List, Tuple import torch def unpack_dataset_tuple(data_tuple: Tuple) -> Dict[str, Any]: - """ - Unpacks the standard Sequifier 5-element tuple into a structured dictionary - that is easier to handle programmatically. - """ + """Unpack the standard Sequifier PT tuple.""" return { "sequences": data_tuple[0], "targets": data_tuple[1], @@ -22,9 +19,7 @@ def unpack_dataset_tuple(data_tuple: Tuple) -> Dict[str, Any]: def pack_dataset_tuple(data_dict: Dict[str, Any]) -> Tuple: - """ - Repacks the dictionary back into the 5-element tuple format expected by Sequifier. - """ + """Pack a dataset dict into the standard Sequifier PT tuple.""" return ( data_dict["sequences"], data_dict["targets"], @@ -35,33 +30,26 @@ def pack_dataset_tuple(data_dict: Dict[str, Any]) -> Tuple: def concat_dataset_list(data_list: List[Dict[str, Any]]) -> Dict[str, Any]: - """ - Concatenates a list of dataset dictionaries along dim 0. - OPTIMIZED: Uses torch.cat on a list of tensors (O(N)) instead of iterative pairwise concat (O(N^2)). - """ + """Concatenate dataset dictionaries along dim 0.""" if not data_list: return {} - # If only one item, just return it (avoid copy) if len(data_list) == 1: return data_list[0] combined = {} first = data_list[0] - # Concatenate sequence dicts combined["sequences"] = { k: torch.cat([d["sequences"][k] for d in data_list], dim=0) for k in first["sequences"] } - # Concatenate target dicts combined["targets"] = { k: torch.cat([d["targets"][k] for d in data_list], dim=0) for k in first["targets"] } - # Concatenate metadata tensors combined["seq_ids"] = torch.cat([d["seq_ids"] for d in data_list], dim=0) combined["sub_ids"] = torch.cat([d["sub_ids"] for d in data_list], dim=0) combined["start_pos"] = torch.cat([d["start_pos"] for d in data_list], dim=0) @@ -69,12 +57,8 @@ def concat_dataset_list(data_list: List[Dict[str, Any]]) -> Dict[str, Any]: return combined -# ... [slice_dataset, clone_dataset, get_row_size_bytes remain unchanged] ... def slice_dataset(data: Dict[str, Any], start: int, end: int) -> Dict[str, Any]: - """ - Slices a dataset dictionary from start to end index. - Returns a view (fast), not a copy. - """ + """Slice a dataset dictionary without cloning.""" sliced = {} sliced["sequences"] = {k: v[start:end] for k, v in data["sequences"].items()} sliced["targets"] = {k: v[start:end] for k, v in data["targets"].items()} @@ -85,10 +69,7 @@ def slice_dataset(data: Dict[str, Any], start: int, end: int) -> Dict[str, Any]: def clone_dataset(data: Dict[str, Any]) -> Dict[str, Any]: - """ - Deep clones a dataset. Used for the remainder to allow the - large original tensor to be freed from memory. - """ + """Clone all tensors in a dataset dictionary.""" cloned = {} cloned["sequences"] = {k: v.clone() for k, v in data["sequences"].items()} cloned["targets"] = {k: v.clone() for k, v in data["targets"].items()} @@ -99,14 +80,10 @@ def clone_dataset(data: Dict[str, Any]) -> Dict[str, Any]: def get_row_size_bytes(data: Dict[str, Any]) -> float: - """ - Calculates the exact size in bytes of a single row in the dataset. - """ + """Return bytes per row across sequence/target tensors.""" total_bytes = 0 - # Add size of one row for every tensor in sequences for t in data["sequences"].values(): total_bytes += t.element_size() * t.shape[1] - # Add size of one row for every tensor in targets for t in data["targets"].values(): total_bytes += t.element_size() * t.shape[1] @@ -127,7 +104,6 @@ def process_split( ): os.makedirs(output_dir, exist_ok=True) - # 1. Determine File Order via metadata meta_path = os.path.join(input_dir, "metadata.json") if os.path.exists(meta_path): with open(meta_path, "r") as f: @@ -141,7 +117,6 @@ def process_split( f"Warning: No metadata.json found in {input_dir}. Using alphabetical sort." ) - # State variables data_buffer: List[Dict[str, Any]] = [] buffer_row_count = 0 @@ -150,18 +125,16 @@ def process_split( total_samples_processed = 0 target_bytes = target_size_mb * 1024 * 1024 - target_rows = None # Calculated dynamically on first load + target_rows = None print(f"Processing {input_dir} -> {output_dir}") - # 2. Iterate Files for file_name in input_files: file_path = os.path.join(input_dir, file_name) if not os.path.exists(file_path): continue try: - # Load file loaded_tuple = torch.load(file_path, map_location="cpu", weights_only=False) current_data = unpack_dataset_tuple(loaded_tuple) @@ -169,27 +142,21 @@ def process_split( if current_rows == 0: continue - # Calculate target_rows if not yet set (once per split) if target_rows is None: bytes_per_row = get_row_size_bytes(current_data) target_rows = max(1, int(target_bytes / bytes_per_row)) - # Add to buffer data_buffer.append(current_data) buffer_row_count += current_rows - # 3. Flush Buffer if we have enough data if buffer_row_count >= target_rows: - # O(N) Merge full_data = concat_dataset_list(data_buffer) - # Clear buffer references immediately data_buffer = [] buffer_row_count = 0 num_rows = full_data["seq_ids"].shape[0] - # Slice and Save Loop start_idx = 0 while start_idx + target_rows <= num_rows: end_idx = start_idx + target_rows @@ -209,24 +176,19 @@ def process_split( start_idx = end_idx - # Handle Remainder if start_idx < num_rows: - # Clone remainder to free the massive full_data tensor remainder_data = clone_dataset( slice_dataset(full_data, start_idx, num_rows) ) - # Start new buffer with remainder data_buffer = [remainder_data] buffer_row_count = remainder_data["seq_ids"].shape[0] - # Explicitly free full_data del full_data except Exception as e: print(f"Error processing {file_path}: {e}") sys.exit(1) - # 4. Flush final remainder if buffer_row_count > 0: full_data = concat_dataset_list(data_buffer) fname = f"{dataset_name}-{split_suffix}-{output_batch_idx}.pt" @@ -237,7 +199,6 @@ def process_split( new_batch_files_metadata.append({"path": fname, "samples": chunk_len}) total_samples_processed += chunk_len - # 5. Write New Metadata new_metadata = { "total_samples": total_samples_processed, "batch_files": new_batch_files_metadata, @@ -245,7 +206,6 @@ def process_split( with open(os.path.join(output_dir, "metadata.json"), "w") as f: json.dump(new_metadata, f, indent=4) - # 6. Validation if ( expected_total_samples is not None and total_samples_processed != expected_total_samples diff --git a/tools/split_file.py b/tools/split_file.py index 1cceee9a..aa99ee79 100644 --- a/tools/split_file.py +++ b/tools/split_file.py @@ -4,7 +4,7 @@ def split_file_up( data: pd.DataFrame, number_of_files: int, - seq_length: int, + context_length: int, prediction_length: int, folder_path: str, ): @@ -15,18 +15,21 @@ def split_file_up( i_offset = 0 first_start = True for i in range(number_of_files): - if (i * rows_per_file) >= (seq_length - prediction_length): + if (i * rows_per_file) >= (context_length - prediction_length): if first_start: start = 0 first_start = False else: start = ( - leading_rows + (i * rows_per_file) - seq_length + prediction_length + leading_rows + + (i * rows_per_file) + - context_length + + prediction_length ) end = leading_rows + ((i + 1) * rows_per_file) + 1 print( - f"{start = }, {end = }, {(start + (seq_length - prediction_length)) = }, {(end - (start + (seq_length - prediction_length))) = })" + f"{start = }, {end = }, {(start + (context_length - prediction_length)) = }, {(end - (start + (context_length - prediction_length))) = })" ) data_subset = data.iloc[start:end, :] data_subset.to_parquet( diff --git a/tools/stream_folder_via_scp.py b/tools/stream_folder_via_scp.py index 7c116fc1..f5bcf543 100644 --- a/tools/stream_folder_via_scp.py +++ b/tools/stream_folder_via_scp.py @@ -10,14 +10,10 @@ def upload_worker(sftp, upload_queue): - """ - Worker thread that reads (local_path, remote_path) from queue, - uploads via SFTP, and deletes the local temp file. - """ + """Upload queued zip batches and delete local temp files.""" while True: task = upload_queue.get() if task is None: - # Sentinel value received, stop processing upload_queue.task_done() break @@ -29,23 +25,20 @@ def upload_worker(sftp, upload_queue): except Exception as e: print(f" [ERR] Failed to upload Batch {batch_num}: {e}") finally: - # Clean up local temp file after upload (or failure) if os.path.exists(local_path): os.remove(local_path) upload_queue.task_done() def create_zip_locally(files, source_root, batch_num): - """Zips files to a temp file and returns the path.""" + """Zip a batch of files into a temp archive.""" print(f"[+] Zipping Batch {batch_num} ({len(files)} files)...") - # Create temp file fd, tmp_path = tempfile.mkstemp(suffix=".zip") - os.close(fd) # Close file descriptor, we only need path + os.close(fd) with zipfile.ZipFile(tmp_path, "w", zipfile.ZIP_DEFLATED) as zf: for file_path in files: - # Preserve folder structure relative to the parent of source_root rel_path = os.path.relpath(file_path, os.path.dirname(source_root)) zf.write(file_path, arcname=rel_path) @@ -74,7 +67,6 @@ def main(): password = getpass.getpass(f"Password for {args.remote_user}@{args.remote_host}: ") chunk_size = args.chunk_mb * 1024 * 1024 - # Connect SSH/SFTP ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) @@ -82,7 +74,6 @@ def main(): ssh.connect(args.remote_host, username=args.remote_user, password=password) sftp = ssh.open_sftp() - # Setup Remote Directory folder_name = os.path.basename(source_path.rstrip(os.sep)) target_dir = f"{args.remote_path.rstrip('/')}/{folder_name}-zips" @@ -91,14 +82,12 @@ def main(): except FileNotFoundError: sftp.mkdir(target_dir) - # Start Upload Worker Thread upload_q = queue.Queue() worker = threading.Thread( target=upload_worker, args=(sftp, upload_q), daemon=True ) worker.start() - # Main Loop: Walk and Zip batch_files = [] current_batch_size = 0 batch_count = 1 @@ -109,14 +98,11 @@ def main(): size = os.path.getsize(full_path) if current_batch_size + size > chunk_size and batch_files: - # 1. Create Zip (Blocking Main Thread) zip_path = create_zip_locally(batch_files, source_path, batch_count) - # 2. Queue for Upload (Non-Blocking) remote_zip_path = f"{target_dir}/batch_{batch_count:03d}.zip" upload_q.put((zip_path, remote_zip_path, batch_count)) - # 3. Reset for next batch immediately batch_files = [] current_batch_size = 0 batch_count += 1 @@ -124,16 +110,14 @@ def main(): batch_files.append(full_path) current_batch_size += size - # Process final batch if batch_files: zip_path = create_zip_locally(batch_files, source_path, batch_count) remote_zip_path = f"{target_dir}/batch_{batch_count:03d}.zip" upload_q.put((zip_path, remote_zip_path, batch_count)) - # Wait for uploads to finish print("[*] Local processing done. Waiting for remaining uploads...") - upload_q.put(None) # Send sentinel to stop worker - worker.join() # Wait for worker to finish + upload_q.put(None) + worker.join() print("[+] Streaming complete.") except paramiko.AuthenticationException: diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..f4d5481e --- /dev/null +++ b/uv.lock @@ -0,0 +1,2269 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x'", + "python_full_version < '3.11' and platform_machine == 's390x'", +] + +[[package]] +name = "agate" +version = "1.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "isodate" }, + { name = "leather" }, + { name = "parsedatetime" }, + { name = "python-slugify" }, + { name = "pytimeparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/48/dc4d02dba00fbe62e966ed1a7d991e51654668ab343a2738bb816aa82256/agate-1.14.2.tar.gz", hash = "sha256:7f29841c39d84b1de7fde762b8d792085371515324f3a01413b20f810398225b", size = 204186, upload-time = "2026-02-27T16:35:55.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/70/9977183cff3420eb1a49a31bb709e90b76ea86b6e7a090de1ea41fac14c5/agate-1.14.2-py3-none-any.whl", hash = "sha256:e11018371d344dda5aca16a68830b6f8e86c84c531a7bb8f81456bf5014937d4", size = 95981, upload-time = "2026-02-27T16:35:53.863Z" }, +] + +[[package]] +name = "agate-dbf" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "agate" }, + { name = "dbfread" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/d8/abf6f39bd8c5767cc367472ea59f7d7cc4d5728388974a1b26a9472a971f/agate_dbf-0.2.4.tar.gz", hash = "sha256:6554828b10048a76dbb5bc4eff8911e059ea2b47155b7a89351e382915ca16fc", size = 7547, upload-time = "2025-12-15T18:47:46.682Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/2b/f9661a20b2812e7b3572c082b1cdf190a3c12e5cbfb2ef588c04ac47cbce/agate_dbf-0.2.4-py3-none-any.whl", hash = "sha256:65ef9df31cf25dcf829123fde63044ee7242bca6c47cbd90cedf318e1be0ad3e", size = 3696, upload-time = "2025-12-15T18:47:45.251Z" }, +] + +[[package]] +name = "agate-excel" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "agate" }, + { name = "olefile" }, + { name = "openpyxl" }, + { name = "xlrd" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/e5/b2d1bc555fd91145de5d11a7b31241076586713d222881c6d7eac9e4fda9/agate_excel-0.4.2.tar.gz", hash = "sha256:eed1dc6239f0e96720d962dc1bdfb4496e19687332c827fd8b1e587a917ea202", size = 271423, upload-time = "2025-12-15T18:48:59.689Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/cf/d34f66780f47c6eed299ee522eaee7fbe56014f3adfdb40b5e64fbec548b/agate_excel-0.4.2-py3-none-any.whl", hash = "sha256:f93f09b3ac02489ed2ed8669c7b3ce74eab30ebf9a03038c0283211dbc3b9c1a", size = 7227, upload-time = "2025-12-15T18:48:58.442Z" }, +] + +[[package]] +name = "agate-sql" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "agate" }, + { name = "sqlalchemy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/fe/fc7662f1ec3c0917c377f74f143a479eb13c9ae5fe14d77ce28eb165564f/agate_sql-0.7.3.tar.gz", hash = "sha256:4c588a28e80bc625c7d5f915e8f8dff4900140a8a6d8a350a098a2ba9adf9d33", size = 13936, upload-time = "2025-12-15T18:47:59.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/be/8f425d3e5846fb10a627a572e671a1ba2c2a51df4d398221f40f7b666310/agate_sql-0.7.3-py3-none-any.whl", hash = "sha256:57046f628dbffb125c36c94675716b441b40193bc18461f04e32a3153a8a0971", size = 7464, upload-time = "2025-12-15T18:47:58.295Z" }, +] + +[[package]] +name = "alembic" +version = "1.18.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", size = 2056725, upload-time = "2026-02-10T16:00:47.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", size = 263893, upload-time = "2026-02-10T16:00:49.997Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "beartype" +version = "0.18.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/15/4e623478a9628ad4cee2391f19aba0b16c1dd6fedcb2a399f0928097b597/beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927", size = 1193506, upload-time = "2024-04-21T07:25:58.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/43/7a1259741bd989723272ac7d381a43be932422abcff09a1d9f7ba212cb74/beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089", size = 917762, upload-time = "2024-04-21T07:25:55.758Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "colorlog" +version = "6.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/61/f083b5ac52e505dfc1c624eafbf8c7589a0d7f32daa398d2e7590efa5fda/colorlog-6.10.1.tar.gz", hash = "sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321", size = 17162, upload-time = "2025-10-16T16:14:11.978Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl", hash = "sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c", size = 11743, upload-time = "2025-10-16T16:14:10.512Z" }, +] + +[[package]] +name = "cramjam" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/12/34bf6e840a79130dfd0da7badfb6f7810b8fcfd60e75b0539372667b41b6/cramjam-2.11.0.tar.gz", hash = "sha256:5c82500ed91605c2d9781380b378397012e25127e89d64f460fea6aeac4389b4", size = 99100, upload-time = "2025-07-27T21:25:07.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/d3/20d0402e4e983b66603117ad3dd3b864a05d7997a830206d3ff9cacef9a2/cramjam-2.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d0859c65775e8ebf2cbc084bfd51bd0ffda10266da6f9306451123b89f8e5a63", size = 3558999, upload-time = "2025-07-27T21:21:34.105Z" }, + { url = "https://files.pythonhosted.org/packages/f5/a8/a6e2744288938ccd320a5c6f6f3653faa790f933f5edd088c6e5782a2354/cramjam-2.11.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1d77b9b0aca02a3f6eeeff27fcd315ca5972616c0919ee38e522cce257bcd349", size = 1861558, upload-time = "2025-07-27T21:21:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/96/29/7961e09a849eea7d8302e7baa6f829dd3ef3faf199cb25ed29b318ae799b/cramjam-2.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66425bc25b5481359b12a6719b6e7c90ffe76d85d0691f1da7df304bfb8ce45c", size = 1699431, upload-time = "2025-07-27T21:21:38.396Z" }, + { url = "https://files.pythonhosted.org/packages/7a/60/6665e52f01a8919bf37c43dcf0e03b6dd3866f5c4e95440b357d508ee14e/cramjam-2.11.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bd748d3407ec63e049b3aea1595e218814fccab329b7fb10bb51120a30e9fb7e", size = 2025262, upload-time = "2025-07-27T21:21:40.417Z" }, + { url = "https://files.pythonhosted.org/packages/d7/80/79bd84dbeb109e2c6efb74e661b7bd4c3ba393208ebcf69e2ae9454ae80c/cramjam-2.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6d9a23a35b3a105c42a8de60fc2e80281ae6e758f05a3baea0b68eb1ddcb679", size = 1766177, upload-time = "2025-07-27T21:21:42.224Z" }, + { url = "https://files.pythonhosted.org/packages/28/ef/b43280767ebcde022ba31f1e9902137655a956ae30e920d75630fa67e36e/cramjam-2.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:40a75b95e05e38a2a055b2446f09994ce1139151721659315151d4ad6289bbff", size = 1854031, upload-time = "2025-07-27T21:21:43.651Z" }, + { url = "https://files.pythonhosted.org/packages/60/1c/79d522757c494dfd9e9b208b0604cc7e97b481483cc477144f5705a06ab7/cramjam-2.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5d042c376d2025300da37d65192d06a457918b63b31140f697f85fd8e310b29", size = 2035812, upload-time = "2025-07-27T21:21:45.473Z" }, + { url = "https://files.pythonhosted.org/packages/c8/70/3bf0670380069b3abd4c6b53f61d3148f4e08935569c08efbeaf7550e87d/cramjam-2.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb148b35ab20c75b19a06c27f05732e2a321adbd86fadc93f9466dbd7b1154a7", size = 2067661, upload-time = "2025-07-27T21:21:47.901Z" }, + { url = "https://files.pythonhosted.org/packages/db/7e/4f6ca98a4b474348e965a529b359184785d1119ab7c4c9ec1280b8bea50a/cramjam-2.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee47c220f0f5179ddc923ab91fc9e282c27b29fabc60c433dfe06f08084f798", size = 1981523, upload-time = "2025-07-27T21:21:49.704Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6c/b241511c7ffd5f1da29641429bb0e19b5fbcffafde5ba1bbcbf9394ea456/cramjam-2.11.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0cf1b5a81b21ea175c976c3ab09e00494258f4b49b7995efc86060cced3f0b2e", size = 2034251, upload-time = "2025-07-27T21:21:51.252Z" }, + { url = "https://files.pythonhosted.org/packages/14/5c/4ef926c8c3c1bf6da96f9c53450ff334cdb6d0fc1efced0aea97e2090803/cramjam-2.11.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:360c00338ecf48921492455007f904be607fc7818de3d681acbcc542aae2fb36", size = 2155322, upload-time = "2025-07-27T21:21:53.348Z" }, + { url = "https://files.pythonhosted.org/packages/be/fb/eb2aef7fb2730e56c5a2c9000817ee8fb4a95c92f19cc6e441afed42ec29/cramjam-2.11.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f31fcc0d30dc3f3e94ea6b4d8e1a855071757c6abf6a7b1e284050ab7d4c299c", size = 2169094, upload-time = "2025-07-27T21:21:55.187Z" }, + { url = "https://files.pythonhosted.org/packages/3b/80/925a5c668dcee1c6f61775067185c5dc9a63c766d5393e5c60d2af4217a7/cramjam-2.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:033be66fdceb3d63b2c99b257a98380c4ec22c9e4dca54a2bfec3718cd24e184", size = 2159089, upload-time = "2025-07-27T21:21:57.118Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ac/b2819640eef0592a6de7ca832c0d23c69bd1620f765ce88b60dbc8da9ba2/cramjam-2.11.0-cp310-cp310-win32.whl", hash = "sha256:1c6cea67f6000b81f6bd27d14c8a6f62d00336ca7252fd03ee16f6b70eb5c0d2", size = 1605046, upload-time = "2025-07-27T21:21:58.617Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f4/06af04727b9556721049e2127656d727306d275c518e3d97f9ed4cffd0d8/cramjam-2.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:98aa4a351b047b0f7f9e971585982065028adc2c162c5c23c5d5734c5ccc1077", size = 1710647, upload-time = "2025-07-27T21:22:00.279Z" }, + { url = "https://files.pythonhosted.org/packages/d0/89/8001f6a9b6b6e9fa69bec5319789083475d6f26d52aaea209d3ebf939284/cramjam-2.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:04cfa39118570e70e920a9b75c733299784b6d269733dbc791d9aaed6edd2615", size = 3559272, upload-time = "2025-07-27T21:22:01.988Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f3/001d00070ca92e5fbe6aacc768e455568b0cde46b0eb944561a4ea132300/cramjam-2.11.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:66a18f68506290349a256375d7aa2f645b9f7993c10fc4cc211db214e4e61d2b", size = 1861743, upload-time = "2025-07-27T21:22:03.754Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/041a3af01bf3f6158f120070f798546d4383b962b63c35cd91dcbf193e17/cramjam-2.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:50e7d65533857736cd56f6509cf2c4866f28ad84dd15b5bdbf2f8a81e77fa28a", size = 1699631, upload-time = "2025-07-27T21:22:05.192Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/5358b238808abebd0c949c42635c3751204ca7cf82b29b984abe9f5e33c8/cramjam-2.11.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f71989668458fc327ac15396db28d92df22f8024bb12963929798b2729d2df5", size = 2025603, upload-time = "2025-07-27T21:22:06.726Z" }, + { url = "https://files.pythonhosted.org/packages/0e/79/19dba7c03a27408d8d11b5a7a4a7908459cfd4e6f375b73264dc66517bf6/cramjam-2.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee77ac543f1e2b22af1e8be3ae589f729491b6090582340aacd77d1d757d9569", size = 1766283, upload-time = "2025-07-27T21:22:08.568Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ad/40e4b3408501d886d082db465c33971655fe82573c535428e52ab905f4d0/cramjam-2.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad52784120e7e4d8a0b5b0517d185b8bf7f74f5e17272857ddc8951a628d9be1", size = 1854407, upload-time = "2025-07-27T21:22:10.518Z" }, + { url = "https://files.pythonhosted.org/packages/36/6e/c1b60ceb6d7ea6ff8b0bf197520aefe23f878bf2bfb0de65f2b0c2f82cd1/cramjam-2.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b86f8e6d9c1b3f9a75b2af870c93ceee0f1b827cd2507387540e053b35d7459", size = 2035793, upload-time = "2025-07-27T21:22:12.504Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ad/32a8d5f4b1e3717787945ec6d71bd1c6e6bccba4b7e903fc0d9d4e4b08c3/cramjam-2.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:320d61938950d95da2371b46c406ec433e7955fae9f396c8e1bf148ffc187d11", size = 2067499, upload-time = "2025-07-27T21:22:14.067Z" }, + { url = "https://files.pythonhosted.org/packages/ff/cd/3b5a662736ea62ff7fa4c4a10a85e050bfdaad375cc53dc80427e8afe41c/cramjam-2.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41eafc8c1653a35a5c7e75ad48138f9f60085cc05cd99d592e5298552d944e9f", size = 1981853, upload-time = "2025-07-27T21:22:15.908Z" }, + { url = "https://files.pythonhosted.org/packages/26/8e/1dbcfaaa7a702ee82ee683ec3a81656934dd7e04a7bc4ee854033686f98a/cramjam-2.11.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03a7316c6bf763dfa34279335b27702321da44c455a64de58112968c0818ec4a", size = 2034514, upload-time = "2025-07-27T21:22:17.352Z" }, + { url = "https://files.pythonhosted.org/packages/50/62/f11709bfdce74af79a88b410dcb76dedc97612166e759136931bf63cfd7b/cramjam-2.11.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:244c2ed8bd7ccbb294a2abe7ca6498db7e89d7eb5e744691dc511a7dc82e65ca", size = 2155343, upload-time = "2025-07-27T21:22:18.854Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6d/3b98b61841a5376d9a9b8468ae58753a8e6cf22be9534a0fa5af4d8621cc/cramjam-2.11.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:405f8790bad36ce0b4bbdb964ad51507bfc7942c78447f25cb828b870a1d86a0", size = 2169367, upload-time = "2025-07-27T21:22:20.389Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/bd5db5c49dbebc8b002f1c4983101b28d2e7fc9419753db1c31ec22b03ef/cramjam-2.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6b1b751a5411032b08fb3ac556160229ca01c6bbe4757bb3a9a40b951ebaac23", size = 2159334, upload-time = "2025-07-27T21:22:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/34/32/203c57acdb6eea727e7078b2219984e64ed4ad043c996ed56321301ba167/cramjam-2.11.0-cp311-cp311-win32.whl", hash = "sha256:5251585608778b9ac8effed544933df7ad85b4ba21ee9738b551f17798b215ac", size = 1605313, upload-time = "2025-07-27T21:22:24.126Z" }, + { url = "https://files.pythonhosted.org/packages/a9/bd/102d6deb87a8524ac11cddcd31a7612b8f20bf9b473c3c645045e3b957c7/cramjam-2.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:dca88bc8b68ce6d35dafd8c4d5d59a238a56c43fa02b74c2ce5f9dfb0d1ccb46", size = 1710991, upload-time = "2025-07-27T21:22:25.661Z" }, + { url = "https://files.pythonhosted.org/packages/0b/0d/7c84c913a5fae85b773a9dcf8874390f9d68ba0fcc6630efa7ff1541b950/cramjam-2.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dba5c14b8b4f73ea1e65720f5a3fe4280c1d27761238378be8274135c60bbc6e", size = 3553368, upload-time = "2025-07-27T21:22:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cc/4f6d185d8a744776f53035e72831ff8eefc2354f46ab836f4bd3c4f6c138/cramjam-2.11.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:11eb40722b3fcf3e6890fba46c711bf60f8dc26360a24876c85e52d76c33b25b", size = 1860014, upload-time = "2025-07-27T21:22:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a8/626c76263085c6d5ded0e71823b411e9522bfc93ba6cc59855a5869296e7/cramjam-2.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aeb26e2898994b6e8319f19a4d37c481512acdcc6d30e1b5ecc9d8ec57e835cb", size = 1693512, upload-time = "2025-07-27T21:22:30.999Z" }, + { url = "https://files.pythonhosted.org/packages/e9/52/0851a16a62447532e30ba95a80e638926fdea869a34b4b5b9d0a020083ba/cramjam-2.11.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f8d82081ed7d8fe52c982bd1f06e4c7631a73fe1fb6d4b3b3f2404f87dc40fe", size = 2025285, upload-time = "2025-07-27T21:22:32.954Z" }, + { url = "https://files.pythonhosted.org/packages/98/76/122e444f59dbc216451d8e3d8282c9665dc79eaf822f5f1470066be1b695/cramjam-2.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:092a3ec26e0a679305018380e4f652eae1b6dfe3fc3b154ee76aa6b92221a17c", size = 1761327, upload-time = "2025-07-27T21:22:34.484Z" }, + { url = "https://files.pythonhosted.org/packages/a3/bc/3a0189aef1af2b29632c039c19a7a1b752bc21a4053582a5464183a0ad3d/cramjam-2.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:529d6d667c65fd105d10bd83d1cd3f9869f8fd6c66efac9415c1812281196a92", size = 1854075, upload-time = "2025-07-27T21:22:36.157Z" }, + { url = "https://files.pythonhosted.org/packages/2e/80/8a6343b13778ce52d94bb8d5365a30c3aa951276b1857201fe79d7e2ad25/cramjam-2.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:555eb9c90c450e0f76e27d9ff064e64a8b8c6478ab1a5594c91b7bc5c82fd9f0", size = 2032710, upload-time = "2025-07-27T21:22:38.17Z" }, + { url = "https://files.pythonhosted.org/packages/df/6b/cd1778a207c29eda10791e3dfa018b588001928086e179fc71254793c625/cramjam-2.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5edf4c9e32493035b514cf2ba0c969d81ccb31de63bd05490cc8bfe3b431674e", size = 2068353, upload-time = "2025-07-27T21:22:39.615Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f0/5c2a5cd5711032f3b191ca50cb786c17689b4a9255f9f768866e6c9f04d9/cramjam-2.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2fe41f48c4d58d923803383b0737f048918b5a0d10390de9628bb6272b107", size = 1978104, upload-time = "2025-07-27T21:22:41.106Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8b/b363a5fb2c3347504fe9a64f8d0f1e276844f0e532aa7162c061cd1ffee4/cramjam-2.11.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9ca14cf1cabdb0b77d606db1bb9e9ca593b1dbd421fcaf251ec9a5431ec449f3", size = 2030779, upload-time = "2025-07-27T21:22:42.969Z" }, + { url = "https://files.pythonhosted.org/packages/78/7b/d83dad46adb6c988a74361f81ad9c5c22642be53ad88616a19baedd06243/cramjam-2.11.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:309e95bf898829476bccf4fd2c358ec00e7ff73a12f95a3cdeeba4bb1d3683d5", size = 2155297, upload-time = "2025-07-27T21:22:44.6Z" }, + { url = "https://files.pythonhosted.org/packages/1a/be/60d9be4cb33d8740a4aa94c7513f2ef3c4eba4fd13536f086facbafade71/cramjam-2.11.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:86dca35d2f15ef22922411496c220f3c9e315d5512f316fe417461971cc1648d", size = 2169255, upload-time = "2025-07-27T21:22:46.534Z" }, + { url = "https://files.pythonhosted.org/packages/11/b0/4a595f01a243aec8ad272b160b161c44351190c35d98d7787919d962e9e5/cramjam-2.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:193c6488bd2f514cbc0bef5c18fad61a5f9c8d059dd56edf773b3b37f0e85496", size = 2155651, upload-time = "2025-07-27T21:22:48.46Z" }, + { url = "https://files.pythonhosted.org/packages/38/47/7776659aaa677046b77f527106e53ddd47373416d8fcdb1e1a881ec5dc06/cramjam-2.11.0-cp312-cp312-win32.whl", hash = "sha256:514e2c008a8b4fa823122ca3ecab896eac41d9aa0f5fc881bd6264486c204e32", size = 1603568, upload-time = "2025-07-27T21:22:50.084Z" }, + { url = "https://files.pythonhosted.org/packages/75/b1/d53002729cfd94c5844ddfaf1233c86d29f2dbfc1b764a6562c41c044199/cramjam-2.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:53fed080476d5f6ad7505883ec5d1ec28ba36c2273db3b3e92d7224fe5e463db", size = 1709287, upload-time = "2025-07-27T21:22:51.534Z" }, + { url = "https://files.pythonhosted.org/packages/0a/8b/406c5dc0f8e82385519d8c299c40fd6a56d97eca3fcd6f5da8dad48de75b/cramjam-2.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2c289729cc1c04e88bafa48b51082fb462b0a57dbc96494eab2be9b14dca62af", size = 3553330, upload-time = "2025-07-27T21:22:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/00/ad/4186884083d6e4125b285903e17841827ab0d6d0cffc86216d27ed91e91d/cramjam-2.11.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:045201ee17147e36cf43d8ae2fa4b4836944ac672df5874579b81cf6d40f1a1f", size = 1859756, upload-time = "2025-07-27T21:22:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/54/01/91b485cf76a7efef638151e8a7d35784dae2c4ff221b1aec2c083e4b106d/cramjam-2.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:619cd195d74c9e1d2a3ad78d63451d35379c84bd851aec552811e30842e1c67a", size = 1693609, upload-time = "2025-07-27T21:22:56.331Z" }, + { url = "https://files.pythonhosted.org/packages/cd/84/d0c80d279b2976870fc7d10f15dcb90a3c10c06566c6964b37c152694974/cramjam-2.11.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6eb3ae5ab72edb2ed68bdc0f5710f0a6cad7fd778a610ec2c31ee15e32d3921e", size = 2024912, upload-time = "2025-07-27T21:22:57.915Z" }, + { url = "https://files.pythonhosted.org/packages/d6/70/88f2a5cb904281ed5d3c111b8f7d5366639817a5470f059bcd26833fc870/cramjam-2.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7da3f4b19e3078f9635f132d31b0a8196accb2576e3213ddd7a77f93317c20", size = 1760715, upload-time = "2025-07-27T21:22:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/cf5b02081132537d28964fb385fcef9ed9f8a017dd7d8c59d317e53ba50d/cramjam-2.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57286b289cd557ac76c24479d8ecfb6c3d5b854cce54ccc7671f9a2f5e2a2708", size = 1853782, upload-time = "2025-07-27T21:23:01.07Z" }, + { url = "https://files.pythonhosted.org/packages/57/27/63525087ed40a53d1867021b9c4858b80cc86274ffe7225deed067d88d92/cramjam-2.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28952fbbf8b32c0cb7fa4be9bcccfca734bf0d0989f4b509dc7f2f70ba79ae06", size = 2032354, upload-time = "2025-07-27T21:23:03.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ef/dbba082c6ebfb6410da4dd39a64e654d7194fcfd4567f85991a83fa4ec32/cramjam-2.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78ed2e4099812a438b545dfbca1928ec825e743cd253bc820372d6ef8c3adff4", size = 2068007, upload-time = "2025-07-27T21:23:04.526Z" }, + { url = "https://files.pythonhosted.org/packages/35/ce/d902b9358a46a086938feae83b2251720e030f06e46006f4c1fc0ac9da20/cramjam-2.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9aecd5c3845d415bd6c9957c93de8d93097e269137c2ecb0e5a5256374bdc8", size = 1977485, upload-time = "2025-07-27T21:23:06.058Z" }, + { url = "https://files.pythonhosted.org/packages/e8/03/982f54553244b0afcbdb2ad2065d460f0ab05a72a96896a969a1ca136a1e/cramjam-2.11.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:362fcf4d6f5e1242a4540812455f5a594949190f6fbc04f2ffbfd7ae0266d788", size = 2030447, upload-time = "2025-07-27T21:23:07.679Z" }, + { url = "https://files.pythonhosted.org/packages/74/5f/748e54cdb665ec098ec519e23caacc65fc5ae58718183b071e33fc1c45b4/cramjam-2.11.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:13240b3dea41b1174456cb9426843b085dc1a2bdcecd9ee2d8f65ac5703374b0", size = 2154949, upload-time = "2025-07-27T21:23:09.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/81/c4e6cb06ed69db0dc81f9a8b1dc74995ebd4351e7a1877143f7031ff2700/cramjam-2.11.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:c54eed83726269594b9086d827decc7d2015696e31b99bf9b69b12d9063584fe", size = 2168925, upload-time = "2025-07-27T21:23:10.976Z" }, + { url = "https://files.pythonhosted.org/packages/13/5b/966365523ce8290a08e163e3b489626c5adacdff2b3da9da1b0823dfb14e/cramjam-2.11.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f8195006fdd0fc0a85b19df3d64a3ef8a240e483ae1dfc7ac6a4316019eb5df2", size = 2154950, upload-time = "2025-07-27T21:23:12.514Z" }, + { url = "https://files.pythonhosted.org/packages/3a/7d/7f8eb5c534b72b32c6eb79d74585bfee44a9a5647a14040bb65c31c2572d/cramjam-2.11.0-cp313-cp313-win32.whl", hash = "sha256:ccf30e3fe6d770a803dcdf3bb863fa44ba5dc2664d4610ba2746a3c73599f2e4", size = 1603199, upload-time = "2025-07-27T21:23:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/37/05/47b5e0bf7c41a3b1cdd3b7c2147f880c93226a6bef1f5d85183040cbdece/cramjam-2.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ee36348a204f0a68b03400f4736224e9f61d1c6a1582d7f875c1ca56f0254268", size = 1708924, upload-time = "2025-07-27T21:23:16.332Z" }, + { url = "https://files.pythonhosted.org/packages/de/07/a1051cdbbe6d723df16d756b97f09da7c1adb69e29695c58f0392bc12515/cramjam-2.11.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7ba5e38c9fbd06f086f4a5a64a1a5b7b417cd3f8fc07a20e5c03651f72f36100", size = 3554141, upload-time = "2025-07-27T21:23:17.938Z" }, + { url = "https://files.pythonhosted.org/packages/74/66/58487d2e16ef3d04f51a7c7f0e69823e806744b4c21101e89da4873074bc/cramjam-2.11.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8adeee57b41fe08e4520698a4b0bd3cc76dbd81f99424b806d70a5256a391d3", size = 1860353, upload-time = "2025-07-27T21:23:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/67/b4/67f6254d166ffbcc9d5fa1b56876eaa920c32ebc8e9d3d525b27296b693b/cramjam-2.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b96a74fa03a636c8a7d76f700d50e9a8bc17a516d6a72d28711225d641e30968", size = 1693832, upload-time = "2025-07-27T21:23:21.185Z" }, + { url = "https://files.pythonhosted.org/packages/55/a3/4e0b31c0d454ae70c04684ed7c13d3c67b4c31790c278c1e788cb804fa4a/cramjam-2.11.0-cp314-cp314-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c3811a56fa32e00b377ef79121c0193311fd7501f0fb378f254c7f083cc1fbe0", size = 2027080, upload-time = "2025-07-27T21:23:23.303Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c7/5e8eed361d1d3b8be14f38a54852c5370cc0ceb2c2d543b8ba590c34f080/cramjam-2.11.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d927e87461f8a0d448e4ab5eb2bca9f31ca5d8ea86d70c6f470bb5bc666d7e", size = 1761543, upload-time = "2025-07-27T21:23:24.991Z" }, + { url = "https://files.pythonhosted.org/packages/09/0c/06b7f8b0ce9fde89470505116a01fc0b6cb92d406c4fb1e46f168b5d3fa5/cramjam-2.11.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f1f5c450121430fd89cb5767e0a9728ecc65997768fd4027d069cb0368af62f9", size = 1854636, upload-time = "2025-07-27T21:23:26.987Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c6/6ebc02c9d5acdf4e5f2b1ec6e1252bd5feee25762246798ae823b3347457/cramjam-2.11.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:724aa7490be50235d97f07e2ca10067927c5d7f336b786ddbc868470e822aa25", size = 2032715, upload-time = "2025-07-27T21:23:28.603Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/a122971c23f5ca4b53e4322c647ac7554626c95978f92d19419315dddd05/cramjam-2.11.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54c4637122e7cfd7aac5c1d3d4c02364f446d6923ea34cf9d0e8816d6e7a4936", size = 2069039, upload-time = "2025-07-27T21:23:30.319Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/f6121b90b86b9093c066889274d26a1de3f29969d45c2ed1ecbe2033cb78/cramjam-2.11.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17eb39b1696179fb471eea2de958fa21f40a2cd8bf6b40d428312d5541e19dc4", size = 1979566, upload-time = "2025-07-27T21:23:32.002Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/f95bc57fd7f4166ce6da816cfa917fb7df4bb80e669eb459d85586498414/cramjam-2.11.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:36aa5a798aa34e11813a80425a30d8e052d8de4a28f27bfc0368cfc454d1b403", size = 2030905, upload-time = "2025-07-27T21:23:33.696Z" }, + { url = "https://files.pythonhosted.org/packages/fc/52/e429de4e8bc86ee65e090dae0f87f45abd271742c63fb2d03c522ffde28a/cramjam-2.11.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:449fca52774dc0199545fbf11f5128933e5a6833946707885cf7be8018017839", size = 2155592, upload-time = "2025-07-27T21:23:35.375Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6c/65a7a0207787ad39ad804af4da7f06a60149de19481d73d270b540657234/cramjam-2.11.0-cp314-cp314-musllinux_1_1_i686.whl", hash = "sha256:d87d37b3d476f4f7623c56a232045d25bd9b988314702ea01bd9b4a94948a778", size = 2170839, upload-time = "2025-07-27T21:23:37.197Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c5/5c5db505ba692bc844246b066e23901d5905a32baf2f33719c620e65887f/cramjam-2.11.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:26cb45c47d71982d76282e303931c6dd4baee1753e5d48f9a89b3a63e690b3a3", size = 2157236, upload-time = "2025-07-27T21:23:38.854Z" }, + { url = "https://files.pythonhosted.org/packages/b0/22/88e6693e60afe98901e5bbe91b8dea193e3aa7f42e2770f9c3339f5c1065/cramjam-2.11.0-cp314-cp314-win32.whl", hash = "sha256:4efe919d443c2fd112fe25fe636a52f9628250c9a50d9bddb0488d8a6c09acc6", size = 1604136, upload-time = "2025-07-27T21:23:40.56Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f8/01618801cd59ccedcc99f0f96d20be67d8cfc3497da9ccaaad6b481781dd/cramjam-2.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ccec3524ea41b9abd5600e3e27001fd774199dbb4f7b9cb248fcee37d4bda84c", size = 1710272, upload-time = "2025-07-27T21:23:42.236Z" }, + { url = "https://files.pythonhosted.org/packages/40/81/6cdb3ed222d13ae86bda77aafe8d50566e81a1169d49ed195b6263610704/cramjam-2.11.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:966ac9358b23d21ecd895c418c048e806fd254e46d09b1ff0cdad2eba195ea3e", size = 3559671, upload-time = "2025-07-27T21:23:44.504Z" }, + { url = "https://files.pythonhosted.org/packages/cb/43/52b7e54fe5ba1ef0270d9fdc43dabd7971f70ea2d7179be918c997820247/cramjam-2.11.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:387f09d647a0d38dcb4539f8a14281f8eb6bb1d3e023471eb18a5974b2121c86", size = 1867876, upload-time = "2025-07-27T21:23:46.987Z" }, + { url = "https://files.pythonhosted.org/packages/9d/28/30d5b8d10acd30db3193bc562a313bff722888eaa45cfe32aa09389f2b24/cramjam-2.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:665b0d8fbbb1a7f300265b43926457ec78385200133e41fef19d85790fc1e800", size = 1695562, upload-time = "2025-07-27T21:23:48.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/86/ec806f986e01b896a650655024ea52a13e25c3ac8a3a382f493089483cdc/cramjam-2.11.0-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca905387c7a371531b9622d93471be4d745ef715f2890c3702479cd4fc85aa51", size = 2025056, upload-time = "2025-07-27T21:23:50.404Z" }, + { url = "https://files.pythonhosted.org/packages/09/43/c2c17586b90848d29d63181f7d14b8bd3a7d00975ad46e3edf2af8af7e1f/cramjam-2.11.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1aa56aef2c8af55a21ed39040a94a12b53fb23beea290f94d19a76027e2ffb", size = 1764084, upload-time = "2025-07-27T21:23:52.265Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a9/68bc334fadb434a61df10071dc8606702aa4f5b6cdb2df62474fc21d2845/cramjam-2.11.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e5db59c1cdfaa2ab85cc988e602d6919495f735ca8a5fd7603608eb1e23c26d5", size = 1854859, upload-time = "2025-07-27T21:23:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4e/b48e67835b5811ec5e9cb2e2bcba9c3fd76dab3e732569fe801b542c6ca9/cramjam-2.11.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1f893014f00fe5e89a660a032e813bf9f6d91de74cd1490cdb13b2b59d0c9a3", size = 2035970, upload-time = "2025-07-27T21:23:55.758Z" }, + { url = "https://files.pythonhosted.org/packages/c4/70/d2ac33d572b4d90f7f0f2c8a1d60fb48f06b128fdc2c05f9b49891bb0279/cramjam-2.11.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c26a1eb487947010f5de24943bd7c422dad955b2b0f8650762539778c380ca89", size = 2069320, upload-time = "2025-07-27T21:23:57.494Z" }, + { url = "https://files.pythonhosted.org/packages/1d/4c/85cec77af4a74308ba5fca8e296c4e2f80ec465c537afc7ab1e0ca2f9a00/cramjam-2.11.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d5c8bfb438d94e7b892d1426da5fc4b4a5370cc360df9b8d9d77c33b896c37e", size = 1982668, upload-time = "2025-07-27T21:23:59.126Z" }, + { url = "https://files.pythonhosted.org/packages/55/45/938546d1629e008cc3138df7c424ef892719b1796ff408a2ab8550032e5e/cramjam-2.11.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:cb1fb8c9337ab0da25a01c05d69a0463209c347f16512ac43be5986f3d1ebaf4", size = 2034028, upload-time = "2025-07-27T21:24:00.865Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/b5a53e20505555f1640e66dcf70394bcf51a1a3a072aa18ea35135a0f9ed/cramjam-2.11.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:1f6449f6de52dde3e2f1038284910c8765a397a25e2d05083870f3f5e7fc682c", size = 2155513, upload-time = "2025-07-27T21:24:02.92Z" }, + { url = "https://files.pythonhosted.org/packages/84/12/8d3f6ceefae81bbe45a347fdfa2219d9f3ac75ebc304f92cd5fcb4fbddc5/cramjam-2.11.0-cp314-cp314t-musllinux_1_1_i686.whl", hash = "sha256:382dec4f996be48ed9c6958d4e30c2b89435d7c2c4dbf32480b3b8886293dd65", size = 2170035, upload-time = "2025-07-27T21:24:04.558Z" }, + { url = "https://files.pythonhosted.org/packages/4b/85/3be6f0a1398f976070672be64f61895f8839857618a2d8cc0d3ab529d3dc/cramjam-2.11.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:d388bd5723732c3afe1dd1d181e4213cc4e1be210b080572e7d5749f6e955656", size = 2160229, upload-time = "2025-07-27T21:24:06.729Z" }, + { url = "https://files.pythonhosted.org/packages/57/5e/66cfc3635511b20014bbb3f2ecf0095efb3049e9e96a4a9e478e4f3d7b78/cramjam-2.11.0-cp314-cp314t-win32.whl", hash = "sha256:0a70ff17f8e1d13f322df616505550f0f4c39eda62290acb56f069d4857037c8", size = 1610267, upload-time = "2025-07-27T21:24:08.428Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c6/c71e82e041c95ffe6a92ac707785500aa2a515a4339c2c7dd67e3c449249/cramjam-2.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:028400d699442d40dbda02f74158c73d05cb76587a12490d0bfedd958fd49188", size = 1713108, upload-time = "2025-07-27T21:24:10.147Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8f/82e35ec3c5387f1864f46b3c24bce89a07af8bb3ef242ae47281db2c1848/cramjam-2.11.0-pp310-pypy310_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:37bed927abc4a7ae2d2669baa3675e21904d8a038ed8e4313326ea7b3be62b2b", size = 3573104, upload-time = "2025-07-27T21:24:40.069Z" }, + { url = "https://files.pythonhosted.org/packages/f0/4e/0c821918080a32ba1e52c040e12dd02dada67728f07305c5f778b808a807/cramjam-2.11.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:50e4a58635fa8c6897d84847d6e065eb69f92811670fc5e9f2d9e3b6279a02b6", size = 1873441, upload-time = "2025-07-27T21:24:42.333Z" }, + { url = "https://files.pythonhosted.org/packages/a8/fd/848d077bf6abc4ce84273d8e3f3a70d61a2240519a339462f699d8acf829/cramjam-2.11.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3d1ba626dd5f81f7f09bbf59f70b534e2b75e0d6582b056b7bd31b397f1c13e9", size = 1702589, upload-time = "2025-07-27T21:24:44.305Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1c/899818999bbdb59c601756b413e87d37fd65875d1315346c10e367bb3505/cramjam-2.11.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c71e140d5eb3145d61d59d0be0bf72f07cc4cf4b32cb136b09f712a3b1040f5f", size = 1773646, upload-time = "2025-07-27T21:24:46.495Z" }, + { url = "https://files.pythonhosted.org/packages/5f/26/c2813c5422c43b3dcd8b6645bc359f08870737c44325ee4accc18f24eee0/cramjam-2.11.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a6ed7926a5cca28edebad7d0fedd2ad492710ae3524d25fc59a2b20546d9ce1", size = 1994179, upload-time = "2025-07-27T21:24:49.131Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4f/af984f8d7f963f0301812cdd620ddcfd8276461ed7a786c0f89e82b14739/cramjam-2.11.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5eb4ed3cea945b164b0513fd491884993acac2153a27b93a84019c522e8eda82", size = 1714790, upload-time = "2025-07-27T21:24:51.045Z" }, + { url = "https://files.pythonhosted.org/packages/81/da/b3301962ccd6fce9fefa1ecd8ea479edaeaa38fadb1f34d5391d2587216a/cramjam-2.11.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:52d5db3369f95b27b9f3c14d067acb0b183333613363ed34268c9e04560f997f", size = 3573546, upload-time = "2025-07-27T21:24:52.944Z" }, + { url = "https://files.pythonhosted.org/packages/b6/c2/410ddb8ad4b9dfb129284666293cb6559479645da560f7077dc19d6bee9e/cramjam-2.11.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4820516366d455b549a44d0e2210ee7c4575882dda677564ce79092588321d54", size = 1873654, upload-time = "2025-07-27T21:24:54.958Z" }, + { url = "https://files.pythonhosted.org/packages/d5/99/f68a443c64f7ce7aff5bed369b0aa5b2fac668fa3dfd441837e316e97a1f/cramjam-2.11.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d9e5db525dc0a950a825202f84ee68d89a072479e07da98795a3469df942d301", size = 1702846, upload-time = "2025-07-27T21:24:57.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/02/0ff358ab773def1ee3383587906c453d289953171e9c92db84fdd01bf172/cramjam-2.11.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62ab4971199b2270005359cdc379bc5736071dc7c9a228581c5122d9ffaac50c", size = 1773683, upload-time = "2025-07-27T21:24:59.28Z" }, + { url = "https://files.pythonhosted.org/packages/e9/31/3298e15f87c9cf2aabdbdd90b153d8644cf989cb42a45d68a1b71e1f7aaf/cramjam-2.11.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24758375cc5414d3035ca967ebb800e8f24604ececcba3c67d6f0218201ebf2d", size = 1994136, upload-time = "2025-07-27T21:25:01.565Z" }, + { url = "https://files.pythonhosted.org/packages/c7/90/20d1747255f1ee69a412e319da51ea594c18cca195e7a4d4c713f045eff5/cramjam-2.11.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6c2eea545fef1065c7dd4eda991666fd9c783fbc1d226592ccca8d8891c02f23", size = 1714982, upload-time = "2025-07-27T21:25:05.79Z" }, +] + +[[package]] +name = "csvkit" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "agate" }, + { name = "agate-dbf" }, + { name = "agate-excel" }, + { name = "agate-sql" }, + { name = "openpyxl" }, + { name = "sqlalchemy" }, + { name = "xlrd" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/ae/df3f0a1d55a93eeae5be6e1537ecebc4e2c2ca038311e60e8b2e358a1221/csvkit-1.5.0.tar.gz", hash = "sha256:967a8be8fc58edf5621225b5a6a697b0e8730b962ea68085916a91860b22211c", size = 3811034, upload-time = "2024-03-28T15:27:22.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/aa/6d15ccff35e6cbfbfca0a4bbb8b6fa266a667561a9c9571bda8c6247ad5d/csvkit-1.5.0-py2.py3-none-any.whl", hash = "sha256:3f81e6f9af1774688ee30f4bdf8abd7f927995c85cad6491cf7478c658cfe7be", size = 44158, upload-time = "2024-03-28T15:27:20.926Z" }, +] + +[[package]] +name = "cuda-bindings" +version = "13.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/21/8464d133752951c154feafb3b65c297e7d80f301183d220bec4c830f1441/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:120fcc53d57903df529c3486962c56528cba5b7d6c57c99537320ed9922c8b86", size = 6073403, upload-time = "2026-05-29T23:11:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/a8/1f/5ef51f5fbaa5d4d3201bb3d7555af028ec1aa4416275ccbf73c9e34e3d2d/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9851b0caa8bfd3bc6fa054eaf57bea7c8e9c3a62db2d2621224677f49f3c53d0", size = 6675244, upload-time = "2026-05-29T23:11:38.664Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/457ca12dad3ee9bfcc9a545cfd6b64b359ba49de40f776f6e028e678f262/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5879712accf6e14bb01aa5e67440eb84998b8d104b509cc7a6dc0b8f656a474", size = 6053539, upload-time = "2026-05-29T23:11:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/95/7a/c5e3c34a409b148f5c0f5a4ea374158f95d488862c1dffedf9aa5c639df9/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04436a9364059c84b8f9636f359eccda1cf814341f5b670c71d80d2f79dbc708", size = 6674166, upload-time = "2026-05-29T23:11:45.478Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" }, + { url = "https://files.pythonhosted.org/packages/b1/81/bff68ce829999c1e4209c761bbf903b1c06ec570416ddb25020864ad5907/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ab2f74ed65bfef4163ba07a8db16f1085e0729291db12a2423aff84ee8278b8", size = 6013639, upload-time = "2026-05-29T23:12:03.509Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e0/c8a1f0c8f9ffdea4f5fe6dbab89b326cef4d85caf489dad39e209da89416/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd4c814d311ec08c981f6dded1dbe7d4b371067ee4f6c14cccec4bde9590f80", size = 6534419, upload-time = "2026-05-29T23:12:05.633Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/83b1f563925b290f2d11a01a77a84013ba56052fe3653a5bef3ccfbb43d6/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3c772dfff49681541d59630c90f858e173ac926b9c593a2b7123f2a1043cc76", size = 5809771, upload-time = "2026-05-29T23:12:10.422Z" }, + { url = "https://files.pythonhosted.org/packages/12/20/e79b4bfe98f075195afb6343d41c498f9dbd2d161d7021d4d28bceb83581/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36febb7c1079d68a981dbbd8d5a67235b399802b82075c9388624719607e52b9", size = 6358584, upload-time = "2026-05-29T23:12:12.767Z" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.5.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c8/26f2e4aae92f11522a96043892ba39a90eac610d5242523aa863212bc1c7/cuda_pathfinder-1.5.5-py3-none-any.whl", hash = "sha256:0228c023f95d1480f143ef5c8922d27a2ab052087a942e81dc289c9eb8f91689", size = 51671, upload-time = "2026-05-27T01:21:25.413Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.0.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" }, +] + +[package.optional-dependencies] +cudart = [ + { name = "nvidia-cuda-runtime", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +cufft = [ + { name = "nvidia-cufft", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +cufile = [ + { name = "nvidia-cufile", marker = "sys_platform == 'linux'" }, +] +cupti = [ + { name = "nvidia-cuda-cupti", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +curand = [ + { name = "nvidia-curand", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +cusolver = [ + { name = "nvidia-cusolver", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +cusparse = [ + { name = "nvidia-cusparse", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +nvjitlink = [ + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +nvrtc = [ + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] +nvtx = [ + { name = "nvidia-nvtx", marker = "(python_full_version < '3.11' and sys_platform == 'win32') or sys_platform == 'linux'" }, +] + +[[package]] +name = "dbfread" +version = "2.0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/ae/a5891681f5012724d062a4ca63ec2ff539c73d5804ba594e7e0e72099d3f/dbfread-2.0.7.tar.gz", hash = "sha256:07c8a9af06ffad3f6f03e8fe91ad7d2733e31a26d2b72c4dd4cfbae07ee3b73d", size = 33212, upload-time = "2016-11-25T11:25:01.408Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/94/51349e43503e30ed7b4ecfe68a8809cdb58f722c0feb79d18b1f1e36fe74/dbfread-2.0.7-py2.py3-none-any.whl", hash = "sha256:f604def58c59694fa0160d7be5d0b8d594467278d2bb6a47d46daf7162c84cec", size = 20018, upload-time = "2016-11-25T11:27:36.001Z" }, +] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "fastparquet" +version = "2024.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cramjam" }, + { name = "fsspec" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/66/862da14f5fde4eff2cedc0f51a8dc34ba145088e5041b45b2d57ac54f922/fastparquet-2024.11.0.tar.gz", hash = "sha256:e3b1fc73fd3e1b70b0de254bae7feb890436cb67e99458b88cb9bd3cc44db419", size = 467192, upload-time = "2024-11-15T19:30:10.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/56/476f5b83476a256489879b78513bee737691a80905e246a2daa30ebcc362/fastparquet-2024.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:60ccf587410f0979105e17036df61bb60e1c2b81880dc91895cdb4ee65b71e7f", size = 910272, upload-time = "2024-11-12T20:37:19.594Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ad/4ce73440df874479f7205fe5445090f71ed4e9bd77fdb3b740253ce82703/fastparquet-2024.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5ad5fc14b0567e700bea3cd528a0bd45a6f9371370b49de8889fb3d10a6574a", size = 684095, upload-time = "2024-11-12T20:37:22.957Z" }, + { url = "https://files.pythonhosted.org/packages/20/37/c3164261d6183d529a59afef2749821b262c8581d837faa91043837c6f76/fastparquet-2024.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b74333914f454344458dab9d1432fda9b70d62e28dc7acb1512d937ef1424ee", size = 1700355, upload-time = "2024-11-12T20:37:25.792Z" }, + { url = "https://files.pythonhosted.org/packages/e6/95/cf4b175c22160ec21e4664830763bfaa80b2cf05133ef854c3f436d01c16/fastparquet-2024.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41d1610130b5cb1ce36467766191c5418cba8631e2bfe3affffaf13f9be4e7a8", size = 1714663, upload-time = "2024-11-12T20:37:28.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/31/b6c8cdb6d5df964a192e4e8c8ecd979718afb9ca7e2dc9243a4368b370e9/fastparquet-2024.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d281edd625c33628ba028d3221180283d6161bc5ceb55eae1f0ca1678f864f26", size = 1666729, upload-time = "2024-11-12T20:37:30.243Z" }, + { url = "https://files.pythonhosted.org/packages/31/e5/8a0575c46a7973849f8f2a88af16618b9c7efe98f249f03e3e3de69c2b86/fastparquet-2024.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fa56b19a29008c34cfe8831e810f770080debcbffc69aabd1df4d47572181f9c", size = 1741669, upload-time = "2024-11-12T20:37:32.067Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6a/669f8c9cf2fc6e30c9353832f870e5a2e170b458d12c5080837f742d963d/fastparquet-2024.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5914ecfa766b7763201b9f49d832a5e89c2dccad470ca4f9c9b228d9a8349756", size = 1782359, upload-time = "2024-11-12T20:37:33.806Z" }, + { url = "https://files.pythonhosted.org/packages/70/c0/1374cb43924739f4542e39d972481c1f4c7dd96808a1947450808e4e7df7/fastparquet-2024.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:561202e8f0e859ccc1aa77c4aaad1d7901b2d50fd6f624ca018bae4c3c7a62ce", size = 670700, upload-time = "2024-11-12T20:37:35.312Z" }, + { url = "https://files.pythonhosted.org/packages/7c/51/e0d6e702523ac923ede6c05e240f4a02533ccf2cea9fec7a43491078e920/fastparquet-2024.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:374cdfa745aa7d5188430528d5841cf823eb9ad16df72ad6dadd898ccccce3be", size = 909934, upload-time = "2024-11-12T20:37:37.049Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c8/5c0fb644c19a8d80b2ae4d8aa7d90c2d85d0bd4a948c5c700bea5c2802ea/fastparquet-2024.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c8401bfd86cccaf0ab7c0ade58c91ae19317ff6092e1d4ad96c2178197d8124", size = 683844, upload-time = "2024-11-12T20:37:38.456Z" }, + { url = "https://files.pythonhosted.org/packages/33/4a/1e532fd1a0d4d8af7ffc7e3a8106c0bcd13ed914a93a61e299b3832dd3d2/fastparquet-2024.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9cca4c6b5969df5561c13786f9d116300db1ec22c7941e237cfca4ce602f59b", size = 1791698, upload-time = "2024-11-12T20:37:41.101Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e8/e1ede861bea68394a755d8be1aa2e2d60a3b9f6b551bfd56aeca74987e2e/fastparquet-2024.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a9387e77ac608d8978774caaf1e19de67eaa1386806e514dcb19f741b19cfe5", size = 1804289, upload-time = "2024-11-12T20:37:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/4f/1e/957090cccaede805583ca3f3e46e2762d0f9bf8860ecbce65197e47d84c1/fastparquet-2024.11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6595d3771b3d587a31137e985f751b4d599d5c8e9af9c4858e373fdf5c3f8720", size = 1753638, upload-time = "2024-11-12T20:37:45.498Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/344787c685fd1531f07ae712a855a7c34d13deaa26c3fd4a9231bea7dbab/fastparquet-2024.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:053695c2f730b78a2d3925df7cd5c6444d6c1560076af907993361cc7accf3e2", size = 1814407, upload-time = "2024-11-12T20:37:47.25Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ec/ab9d5685f776a1965797eb68c4364c72edf57cd35beed2df49b34425d1df/fastparquet-2024.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a52eecc6270ae15f0d51347c3f762703dd667ca486f127dc0a21e7e59856ae5", size = 1874462, upload-time = "2024-11-12T20:37:49.755Z" }, + { url = "https://files.pythonhosted.org/packages/90/4f/7a4ea9a7ddf0a3409873f0787f355806f9e0b73f42f2acecacdd9a8eff0a/fastparquet-2024.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:e29ff7a367fafa57c6896fb6abc84126e2466811aefd3e4ad4070b9e18820e54", size = 671023, upload-time = "2024-11-12T20:37:51.461Z" }, + { url = "https://files.pythonhosted.org/packages/08/76/068ac7ec9b4fc783be21a75a6a90b8c0654da4d46934d969e524ce287787/fastparquet-2024.11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dbad4b014782bd38b58b8e9f514fe958cfa7a6c4e187859232d29fd5c5ddd849", size = 915968, upload-time = "2024-11-12T20:37:52.861Z" }, + { url = "https://files.pythonhosted.org/packages/c7/9e/6d3b4188ad64ed51173263c07109a5f18f9c84a44fa39ab524fca7420cda/fastparquet-2024.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:403d31109d398b6be7ce84fa3483fc277c6a23f0b321348c0a505eb098a041cb", size = 685399, upload-time = "2024-11-12T20:37:54.899Z" }, + { url = "https://files.pythonhosted.org/packages/8f/6c/809220bc9fbe83d107df2d664c3fb62fb81867be8f5218ac66c2e6b6a358/fastparquet-2024.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbbb9057a26acf0abad7adf58781ee357258b7708ee44a289e3bee97e2f55d42", size = 1758557, upload-time = "2024-11-12T20:37:56.553Z" }, + { url = "https://files.pythonhosted.org/packages/e0/2c/b3b3e6ca2e531484289024138cd4709c22512b3fe68066d7f9849da4a76c/fastparquet-2024.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e0e416e25c15daa174aad8ba991c2e9e5b0dc347e5aed5562124261400f87b", size = 1781052, upload-time = "2024-11-12T20:37:58.339Z" }, + { url = "https://files.pythonhosted.org/packages/21/fe/97ed45092d0311c013996dae633122b7a51c5d9fe8dcbc2c840dc491201e/fastparquet-2024.11.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2d7f02f57231e6c86d26e9ea71953737202f20e948790e5d4db6d6a1a150dc", size = 1715797, upload-time = "2024-11-12T20:38:00.694Z" }, + { url = "https://files.pythonhosted.org/packages/24/df/02fa6aee6c0d53d1563b5bc22097076c609c4c5baa47056b0b4bed456fcf/fastparquet-2024.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fbe4468146b633d8f09d7b196fea0547f213cb5ce5f76e9d1beb29eaa9593a93", size = 1795682, upload-time = "2024-11-12T20:38:02.38Z" }, + { url = "https://files.pythonhosted.org/packages/b0/25/f4f87557589e1923ee0e3bebbc84f08b7c56962bf90f51b116ddc54f2c9f/fastparquet-2024.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:29d5c718817bcd765fc519b17f759cad4945974421ecc1931d3bdc3e05e57fa9", size = 1857842, upload-time = "2024-11-12T20:38:04.196Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f9/98cd0c39115879be1044d59c9b76e8292776e99bb93565bf990078fd11c4/fastparquet-2024.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:74a0b3c40ab373442c0fda96b75a36e88745d8b138fcc3a6143e04682cbbb8ca", size = 673269, upload-time = "2024-12-11T21:22:48.073Z" }, + { url = "https://files.pythonhosted.org/packages/47/e3/e7db38704be5db787270d43dde895eaa1a825ab25dc245e71df70860ec12/fastparquet-2024.11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:59e5c5b51083d5b82572cdb7aed0346e3181e3ac9d2e45759da2e804bdafa7ee", size = 912523, upload-time = "2024-11-12T20:38:06.003Z" }, + { url = "https://files.pythonhosted.org/packages/d3/66/e3387c99293dae441634e7724acaa425b27de19a00ee3d546775dace54a9/fastparquet-2024.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdadf7b6bad789125b823bfc5b0a719ba5c4a2ef965f973702d3ea89cff057f6", size = 683779, upload-time = "2024-11-12T20:38:07.442Z" }, + { url = "https://files.pythonhosted.org/packages/0a/21/d112d0573d086b578bf04302a502e9a7605ea8f1244a7b8577cd945eec78/fastparquet-2024.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46b2db02fc2a1507939d35441c8ab211d53afd75d82eec9767d1c3656402859b", size = 1751113, upload-time = "2024-11-12T20:38:09.36Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a7/040507cee3a7798954e8fdbca21d2dbc532774b02b882d902b8a4a6849ef/fastparquet-2024.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3afdef2895c9f459135a00a7ed3ceafebfbce918a9e7b5d550e4fae39c1b64d", size = 1780496, upload-time = "2024-11-12T20:38:11.022Z" }, + { url = "https://files.pythonhosted.org/packages/bc/75/d0d9f7533d780ec167eede16ad88073ee71696150511126c31940e7f73aa/fastparquet-2024.11.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36b5c9bd2ffaaa26ff45d59a6cefe58503dd748e0c7fad80dd905749da0f2b9e", size = 1713608, upload-time = "2024-11-12T20:38:12.848Z" }, + { url = "https://files.pythonhosted.org/packages/30/fa/1d95bc86e45e80669c4f374b2ca26a9e5895a1011bb05d6341b4a7414693/fastparquet-2024.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6b7df5d3b61a19d76e209fe8d3133759af1c139e04ebc6d43f3cc2d8045ef338", size = 1792779, upload-time = "2024-11-12T20:38:14.5Z" }, + { url = "https://files.pythonhosted.org/packages/13/3d/c076beeb926c79593374c04662a9422a76650eef17cd1c8e10951340764a/fastparquet-2024.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b35823ac7a194134e5f82fa4a9659e42e8f9ad1f2d22a55fbb7b9e4053aabbb", size = 1851322, upload-time = "2024-11-12T20:38:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/09/5a/1d0d47e64816002824d4a876644e8c65540fa23f91b701f0daa726931545/fastparquet-2024.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:d20632964e65530374ff7cddd42cc06aa0a1388934903693d6d22592a5ba827b", size = 673266, upload-time = "2024-11-12T20:38:17.661Z" }, +] + +[[package]] +name = "filelock" +version = "3.29.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/f5/3557bf28e0f1943e4849154c821533706e6dea010f96fb6aa0b6949037d1/filelock-3.29.3.tar.gz", hash = "sha256:7fc1b3f39cf172fd8203812043c57b8a65aef9969f38b6704f628b881f761a84", size = 61956, upload-time = "2026-06-10T17:37:11.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/8f/b61d427c4f49a8bdadc93f4e7e74df8a6df6f77ee6e26bf0df53d3925363/filelock-3.29.3-py3-none-any.whl", hash = "sha256:e58333029cc9b925f39aad59b1d8f0a1ad836af4e60d7217f4a4dba87461261d", size = 42324, upload-time = "2026-06-10T17:37:10.37Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", hash = "sha256:301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4", size = 312760, upload-time = "2026-04-29T20:42:38.635Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", size = 203402, upload-time = "2026-04-29T20:42:36.842Z" }, +] + +[[package]] +name = "greenlet" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/6e/802acd792aebb2256fbbee8cacf2727faaeb6f240ac11008f09eae4414bc/greenlet-3.5.1.tar.gz", hash = "sha256:5a56aeb7d5d9cc4b3a735efb5095bd4b4f6f0e4f93e5ca876d0e2315137b7829", size = 197356, upload-time = "2026-05-20T15:05:03.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/21/117c8710abb7f146d804a124c07eb5964a60b90d02b72452885aecc18efa/greenlet-3.5.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:7eacb17a9d41538a2bc4912eba5ef13823c83cb69e4d141d0813debe7163187f", size = 283510, upload-time = "2026-05-20T13:12:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f7/6762a56fa5f6c2295c449c6524e10ce481e381c994cc44d9d03aef0700fb/greenlet-3.5.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e5cc9606aa5f4e0bde0d3bd502b44f743864c3ffa5cfa1011b1e30f5aa02366f", size = 599696, upload-time = "2026-05-20T14:00:02.906Z" }, + { url = "https://files.pythonhosted.org/packages/0f/05/85a511e68ee109aff0aa00b4b497806091dd2d82ce209e49c6e801bd5d92/greenlet-3.5.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3d35f87c7253b715d13d679e0783d845910144f282cb939fe1ba4ac8616269c", size = 612618, upload-time = "2026-05-20T14:05:39.202Z" }, + { url = "https://files.pythonhosted.org/packages/89/b8/8b83d18ae07c46c019617f35afd7b47aab7f9b4fbb12fc637d681e10bdd8/greenlet-3.5.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:540dae7b956209af4d70a3be35927b4055f617763771e5e84a5255bea934d2f5", size = 612947, upload-time = "2026-05-20T13:14:23.469Z" }, + { url = "https://files.pythonhosted.org/packages/5d/14/ad1f9fc9b82384c010212464a3702bd911f95dab2f1180bc6fbcfb1f958c/greenlet-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed8cdb691169715a9a492844a83246f090182247d1a5031dc78a403f68ba1e97", size = 1571425, upload-time = "2026-05-20T14:02:22.671Z" }, + { url = "https://files.pythonhosted.org/packages/46/1c/43b8203cf10f4292c9e3d270e9e5f5ade79115a0a0ca5ea6f1be5f8915a7/greenlet-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d59e840387076a51016777a9328b3f2c427c6f9208a6e958bad251be50a648d", size = 1638688, upload-time = "2026-05-20T13:14:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/ac/6e/0344b1e99f58f71715456e46492101fd2daa408957b8186ade0a4b515da7/greenlet-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:b9152fca4a6466e114aaec745ae61cba739903a109754a9d4e1262f01e9259b1", size = 237763, upload-time = "2026-05-20T13:11:35.659Z" }, + { url = "https://files.pythonhosted.org/packages/42/3c/ff890b466eaba2b0f5e6bdfff025f8c75f41b8ffdc3dbc3d24ad261e764a/greenlet-3.5.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:73f78f9b9f0a5c06e5c946ba1e8e36f5114923b6be109ee618c54f079c3ea14f", size = 284764, upload-time = "2026-05-20T13:09:10.204Z" }, + { url = "https://files.pythonhosted.org/packages/81/0e/5e5457be3d256918f6a4756f073548a3f0190836e2cc94aa6d0d617a940b/greenlet-3.5.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0cbed8bb44e23c5b199f888f4e4ce096b45ad9f25ff74a7ad0213875e936bb2", size = 603479, upload-time = "2026-05-20T14:00:04.757Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e1/f89a21d58d308298e6f275f13a1b472ed96c680b601a371b08be6a725989/greenlet-3.5.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a203a8bd0acb0701653d3bbb26e404854a68674139ed5cbb778830f42b09bb33", size = 615495, upload-time = "2026-05-20T14:05:40.87Z" }, + { url = "https://files.pythonhosted.org/packages/75/de/af6cef182862d2ccd6975440d21c9058a77c3f9b469abf94e322dfd2e0e3/greenlet-3.5.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a271fcd66c74615cda6a964fda3f304267a12e50a084472218a39bb0376f563", size = 614754, upload-time = "2026-05-20T13:14:24.947Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c6/50e520283a9f19388a7326b05f9e8637e566003475eacaadad04f558c68d/greenlet-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ded7b068c7c31c1a8657d4fd42d886b3e051ae29f88b80c5ff9d502257b0f071", size = 1574097, upload-time = "2026-05-20T14:02:24.003Z" }, + { url = "https://files.pythonhosted.org/packages/21/1c/13abd1f4860d987fa5e1170a01930d6e6cd40d328de487a3c9fdaff0ffd0/greenlet-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0932b81d72f552ded9d810d00021b64d89f2195a91ce115b893f943b7a4ab3c", size = 1641058, upload-time = "2026-05-20T13:14:31.83Z" }, + { url = "https://files.pythonhosted.org/packages/f5/56/5f332b7705545eac2dc01b4e9254d24a793f2656d55d5cc6b94ee59d22ae/greenlet-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:88e300d136eac057b2397aa1cfd7328b4c87c7eb66a09c7bc6a1292234db474e", size = 238089, upload-time = "2026-05-20T13:14:03.229Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a9/a3c2fa886c5b94863fb0e61b3bc14610b7aa94cf4f17f8741b11708305fc/greenlet-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:cc6ab7e555c8a112ad3a76e368e86e12a2754bcae1652a5602e133ec7b635523", size = 234989, upload-time = "2026-05-20T13:08:27.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/37/4549f149c9797c21b32c2683c33522af22522099de128b2406672526d005/greenlet-3.5.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:fa4f98af3a528f0c3fd592a26df7f376f93329c8f4d987f6bb979057af8bf5e2", size = 286220, upload-time = "2026-05-20T13:07:28.463Z" }, + { url = "https://files.pythonhosted.org/packages/38/ff/a4f436709716965eaab9f36ea7b906c8a927fbe32fb1372a2071d964f6b1/greenlet-3.5.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffea73584b216150eab159b6d12348fb253e68757974de1e2c40d8a318ac89ed", size = 601585, upload-time = "2026-05-20T14:00:06.141Z" }, + { url = "https://files.pythonhosted.org/packages/65/ad/54bc3fcee3ad368a61b19b67d88117f7a8c29727bf71fffdeda81fbd946e/greenlet-3.5.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1072b4f9edcc1e192d9283a66a3e68d6b84c561de33a83d7858beb9ba1effe10", size = 614215, upload-time = "2026-05-20T14:05:42.675Z" }, + { url = "https://files.pythonhosted.org/packages/40/69/b91cda0647df839483201545913514c2827ebea5e5ccdf931842763bc127/greenlet-3.5.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:add5217d68b31130f0beca584d7fef4878327d2e31642b66618a14eef312b63b", size = 611358, upload-time = "2026-05-20T13:14:26.37Z" }, + { url = "https://files.pythonhosted.org/packages/59/90/3cf77e080350cd02fa307bb2abf05df48f4482c240275bbd2c203ba8bb1c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a5ea42a752d47a145eae922b605cd1634665ac3d5ec1e72402d5048e8d60d207", size = 1570475, upload-time = "2026-05-20T14:02:25.29Z" }, + { url = "https://files.pythonhosted.org/packages/65/2c/18cece62045e74598c3c393f70dce4a63f56222015ba29a5d4eeb04f764c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5551170cf4f5ff5623e9af81323751979fee2c731e2287b61f73cd27257b823", size = 1635625, upload-time = "2026-05-20T13:14:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/30/f5/310d104ddf41eb5a70f4c268d22508dfb0c3c8e86fec152be34d0d2ed819/greenlet-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c8bb982ad117d29478ef8f5533e97df21f1e2befd17a299257b0c96d1371c0b", size = 238791, upload-time = "2026-05-20T13:10:39.018Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/ceca11f504cd23a8047a3dea31919adc48df9b626dd0c13f0d858734fdfd/greenlet-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:80eb4b04dadc4e67df3fae179a32c4706a3f495bc7f22fc8a81115d5f5512188", size = 235580, upload-time = "2026-05-20T13:08:45.056Z" }, + { url = "https://files.pythonhosted.org/packages/27/69/7f7e5372d998b81001899b1c0823c957aa413ba0f2662e65821611cc31e4/greenlet-3.5.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:51518ff74664078fc51bffcc6fc529b0df5ae58da192691cee765d45ce944a2b", size = 285060, upload-time = "2026-05-20T13:08:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/b1/bf/387f9b6b865fd2ae0d0be09e0004827295a01b71be76ed350dd1e28a91a4/greenlet-3.5.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ffdb3c0bb002c99cd8f298957e046c3dbf6006b5b7cdf11a4e19194624a0a0a", size = 604370, upload-time = "2026-05-20T14:00:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/32/f5/169ce3d4e4c67291bd18f8cbe0299c9f3e45102c7f1fb3c14780c93e4532/greenlet-3.5.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7715a5a2c3378ba602c3a440558261e13a820bb53a82693aacd7b7f6d964e283", size = 616987, upload-time = "2026-05-20T14:05:44.237Z" }, + { url = "https://files.pythonhosted.org/packages/ee/e5/7f2e41d5273be07e77560d61ea4e56485b4d6c316d2a84518c62d1364061/greenlet-3.5.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc71ff466927a201b08305acac451ebe1aedfcea002f62f1f2f2ac2ac1e6a135", size = 613911, upload-time = "2026-05-20T13:14:27.539Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a4/fbdc67579b73615a1f91615e814303cc71e06128f7baaba87be79b8fb90c/greenlet-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cd443683db272ebaaca03af98c0b063ab30db70ea8a31a1559f35e3f7b744ccd", size = 1570689, upload-time = "2026-05-20T14:02:27.225Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b4/77abbe35078be39718a46cd49caf16bceb35662f97a34101dca28aa98e47/greenlet-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:089fff7a6ce8d9316d1f65ebc00273a56be258c1725b32b94de90a3a979557e1", size = 1635602, upload-time = "2026-05-20T13:14:36.344Z" }, + { url = "https://files.pythonhosted.org/packages/37/f7/129f27ca700845b8ee8ca88ce7f43435a1239c2eddb7677fc938822762cf/greenlet-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:110a1ca7b49b014b097f6078272c3f4ed31af45b254de5228b79adba879f6af9", size = 238683, upload-time = "2026-05-20T13:11:50.57Z" }, + { url = "https://files.pythonhosted.org/packages/6d/5c/a485a36e87df8d8fd0632ee01511244f5156a20ed3746cc6599340326395/greenlet-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f16ba1efc0715b680a18b8123d90dad887c6112ae3555b4b5c32c149540c6b4e", size = 235499, upload-time = "2026-05-20T13:12:42.028Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cb/c62454606daf5640369c94d8a9dd540599b1bfc090e2d2180cb77f4038d2/greenlet-3.5.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d8ab31c9de8651a2facdd5c5bb0011f2380dd1a7af78ce2adf4b56095294fc07", size = 285579, upload-time = "2026-05-20T13:08:56.396Z" }, + { url = "https://files.pythonhosted.org/packages/ec/71/c4270398c2eba968a6071af1dfbdcaeee6ec1c24bc8b435b8cc452700da6/greenlet-3.5.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e300185139abc337ade480c327183adf42a875ac7181bfe66d7d4efea31fbea", size = 651106, upload-time = "2026-05-20T14:00:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ab/71e34b78a44ec271fb5f550c17bc46d301ddc5953890d935f270b0dcdb5a/greenlet-3.5.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7ffdb990dcaa0234cf9845aead5df2e3c3a8b6507d409274dd87e0d5ab05ffc2", size = 663478, upload-time = "2026-05-20T14:05:45.88Z" }, + { url = "https://files.pythonhosted.org/packages/77/96/4efd6fa5c62c85426a0c19077a586258ebc3a2a146ff2493e4312a697a22/greenlet-3.5.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f82b3597e9d83b63408affed0b48fd0f54935edac4302237b9a837be0dae33c", size = 660800, upload-time = "2026-05-20T13:14:29.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e0/6c71401a25cac7000261304e866a2f2cc04dc74810d40e2f118aa4799495/greenlet-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c0141e37414c10164e702b8fb1473304221ad98f71600850c6ef7ff4880feba0", size = 1617518, upload-time = "2026-05-20T14:02:28.662Z" }, + { url = "https://files.pythonhosted.org/packages/41/26/c5c06643e8c0af9e7bf18e16cb51d0ab7625155f0392e1c9015d66d556cd/greenlet-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:50ae25a67bea74ea41fb14b960bc532df73eb713417b2d61892dced82fe8d3bc", size = 1681593, upload-time = "2026-05-20T13:14:39.417Z" }, + { url = "https://files.pythonhosted.org/packages/8a/bd/e11a108317485075e68af9d23039619b86b28130c3b50d227d42edece64b/greenlet-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:8a17c42330e261299766b75ac1ea32caa437a9453c8f65d16a13140db378ecd3", size = 239800, upload-time = "2026-05-20T13:09:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/47/f8/8e8e8417b7bf28639a5a56356ef934d0375e1d0c70a57e04d7701e870ffe/greenlet-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:7b5f5fae05b8ac6d176a61b60c394a8cbdc2b5b91b81793066e68745cf165e54", size = 236862, upload-time = "2026-05-20T13:09:10.498Z" }, + { url = "https://files.pythonhosted.org/packages/90/12/41bf27fde4d3605d3773ae57751eda182b8be2f5398011c041173b1d9534/greenlet-3.5.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:ea8da1e900d758d078810d4255d8c6aa572181896a31ec79d779eb79c3adc9ad", size = 293637, upload-time = "2026-05-20T13:12:35.529Z" }, + { url = "https://files.pythonhosted.org/packages/44/44/ba14b23e9757707050c2f397d305bbcae62e5d7cad122f8b6baec5ae4a1f/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a19570c52a21420dcbc94e661994bc325c0b5b11304540fed514586da5dc8f2e", size = 650840, upload-time = "2026-05-20T14:00:11.079Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/5ddc2b686a6844f91abecef43411842426da2e1573f60b49ecf2547f4ae1/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3d955c89b75eeca4723d7cc14135f393cd47c32e2a6cb4a8e4c6e760a26b0986", size = 656416, upload-time = "2026-05-20T14:05:47.118Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f0/d17510297c35a2992712f0bf84de3779749999f7d3d63aa1f09db7c62dbe/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2daaaebd1a5aa88c49045b6baf9310b3263796bd88db713edf37cf53e7bb4e", size = 654397, upload-time = "2026-05-20T13:14:30.696Z" }, + { url = "https://files.pythonhosted.org/packages/37/eb/147387705bb89092645b012586e7273cb5ed3c90ef7eaf3a69173eaf0209/greenlet-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bfbd69cc349e43bf3a8ae1c85548ff0718efc887615c2db16c3833d7b0b072d", size = 1614469, upload-time = "2026-05-20T14:02:30.192Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4e/37ee0da7732b7aa9896f17e15579a9df34b9fcb9dd494f0adfa749af6623/greenlet-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4378720dd888136c27215a0214d32a4d37c3852765d45bc37aad0623423cfd78", size = 1675115, upload-time = "2026-05-20T13:14:40.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/f3/97dfcf4a6eb5077f8a672234216fb5923eb89f2cab7081cb10b2cf75b605/greenlet-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:45718441607f9325d948db98cbc691276059316d0358c188c246da4e1d4d23d2", size = 245246, upload-time = "2026-05-20T13:12:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/5d/73/d7f72e34b582f694f4a9b248162db7b09cc458a259ba8f0c0bfa1a34ea7d/greenlet-3.5.1-cp315-cp315-macosx_11_0_universal2.whl", hash = "sha256:2baee5ca02031757ffe8cc3d69f0cc0aec7065ce362622da74f32d3bcab1c541", size = 285575, upload-time = "2026-05-20T13:12:07.043Z" }, + { url = "https://files.pythonhosted.org/packages/df/59/fa9c6e87dc8ad27a95dabe2f29f372b733d05a8a67470f6c901ed9975655/greenlet-3.5.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b1ec3274918a81d3ea778b9e75b56b72b33f300edb6cf7f3a7fe1dae56683de", size = 656428, upload-time = "2026-05-20T14:00:12.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f9/e753408871eaa61dfe35e619cfc67512b036fde99893685d50eea9e07146/greenlet-3.5.1-cp315-cp315-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:111e2390ffffc47d5840b01711dd7fac07d4c09283d0283e7f3264b14e284c64", size = 667064, upload-time = "2026-05-20T14:05:48.662Z" }, + { url = "https://files.pythonhosted.org/packages/96/27/5565b5b40389f1c7753003a07e21892fda8660926787036d5bc0308b8113/greenlet-3.5.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e630136e905fe5ff43e86945ae41220b6d1470956a39220e708110ac48d01ea5", size = 665697, upload-time = "2026-05-20T13:14:32.943Z" }, + { url = "https://files.pythonhosted.org/packages/cf/82/e7de4178c0c2d1c9a5a3be3cc0b33e46a85b3ee4a77c071bf7ad8600e079/greenlet-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:975eac34b44a7077ca4d421348455b94f0f518246a7f14bc6d2fdcfe5b584368", size = 1621256, upload-time = "2026-05-20T14:02:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/00/10/f2dddcf7dacac17dfc68691809589adad06135eb28930429cf58a6467a2f/greenlet-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9ab3c3a0b2ae6198e67c898dad5215a49f9ae0d0081b3c3ec59f333e39eeca26", size = 1685956, upload-time = "2026-05-20T13:14:42.55Z" }, + { url = "https://files.pythonhosted.org/packages/22/17/4a232b32133230ada52f70e9d7f5b65b0caef8772f01849bd8d149e7e4ca/greenlet-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:cbfc69be86e10dcfef5b1e6269d1d6926552aa89ee39e1de3353360c1b6989ab", size = 239802, upload-time = "2026-05-20T13:13:15.481Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ae/4e623a7e6d4d2a5f4cb8e4c82de4169fc637942caae68d6e676b8a128ac5/greenlet-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:92fd6d44ac5e5a887c8a5dc4a8ba0ba908527c31c12f78c6bc7dcfe8aab279f6", size = 236853, upload-time = "2026-05-20T13:15:37.301Z" }, + { url = "https://files.pythonhosted.org/packages/7a/57/816d9cff29119da3505b3d6a5e14a8af89006ac36f47f891ff293ee05af1/greenlet-3.5.1-cp315-cp315t-macosx_11_0_universal2.whl", hash = "sha256:a6fdf2433a5441ef9a95464f7c3e674775da1c8c1177fff311cee1acad4626ed", size = 293877, upload-time = "2026-05-20T13:10:19.078Z" }, + { url = "https://files.pythonhosted.org/packages/23/a1/59b0a7c7d140ff1a75626680b9a9899b79a9176cab298b394968fb023295/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7546556f0d649f99f6a361098a55f761181bb2ea12ff150bb16d26092ad88244", size = 655333, upload-time = "2026-05-20T14:00:14.758Z" }, + { url = "https://files.pythonhosted.org/packages/72/1b/5efe127597625042218939d01855109f352779050768b670b52edcc16a6c/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5ee3ea898009fa898f85f9982255d35278c477bebe185beca249cab42d4526c", size = 659443, upload-time = "2026-05-20T14:05:50.159Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6d/c404246ea4d22d097a7426d0efb5b781bd7eb67715f09e79001bd552ab18/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5c81f74d204d3edd136ebfd50dce53acbb776995d721a0fe801626cfc93b8cd", size = 658356, upload-time = "2026-05-20T13:14:35.091Z" }, + { url = "https://files.pythonhosted.org/packages/51/02/f8ee37fb6d2219329f350af241c27fcf12df57e723d11f6fc6d3bacdadaa/greenlet-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:2c18ef16bf6d4dd410e4dd52996888ea1497be26892fe5bbc73580aba4287b8e", size = 1619216, upload-time = "2026-05-20T14:02:33.403Z" }, + { url = "https://files.pythonhosted.org/packages/93/c5/3dc9475ace2c7a3680da12372cddd7f1ac874eb410a1ac48d3e9dab83782/greenlet-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:17d86354f0ae6b61bf9be5148d0dd34e06c3cb7c602c671f79f29ac3b150e659", size = 1678427, upload-time = "2026-05-20T13:14:43.71Z" }, + { url = "https://files.pythonhosted.org/packages/df/4e/750c15c317a41ffb36f0bf40b933e3d744a7dede61889f74443ea69690cf/greenlet-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:e7516cf6ae6b8a582c2770a0caed47b8a48373ed732c33d69a72913ae6ac923e", size = 245225, upload-time = "2026-05-20T13:13:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/4f/fd/d3baea2eeb7b617efd47e87ca06e2ec2c6118d303aa9e918e0ce16eadc10/greenlet-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:5028648bf2253ec4745add746129d3904121fa7fe871a76bed23c5720573ce0a", size = 239590, upload-time = "2026-05-20T13:13:37.382Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "leather" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/09/849cf129d7eae1e42f873f2dbd60323267c738390b686a7384fb3fb289ad/leather-0.4.1.tar.gz", hash = "sha256:67119c2aee93be821f077193bd8534e296c05b38bd174d9c5a80c4aa31d1a4d3", size = 44072, upload-time = "2025-12-15T19:01:42.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/d4/c4dcb02ed11f8884e169b3350fc40aa4c08edf8bed77a8f0f267542e6452/leather-0.4.1-py3-none-any.whl", hash = "sha256:ec61cba1ca3ccb96ed90e38b116fc58757d97d352171006b3288c47ce3fbd183", size = 30340, upload-time = "2025-12-15T19:01:40.823Z" }, +] + +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, +] + +[[package]] +name = "mako" +version = "1.3.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219, upload-time = "2026-04-28T19:01:08.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521, upload-time = "2026-04-28T19:01:10.393Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/3a/c5b855752a70267ff729c349e650263adb3c206c29d28cc8ea7ace30a1d5/ml_dtypes-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b95e97e470fe60ed493fd9ae3911d8da4ebac16bd21f87ffa2b7c588bf22ea2c", size = 679735, upload-time = "2025-11-17T22:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/41/79/7433f30ee04bd4faa303844048f55e1eb939131c8e5195a00a96a0939b64/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a", size = 5051883, upload-time = "2025-11-17T22:31:33.658Z" }, + { url = "https://files.pythonhosted.org/packages/10/b1/8938e8830b0ee2e167fc75a094dea766a1152bde46752cd9bfc57ee78a82/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270", size = 5030369, upload-time = "2025-11-17T22:31:35.595Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a3/51886727bd16e2f47587997b802dd56398692ce8c6c03c2e5bb32ecafe26/ml_dtypes-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:4ff7f3e7ca2972e7de850e7b8fcbb355304271e2933dd90814c1cb847414d6e2", size = 210738, upload-time = "2025-11-17T22:31:37.43Z" }, + { url = "https://files.pythonhosted.org/packages/c6/5e/712092cfe7e5eb667b8ad9ca7c54442f21ed7ca8979745f1000e24cf8737/ml_dtypes-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6c7ecb74c4bd71db68a6bea1edf8da8c34f3d9fe218f038814fd1d310ac76c90", size = 679734, upload-time = "2025-11-17T22:31:39.223Z" }, + { url = "https://files.pythonhosted.org/packages/4f/cf/912146dfd4b5c0eea956836c01dcd2fce6c9c844b2691f5152aca196ce4f/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc11d7e8c44a65115d05e2ab9989d1e045125d7be8e05a071a48bc76eb6d6040", size = 5056165, upload-time = "2025-11-17T22:31:41.071Z" }, + { url = "https://files.pythonhosted.org/packages/a9/80/19189ea605017473660e43762dc853d2797984b3c7bf30ce656099add30c/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b9a53598f21e453ea2fbda8aa783c20faff8e1eeb0d7ab899309a0053f1483", size = 5034975, upload-time = "2025-11-17T22:31:42.758Z" }, + { url = "https://files.pythonhosted.org/packages/b4/24/70bd59276883fdd91600ca20040b41efd4902a923283c4d6edcb1de128d2/ml_dtypes-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:7c23c54a00ae43edf48d44066a7ec31e05fdc2eee0be2b8b50dd1903a1db94bb", size = 210742, upload-time = "2025-11-17T22:31:44.068Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c9/64230ef14e40aa3f1cb254ef623bf812735e6bec7772848d19131111ac0d/ml_dtypes-0.5.4-cp311-cp311-win_arm64.whl", hash = "sha256:557a31a390b7e9439056644cb80ed0735a6e3e3bb09d67fd5687e4b04238d1de", size = 160709, upload-time = "2025-11-17T22:31:46.557Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a1/4008f14bbc616cfb1ac5b39ea485f9c63031c4634ab3f4cf72e7541f816a/ml_dtypes-0.5.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c760d85a2f82e2bed75867079188c9d18dae2ee77c25a54d60e9cc79be1bc48", size = 676888, upload-time = "2025-11-17T22:31:56.907Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b7/dff378afc2b0d5a7d6cd9d3209b60474d9819d1189d347521e1688a60a53/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce756d3a10d0c4067172804c9cc276ba9cc0ff47af9078ad439b075d1abdc29b", size = 5036993, upload-time = "2025-11-17T22:31:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/eb/33/40cd74219417e78b97c47802037cf2d87b91973e18bb968a7da48a96ea44/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:533ce891ba774eabf607172254f2e7260ba5f57bdd64030c9a4fcfbd99815d0d", size = 5010956, upload-time = "2025-11-17T22:31:59.931Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8b/200088c6859d8221454825959df35b5244fa9bdf263fd0249ac5fb75e281/ml_dtypes-0.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:f21c9219ef48ca5ee78402d5cc831bd58ea27ce89beda894428bc67a52da5328", size = 212224, upload-time = "2025-11-17T22:32:01.349Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/dfc3775cb36367816e678f69a7843f6f03bd4e2bcd79941e01ea960a068e/ml_dtypes-0.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:35f29491a3e478407f7047b8a4834e4640a77d2737e0b294d049746507af5175", size = 160798, upload-time = "2025-11-17T22:32:02.864Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/e9ddb35fd1dd43b1106c20ced3f53c2e8e7fc7598c15638e9f80677f81d4/ml_dtypes-0.5.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:304ad47faa395415b9ccbcc06a0350800bc50eda70f0e45326796e27c62f18b6", size = 702083, upload-time = "2025-11-17T22:32:04.08Z" }, + { url = "https://files.pythonhosted.org/packages/74/f5/667060b0aed1aa63166b22897fdf16dca9eb704e6b4bbf86848d5a181aa7/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a0df4223b514d799b8a1629c65ddc351b3efa833ccf7f8ea0cf654a61d1e35d", size = 5354111, upload-time = "2025-11-17T22:32:05.546Z" }, + { url = "https://files.pythonhosted.org/packages/40/49/0f8c498a28c0efa5f5c95a9e374c83ec1385ca41d0e85e7cf40e5d519a21/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531eff30e4d368cb6255bc2328d070e35836aa4f282a0fb5f3a0cd7260257298", size = 5366453, upload-time = "2025-11-17T22:32:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/8c/27/12607423d0a9c6bbbcc780ad19f1f6baa2b68b18ce4bddcdc122c4c68dc9/ml_dtypes-0.5.4-cp313-cp313t-win_amd64.whl", hash = "sha256:cb73dccfc991691c444acc8c0012bee8f2470da826a92e3a20bb333b1a7894e6", size = 225612, upload-time = "2025-11-17T22:32:08.615Z" }, + { url = "https://files.pythonhosted.org/packages/e5/80/5a5929e92c72936d5b19872c5fb8fc09327c1da67b3b68c6a13139e77e20/ml_dtypes-0.5.4-cp313-cp313t-win_arm64.whl", hash = "sha256:3bbbe120b915090d9dd1375e4684dd17a20a2491ef25d640a908281da85e73f1", size = 164145, upload-time = "2025-11-17T22:32:09.782Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22", size = 673781, upload-time = "2025-11-17T22:32:11.364Z" }, + { url = "https://files.pythonhosted.org/packages/04/f9/067b84365c7e83bda15bba2b06c6ca250ce27b20630b1128c435fb7a09aa/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:805cef3a38f4eafae3a5bf9ebdcdb741d0bcfd9e1bd90eb54abd24f928cd2465", size = 5036145, upload-time = "2025-11-17T22:32:12.783Z" }, + { url = "https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f", size = 5010230, upload-time = "2025-11-17T22:32:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl", hash = "sha256:8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56", size = 221032, upload-time = "2025-11-17T22:32:15.763Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/9c912fe6ea747bb10fe2f8f54d027eb265db05dfb0c6335e3e063e74e6e8/ml_dtypes-0.5.4-cp314-cp314-win_arm64.whl", hash = "sha256:5a0f68ca8fd8d16583dfa7793973feb86f2fbb56ce3966daf9c9f748f52a2049", size = 163353, upload-time = "2025-11-17T22:32:16.932Z" }, + { url = "https://files.pythonhosted.org/packages/cd/02/48aa7d84cc30ab4ee37624a2fd98c56c02326785750cd212bc0826c2f15b/ml_dtypes-0.5.4-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:bfc534409c5d4b0bf945af29e5d0ab075eae9eecbb549ff8a29280db822f34f9", size = 702085, upload-time = "2025-11-17T22:32:18.175Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e7/85cb99fe80a7a5513253ec7faa88a65306be071163485e9a626fce1b6e84/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2314892cdc3fcf05e373d76d72aaa15fda9fb98625effa73c1d646f331fcecb7", size = 5355358, upload-time = "2025-11-17T22:32:19.7Z" }, + { url = "https://files.pythonhosted.org/packages/79/2b/a826ba18d2179a56e144aef69e57fb2ab7c464ef0b2111940ee8a3a223a2/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d2ffd05a2575b1519dc928c0b93c06339eb67173ff53acb00724502cda231cf", size = 5366332, upload-time = "2025-11-17T22:32:21.193Z" }, + { url = "https://files.pythonhosted.org/packages/84/44/f4d18446eacb20ea11e82f133ea8f86e2bf2891785b67d9da8d0ab0ef525/ml_dtypes-0.5.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4381fe2f2452a2d7589689693d3162e876b3ddb0a832cde7a414f8e1adf7eab1", size = 236612, upload-time = "2025-11-17T22:32:22.579Z" }, + { url = "https://files.pythonhosted.org/packages/ad/3f/3d42e9a78fe5edf792a83c074b13b9b770092a4fbf3462872f4303135f09/ml_dtypes-0.5.4-cp314-cp314t-win_arm64.whl", hash = "sha256:11942cbf2cf92157db91e5022633c0d9474d4dfd813a909383bd23ce828a4b7d", size = 168825, upload-time = "2025-11-17T22:32:23.766Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "narwhals" +version = "2.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/3c/c4ef2164a71c1a63d7f1ae411c4082c5fa872405106db60a4b7114989ad7/narwhals-2.22.1.tar.gz", hash = "sha256:d62920805a0a43b7ff8b54b0c0d3142d796f8a9301836ada37e573d6a33cbcd9", size = 647493, upload-time = "2026-06-05T12:34:34.051Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl", hash = "sha256:60567d774edf77db53906f89d9fbd164e66e56d66d388e1e6990f17ac33cfb53", size = 454815, upload-time = "2026-06-05T12:34:32.289Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and platform_machine != 's390x'", + "python_full_version < '3.11' and platform_machine == 's390x'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "networkx" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and platform_machine != 's390x'", + "python_full_version < '3.11' and platform_machine == 's390x'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "nvidia-cublas" +version = "13.1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" }, + { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc" +version = "13.0.88" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, + { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime" +version = "13.0.96" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu13" +version = "9.20.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" }, +] + +[[package]] +name = "nvidia-cufft" +version = "12.0.0.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, +] + +[[package]] +name = "nvidia-cufile" +version = "1.15.1.6" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" }, +] + +[[package]] +name = "nvidia-curand" +version = "10.4.0.35" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, +] + +[[package]] +name = "nvidia-cusolver" +version = "12.0.4.66" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "nvidia-cusparse", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, +] + +[[package]] +name = "nvidia-cusparse" +version = "12.6.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu13" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, + { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, +] + +[[package]] +name = "nvidia-nccl-cu13" +version = "2.29.7" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/0d/daf50d44177ee0cbc7ff0a0c91eb5ff676c82be42f9a970bc7597f440c3a/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:674a12383e3c38a1bcccae7d4f3633b37852230b6047883cb2f4c2d1b36d9bf5", size = 206014712, upload-time = "2026-03-03T05:34:20.843Z" }, + { url = "https://files.pythonhosted.org/packages/67/f4/58e4e91b6919367c7aafb8e36fce9aad1a3047e536bf7e2fd560927d3a4c/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:edd81538446786ec3b73972543e53bb43bcaf0bfc8ef76cb679fcc390ffe136d", size = 205976000, upload-time = "2026-03-03T05:36:24.472Z" }, +] + +[[package]] +name = "nvidia-nvjitlink" +version = "13.0.88" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", size = 40713933, upload-time = "2025-09-04T08:35:43.553Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", size = 38768748, upload-time = "2025-09-04T08:35:20.008Z" }, +] + +[[package]] +name = "nvidia-nvshmem-cu13" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, +] + +[[package]] +name = "nvidia-nvtx" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, + { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, +] + +[[package]] +name = "olefile" +version = "0.47" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/1b/077b508e3e500e1629d366249c3ccb32f95e50258b231705c09e3c7a4366/olefile-0.47.zip", hash = "sha256:599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c", size = 112240, upload-time = "2023-12-01T16:22:53.025Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/d3/b64c356a907242d719fc668b71befd73324e47ab46c8ebbbede252c154b2/olefile-0.47-py2.py3-none-any.whl", hash = "sha256:543c7da2a7adadf21214938bb79c83ea12b473a4b6ee4ad4bf854e7715e13d1f", size = 114565, upload-time = "2023-12-01T16:22:51.518Z" }, +] + +[[package]] +name = "onnx" +version = "1.21.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/93/942d2a0f6a70538eea042ce0445c8aefd46559ad153469986f29a743c01c/onnx-1.21.0.tar.gz", hash = "sha256:4d8b67d0aaec5864c87633188b91cc520877477ec0254eda122bef8be43cd764", size = 12074608, upload-time = "2026-03-27T21:33:36.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/28/a14b1845bf9302c3a787221e8f37cde4e7f930e10d95a8e22dd910aeb41d/onnx-1.21.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e0c21cc5c7a41d1a509828e2b14fe9c30e807c6df611ec0fd64a47b8d4b16abd", size = 17966899, upload-time = "2026-03-27T21:32:15.53Z" }, + { url = "https://files.pythonhosted.org/packages/41/7b/788881bf022a4cfb7b0843782f88415ea51c805cee4a909dcf2e49bb8129/onnx-1.21.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1931bfcc222a4c9da6475f2ffffb84b97ab3876041ec639171c11ce802bee6a", size = 17534297, upload-time = "2026-03-27T21:32:18.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/51/eb64d4f2ec6caa98909aab5fbcfa24be9c059081e804bbb0012cc549ef89/onnx-1.21.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9b56ad04039fac6b028c07e54afa1ec7f75dd340f65311f2c292e41ed7aa4d9", size = 17616697, upload-time = "2026-03-27T21:32:21Z" }, + { url = "https://files.pythonhosted.org/packages/d2/4e/6b1f7800dae3407dc850e7e59d591ed8c83e9b3401e4cd57a1f612e400c6/onnx-1.21.0-cp310-cp310-win32.whl", hash = "sha256:3abd09872523c7e0362d767e4e63bd7c6bac52a5e2c3edbf061061fe540e2027", size = 16288893, upload-time = "2026-03-27T21:32:23.864Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a8/89273e581d3943e20314af19b1596ab4d763f9c2eb07d4eaf4fb0593219b/onnx-1.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:f2c7c234c568402e10db74e33d787e4144e394ae2bcbbf11000fbfe2e017ad68", size = 16443416, upload-time = "2026-03-27T21:32:26.655Z" }, + { url = "https://files.pythonhosted.org/packages/45/48/32e383aa6bc40b72a9fd419937aaa647078190c9bfccdc97b316d2dee687/onnx-1.21.0-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:2aca19949260875c14866fc77ea0bc37e4e809b24976108762843d328c92d3ce", size = 17968053, upload-time = "2026-03-27T21:32:29.558Z" }, + { url = "https://files.pythonhosted.org/packages/e2/26/5726e8df7d36e96bb3c679912d1a86af42f393d77aa17d6b98a97d4289ce/onnx-1.21.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82aa6ab51144df07c58c4850cb78d4f1ae969d8c0bf657b28041796d49ba6974", size = 17534821, upload-time = "2026-03-27T21:32:32.351Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2b/021dcd2dd50c3c71b7959d7368526da384a295c162fb4863f36057973f78/onnx-1.21.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c3185a232089335581fabb98fba4e86d3e8246b8140f2e406082438100ebda", size = 17616664, upload-time = "2026-03-27T21:32:34.921Z" }, + { url = "https://files.pythonhosted.org/packages/12/00/afa32a46fa122a7ed42df1cfe8796922156a3725ba8fc581c4779c96e2fc/onnx-1.21.0-cp311-cp311-win32.whl", hash = "sha256:f53b3c15a3b539c16b99655c43c365622046d68c49b680c48eba4da2a4fb6f27", size = 16289035, upload-time = "2026-03-27T21:32:37.783Z" }, + { url = "https://files.pythonhosted.org/packages/73/8d/483cc980a24d4c0131d0af06d0ff6a37fb08ae90a7848ece8cef645194f1/onnx-1.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:5f78c411743db317a76e5d009f84f7e3d5380411a1567a868e82461a1e5c775d", size = 16443748, upload-time = "2026-03-27T21:32:40.337Z" }, + { url = "https://files.pythonhosted.org/packages/38/78/9d06fd5aaaed1ec9cb8a3b70fbbf00c1bdc18db610771e96379f0ed58112/onnx-1.21.0-cp311-cp311-win_arm64.whl", hash = "sha256:ab6a488dabbb172eebc9f3b3e7ac68763f32b0c571626d4a5004608f866cc83d", size = 16406123, upload-time = "2026-03-27T21:32:45.159Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ae/cb644ec84c25e63575d9d8790fdcc5d1a11d67d3f62f872edb35fa38d158/onnx-1.21.0-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:fc2635400fe39ff37ebc4e75342cc54450eadadf39c540ff132c319bf4960095", size = 17965930, upload-time = "2026-03-27T21:32:48.089Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b6/eeb5903586645ef8a49b4b7892580438741acc3df91d7a5bd0f3a59ea9cb/onnx-1.21.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9003d5206c01fa2ff4b46311566865d8e493e1a6998d4009ec6de39843f1b59b", size = 17531344, upload-time = "2026-03-27T21:32:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/a7/00/4823f06357892d1e60d6f34e7299d2ba4ed2108c487cc394f7ce85a3ff14/onnx-1.21.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9261bd580fb8548c9c37b3c6750387eb8f21ea43c63880d37b2c622e1684285", size = 17613697, upload-time = "2026-03-27T21:32:54.222Z" }, + { url = "https://files.pythonhosted.org/packages/23/1d/391f3c567ae068c8ac4f1d1316bae97c9eb45e702f05975fe0e17ad441f0/onnx-1.21.0-cp312-abi3-win32.whl", hash = "sha256:9ea4e824964082811938a9250451d89c4ec474fe42dd36c038bfa5df31993d1e", size = 16287200, upload-time = "2026-03-27T21:32:57.277Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a6/5eefbe5b40ea96de95a766bd2e0e751f35bdea2d4b951991ec9afaa69531/onnx-1.21.0-cp312-abi3-win_amd64.whl", hash = "sha256:458d91948ad9a7729a347550553b49ab6939f9af2cddf334e2116e45467dc61f", size = 16441045, upload-time = "2026-03-27T21:33:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/63/c4/0ed8dc037a39113d2a4d66e0005e07751c299c46b993f1ad5c2c35664c20/onnx-1.21.0-cp312-abi3-win_arm64.whl", hash = "sha256:ca14bc4842fccc3187eb538f07eabeb25a779b39388b006db4356c07403a7bbb", size = 16403134, upload-time = "2026-03-27T21:33:03.987Z" }, + { url = "https://files.pythonhosted.org/packages/f8/89/0e1a9beb536401e2f45ac88735e123f2735e12fc7b56ff6c11727e097526/onnx-1.21.0-cp313-cp313t-macosx_12_0_universal2.whl", hash = "sha256:257d1d1deb6a652913698f1e3f33ef1ca0aa69174892fe38946d4572d89dd94f", size = 17975430, upload-time = "2026-03-27T21:33:07.005Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/e6dc71a7b3b317265591b20a5f71d0ff5c0d26c24e52283139dc90c66038/onnx-1.21.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cd7cb8f6459311bdb557cbf6c0ccc6d8ace11c304d1bba0a30b4a4688e245f8", size = 17537435, upload-time = "2026-03-27T21:33:09.765Z" }, + { url = "https://files.pythonhosted.org/packages/49/2e/27affcac63eaf2ef183a44fd1a1354b11da64a6c72fe6f3fdcf5571bcee5/onnx-1.21.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b58a4cfec8d9311b73dc083e4c1fa362069267881144c05139b3eba5dc3a840", size = 17617687, upload-time = "2026-03-27T21:33:12.619Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5c/ac8ed15e941593a3672ce424280b764979026317811f2e8508432bfc3429/onnx-1.21.0-cp313-cp313t-win_amd64.whl", hash = "sha256:1a9baf882562c4cebf79589bebb7cd71a20e30b51158cac3e3bbaf27da6163bd", size = 16449402, upload-time = "2026-03-27T21:33:15.555Z" }, + { url = "https://files.pythonhosted.org/packages/0e/aa/d2231e0dcaad838217afc64c306c8152a080134d2034e247cc973d577674/onnx-1.21.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bba12181566acf49b35875838eba49536a327b2944664b17125577d230c637ad", size = 16408273, upload-time = "2026-03-27T21:33:18.599Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0a/8905b14694def6ad23edf1011fdd581500384062f8c4c567e114be7aa272/onnx-1.21.0-cp314-cp314t-macosx_12_0_universal2.whl", hash = "sha256:7ee9d8fd6a4874a5fa8b44bbcabea104ce752b20469b88bc50c7dcf9030779ad", size = 17975331, upload-time = "2026-03-27T21:33:21.69Z" }, + { url = "https://files.pythonhosted.org/packages/61/28/f4e401e5199d1b9c8b76c7e7ae1169e050515258e877b58fa8bb49d3bdcc/onnx-1.21.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5489f25fe461e7f32128218251a466cabbeeaf1eaa791c79daebf1a80d5a2cc9", size = 17537430, upload-time = "2026-03-27T21:33:24.547Z" }, + { url = "https://files.pythonhosted.org/packages/cf/cf/5d13320eb3660d5af360ea3b43aa9c63a70c92a9b4d1ea0d34501a32fcb8/onnx-1.21.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:db17fc0fec46180b6acbd1d5d8650a04e5527c02b09381da0b5b888d02a204c8", size = 17617662, upload-time = "2026-03-27T21:33:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/4d/50/3eaa1878338247be021e6423696813d61e77e534dccbd15a703a144e703d/onnx-1.21.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19d9971a3e52a12968ae6c70fd0f86c349536de0b0c33922ecdbe52d1972fe60", size = 16463688, upload-time = "2026-03-27T21:33:30.229Z" }, + { url = "https://files.pythonhosted.org/packages/a7/48/38d46b43bbb525e0b6a4c2c4204cc6795d67e45687a2f7403e06d8e7053d/onnx-1.21.0-cp314-cp314t-win_arm64.whl", hash = "sha256:efba467efb316baf2a9452d892c2f982b9b758c778d23e38c7f44fa211b30bb9", size = 16423387, upload-time = "2026-03-27T21:33:33.446Z" }, +] + +[[package]] +name = "onnx-ir" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "onnx" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/e6/672fefb2f108d077f58181a7babf4c0f8d1182a30353ffc9c79c63afc5ee/onnx_ir-0.2.1.tar.gz", hash = "sha256:8b8b10a93f43e65962104de6070c43c5dacb0e3cdfefc7c8059dd83c9db64f35", size = 144279, upload-time = "2026-04-20T20:21:47.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/aa/f7a53321c60b9ad9ee184b6018292ed6b5389947592a2c8c09c736bb7f9e/onnx_ir-0.2.1-py3-none-any.whl", hash = "sha256:c7285da889312f91882de2092e298a9eeeefbfc1d1951c49d983992967eb09a7", size = 166792, upload-time = "2026-04-20T20:21:46.357Z" }, +] + +[[package]] +name = "onnxruntime" +version = "1.24.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and platform_machine != 's390x'", + "python_full_version < '3.11' and platform_machine == 's390x'", +] +dependencies = [ + { name = "flatbuffers", marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "packaging", marker = "python_full_version < '3.11'" }, + { name = "protobuf", marker = "python_full_version < '3.11'" }, + { name = "sympy", marker = "python_full_version < '3.11'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/41/3253db975a90c3ce1d475e2a230773a21cd7998537f0657947df6fb79861/onnxruntime-1.24.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3e6456801c66b095c5cd68e690ca25db970ea5202bd0c5b84a2c3ef7731c5a3c", size = 17332766, upload-time = "2026-03-05T17:18:59.714Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c5/3af6b325f1492d691b23844d88ed26844c1164620860c5efe95c0e22782d/onnxruntime-1.24.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b2ebc54c6d8281dccff78d4b06e47d4cf07535937584ab759448390a70f4978", size = 15130330, upload-time = "2026-03-05T16:34:53.831Z" }, + { url = "https://files.pythonhosted.org/packages/03/4b/f96b46c1866a293ed23ca2cf5e5a63d413ad3a951da60dd877e3c56cbbca/onnxruntime-1.24.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb56575d7794bf0781156955610c9e651c9504c64d42ec880784b6106244882d", size = 17213247, upload-time = "2026-03-05T17:17:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/36/13/27cf4d8df2578747584e8758aeb0b673b60274048510257f1f084b15e80e/onnxruntime-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:c958222ef9eff54018332beecd32d5d94a3ab079d8821937b333811bf4da0d39", size = 12595530, upload-time = "2026-03-05T17:18:49.356Z" }, + { url = "https://files.pythonhosted.org/packages/19/8c/6d9f31e6bae72a8079be12ed8ba36c4126a571fad38ded0a1b96f60f6896/onnxruntime-1.24.3-cp311-cp311-win_arm64.whl", hash = "sha256:a8f761857ebaf58a85b9e42422d03207f1d39e6bb8fecfdbf613bac5b9710723", size = 12261715, upload-time = "2026-03-05T17:18:39.699Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7f/dfdc4e52600fde4c02d59bfe98c4b057931c1114b701e175aee311a9bc11/onnxruntime-1.24.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:0d244227dc5e00a9ae15a7ac1eba4c4460d7876dfecafe73fb00db9f1d914d91", size = 17342578, upload-time = "2026-03-05T17:19:02.403Z" }, + { url = "https://files.pythonhosted.org/packages/1c/dc/1f5489f7b21817d4ad352bf7a92a252bd5b438bcbaa7ad20ea50814edc79/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a9847b870b6cb462652b547bc98c49e0efb67553410a082fde1918a38707452", size = 15150105, upload-time = "2026-03-05T16:34:56.897Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/fd253da53594ab8efbefdc85b3638620ab1a6aab6eb7028a513c853559ce/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b354afce3333f2859c7e8706d84b6c552beac39233bcd3141ce7ab77b4cabb5d", size = 17237101, upload-time = "2026-03-05T17:18:02.561Z" }, + { url = "https://files.pythonhosted.org/packages/71/5f/eaabc5699eeed6a9188c5c055ac1948ae50138697a0428d562ac970d7db5/onnxruntime-1.24.3-cp312-cp312-win_amd64.whl", hash = "sha256:44ea708c34965439170d811267c51281d3897ecfc4aa0087fa25d4a4c3eb2e4a", size = 12597638, upload-time = "2026-03-05T17:18:52.141Z" }, + { url = "https://files.pythonhosted.org/packages/cc/5c/d8066c320b90610dbeb489a483b132c3b3879b2f93f949fb5d30cfa9b119/onnxruntime-1.24.3-cp312-cp312-win_arm64.whl", hash = "sha256:48d1092b44ca2ba6f9543892e7c422c15a568481403c10440945685faf27a8d8", size = 12270943, upload-time = "2026-03-05T17:18:42.006Z" }, + { url = "https://files.pythonhosted.org/packages/51/8d/487ece554119e2991242d4de55de7019ac6e47ee8dfafa69fcf41d37f8ed/onnxruntime-1.24.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:34a0ea5ff191d8420d9c1332355644148b1bf1a0d10c411af890a63a9f662aa7", size = 17342706, upload-time = "2026-03-05T16:35:10.813Z" }, + { url = "https://files.pythonhosted.org/packages/dd/25/8b444f463c1ac6106b889f6235c84f01eec001eaf689c3eff8c69cf48fae/onnxruntime-1.24.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fd2ec7bb0fabe42f55e8337cfc9b1969d0d14622711aac73d69b4bd5abb5ed7", size = 15149956, upload-time = "2026-03-05T16:34:59.264Z" }, + { url = "https://files.pythonhosted.org/packages/34/fc/c9182a3e1ab46940dd4f30e61071f59eee8804c1f641f37ce6e173633fb6/onnxruntime-1.24.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df8e70e732fe26346faaeec9147fa38bef35d232d2495d27e93dd221a2d473a9", size = 17237370, upload-time = "2026-03-05T17:18:05.258Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/3b549e1f4538514118bff98a1bcd6481dd9a17067f8c9af77151621c9a5c/onnxruntime-1.24.3-cp313-cp313-win_amd64.whl", hash = "sha256:2d3706719be6ad41d38a2250998b1d87758a20f6ea4546962e21dc79f1f1fd2b", size = 12597939, upload-time = "2026-03-05T17:18:54.772Z" }, + { url = "https://files.pythonhosted.org/packages/80/41/9696a5c4631a0caa75cc8bc4efd30938fd483694aa614898d087c3ee6d29/onnxruntime-1.24.3-cp313-cp313-win_arm64.whl", hash = "sha256:b082f3ba9519f0a1a1e754556bc7e635c7526ef81b98b3f78da4455d25f0437b", size = 12270705, upload-time = "2026-03-05T17:18:44.774Z" }, + { url = "https://files.pythonhosted.org/packages/b7/65/a26c5e59e3b210852ee04248cf8843c81fe7d40d94cf95343b66efe7eec9/onnxruntime-1.24.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72f956634bc2e4bd2e8b006bef111849bd42c42dea37bd0a4c728404fdaf4d34", size = 15161796, upload-time = "2026-03-05T16:35:02.871Z" }, + { url = "https://files.pythonhosted.org/packages/f3/25/2035b4aa2ccb5be6acf139397731ec507c5f09e199ab39d3262b22ffa1ac/onnxruntime-1.24.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d1f25eed4ab9959db70a626ed50ee24cf497e60774f59f1207ac8556399c4d", size = 17240936, upload-time = "2026-03-05T17:18:09.534Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a4/b3240ea84b92a3efb83d49cc16c04a17ade1ab47a6a95c4866d15bf0ac35/onnxruntime-1.24.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a6b4bce87d96f78f0a9bf5cefab3303ae95d558c5bfea53d0bf7f9ea207880a8", size = 17344149, upload-time = "2026-03-05T16:35:13.382Z" }, + { url = "https://files.pythonhosted.org/packages/bb/4a/4b56757e51a56265e8c56764d9c36d7b435045e05e3b8a38bedfc5aedba3/onnxruntime-1.24.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d48f36c87b25ab3b2b4c88826c96cf1399a5631e3c2c03cc27d6a1e5d6b18eb4", size = 15151571, upload-time = "2026-03-05T16:35:05.679Z" }, + { url = "https://files.pythonhosted.org/packages/cf/14/c6fb84980cec8f682a523fcac7c2bdd6b311e7f342c61ce48d3a9cb87fc6/onnxruntime-1.24.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e104d33a409bf6e3f30f0e8198ec2aaf8d445b8395490a80f6e6ad56da98e400", size = 17238951, upload-time = "2026-03-05T17:18:12.394Z" }, + { url = "https://files.pythonhosted.org/packages/57/14/447e1400165aca8caf35dabd46540eb943c92f3065927bb4d9bcbc91e221/onnxruntime-1.24.3-cp314-cp314-win_amd64.whl", hash = "sha256:e785d73fbd17421c2513b0bb09eb25d88fa22c8c10c3f5d6060589efa5537c5b", size = 12903820, upload-time = "2026-03-05T17:18:57.123Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ec/6b2fa5702e4bbba7339ca5787a9d056fc564a16079f8833cc6ba4798da1c/onnxruntime-1.24.3-cp314-cp314-win_arm64.whl", hash = "sha256:951e897a275f897a05ffbcaa615d98777882decaeb80c9216c68cdc62f849f53", size = 12594089, upload-time = "2026-03-05T17:18:47.169Z" }, + { url = "https://files.pythonhosted.org/packages/12/dc/cd06cba3ddad92ceb17b914a8e8d49836c79e38936e26bde6e368b62c1fe/onnxruntime-1.24.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d4e70ce578aa214c74c7a7a9226bc8e229814db4a5b2d097333b81279ecde36", size = 15162789, upload-time = "2026-03-05T16:35:08.282Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d6/413e98ab666c6fb9e8be7d1c6eb3bd403b0bea1b8d42db066dab98c7df07/onnxruntime-1.24.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02aaf6ddfa784523b6873b4176a79d508e599efe12ab0ea1a3a6e7314408b7aa", size = 17240738, upload-time = "2026-03-05T17:18:15.203Z" }, +] + +[[package]] +name = "onnxruntime" +version = "1.26.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "flatbuffers", marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging", marker = "python_full_version >= '3.11'" }, + { name = "protobuf", marker = "python_full_version >= '3.11'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/81/29a9eb470994a75eb7b3ccf32be314d7c66675a00ac7b50294816cc2db27/onnxruntime-1.26.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ee1109ef4ef27cad90e823399e61e03b3c6c7bfe0fb820b4baf3678c15be8b3c", size = 18005108, upload-time = "2026-05-08T19:08:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/66/c7/73efa6c8a4000c38fcc14947d84f234a17e5d66f203b37b7f1ad4a7b46eb/onnxruntime-1.26.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35c7c7b0ac2e02001d28fab6c9fc24e9abc5e6faa35e6e19c63cecf1406ba89f", size = 16043752, upload-time = "2026-05-08T19:07:10.707Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3f/8de630f595daf6ce884d4dd95afd2a60e70ec6572e52bfee3aa2229befab/onnxruntime-1.26.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11a8df4dcfe9ad5ff0bd71a7571dbed019fabc7594676c89fe8b86ea029c246f", size = 18176043, upload-time = "2026-05-08T19:07:33.735Z" }, + { url = "https://files.pythonhosted.org/packages/9c/21/9f041de20787cd85498bd48e0ec4d098bf2a6c486e25b24b8dae1bf492b2/onnxruntime-1.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:e6456718125fd777c673f3b78d4a9ab58d6adea641e9afae85ee6444f0e0e9a9", size = 13023165, upload-time = "2026-05-08T19:08:00.633Z" }, + { url = "https://files.pythonhosted.org/packages/0e/82/3b9fe0ead2557cc3adf74c74c141bd1c7c4c6a9548c610af37df199f4512/onnxruntime-1.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:cd920e45b730e4a87833e2910d8ca375aaca9da6ccc09e24bce463b3356d637f", size = 12789514, upload-time = "2026-05-08T19:07:49.433Z" }, + { url = "https://files.pythonhosted.org/packages/81/b1/d111b1df656761f980d9e298a60039a9cb66036b1d039e777537743d0ac3/onnxruntime-1.26.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05b028781b322ad74b57ce5b50aa5280bb1fe96ceec334628ade681e0b24c1ac", size = 18016624, upload-time = "2026-05-12T00:41:01.735Z" }, + { url = "https://files.pythonhosted.org/packages/f6/a0/3f9d896a0385a36bd04345d6d0b802821a5782adde562e7e135f6bb71c73/onnxruntime-1.26.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91f2bb870a4b9224eba0a6728c1fa7a9e552b8e59e1083c51fbbc3d013f2b5c0", size = 16052692, upload-time = "2026-05-08T19:07:13.829Z" }, + { url = "https://files.pythonhosted.org/packages/7c/43/2a4e04f8dbeffad19bbcced4bcd4289bf478921518437404d6b92bdf213b/onnxruntime-1.26.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b6dd70599005bd1bf29779f04a91978b92b5e719c11a20068a8f8e535f725b6", size = 18185439, upload-time = "2026-05-08T19:07:36.299Z" }, + { url = "https://files.pythonhosted.org/packages/44/fc/026d0a7162b9c2153dac292baea9e027c42304dc1d9dc6f8ff5b4cfbaedd/onnxruntime-1.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:a26374dc7fbcaae593601086b242120e13f2310558df0991da6dd8b8fac00414", size = 13026427, upload-time = "2026-05-08T19:08:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/3e/27/1dcf88e45e4c69db5f7b106f2dacc3801ba98994e082ca03e1dfdf7bfe57/onnxruntime-1.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:54a8053410fd31fd66469bd754fcfe8a4df9f7eb44756b4b5479bf50c842d948", size = 12796647, upload-time = "2026-05-08T19:07:52.108Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a2/c801242685e0ce48a4ca51dfafbb588765e0446397e123be53ba5598f3f5/onnxruntime-1.26.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccce19c5f771b8268902f77d9fed9e88f9499465d6780808faa6611a789d33f0", size = 18016563, upload-time = "2026-05-08T19:07:28.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/64/0492c0b1db04e29b2630c87cfa36f9d6872b1ca8614b90c5cad58fac7d76/onnxruntime-1.26.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdbed8cf3b672b66acb032f33a253bc27f42bce6ece48ae3fab4fa483a5e96e0", size = 16052634, upload-time = "2026-05-08T19:07:16.885Z" }, + { url = "https://files.pythonhosted.org/packages/3d/26/4d09ddc755a84fc8d5e192991626b0e0680e8f6c5d58f4f1d05c42bc48cf/onnxruntime-1.26.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c07af6fc6d5557835f2b6ee7a96d8b3235d0c57a8e230efdedaee106a8a3cbc6", size = 18185632, upload-time = "2026-05-08T19:07:38.756Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/3e52249aa08fa301e217ecba07b5246a8338fa2b401e109326e3fc5be0f9/onnxruntime-1.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:61bec80655efa460591c2bc655392d57d2650ce85533a6b9b3b7a790d7ea7916", size = 13026751, upload-time = "2026-05-08T19:08:06.2Z" }, + { url = "https://files.pythonhosted.org/packages/06/b3/c1c8782b14af6797c303de132d6eef26a9fb80dfacd3750ce57911d11c6b/onnxruntime-1.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:a6677545ff451e3539a02746d2f207d8c5baa4a0a818886bb9d6a6eb9511ee89", size = 12796807, upload-time = "2026-05-08T19:07:54.879Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f5/47b0676408abec652c14b84d7173e389837832d850c24f87184277313e8d/onnxruntime-1.26.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e016edc15d3c19f36807e1c6b10be5b27807688c32720f91b5ae480a95215d0", size = 16057265, upload-time = "2026-05-08T19:07:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/3b/45/33ab6deeef010ca844c877dd618cebc079590bbe52d2a3678e7223b1b908/onnxruntime-1.26.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5fc48a91a046a6a5c9b147f83fb41d65d24d24923373b222cdd248f0f4f4aac", size = 18197590, upload-time = "2026-05-08T19:07:41.422Z" }, + { url = "https://files.pythonhosted.org/packages/40/89/17546c1c20f6bfc3ae41c22152378a26edfea918af3129e2139dcd7c99f3/onnxruntime-1.26.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:33a791f31432a3af1a96db5e54818b37aba5e5eefc2e6af5794c10a9118a9993", size = 18019724, upload-time = "2026-05-08T19:07:30.723Z" }, + { url = "https://files.pythonhosted.org/packages/bb/24/89457a35f6af29538a76647f2c18c3a28277e6c19234c847e7b4b7c19860/onnxruntime-1.26.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e90c00732c4553618103149d93f688e8c3063017938f8983e21a71d9f3b6d22e", size = 16054821, upload-time = "2026-05-08T19:07:22.348Z" }, + { url = "https://files.pythonhosted.org/packages/12/f9/15b2e1815cf570d238e0135529f80d2dce64e8e8818a1489cae83823c5c6/onnxruntime-1.26.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01498e80ba8988428d08c2d51b1338f89e3de2a93e6ffe555f79c68f26a5c06b", size = 18185815, upload-time = "2026-05-08T19:07:44.179Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/2e11055faf015e4b07f45b513fa49b391baf2e19d92d77d73ebee13c1004/onnxruntime-1.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:7ead61450d8405167c87dd3a31d8da1d576b490a57dab1aa8b82a7da6825f5aa", size = 13349887, upload-time = "2026-05-08T19:08:08.671Z" }, + { url = "https://files.pythonhosted.org/packages/19/e4/0f9d1a5718b1781c610c1e354765a3820597081754277a6a9a2b50705702/onnxruntime-1.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:31d71a53490e46910877d0902b5ad99c69a5955e5c7ea6c82863519410e1ba7c", size = 13140121, upload-time = "2026-05-08T19:07:57.804Z" }, + { url = "https://files.pythonhosted.org/packages/1c/42/3b8e635f067d06d9f45bede470b8d539d101a4166c272213158dfd08b6ce/onnxruntime-1.26.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b6d258fb78fdfcf049795bcfaa74dcb90ae7baa277afd21e6fd28b83f2c496", size = 16057240, upload-time = "2026-05-08T19:07:25.163Z" }, + { url = "https://files.pythonhosted.org/packages/93/99/f2be40a31b908d96b861ae0ce98582fa376c18a7f816b9d5eb4cd6aa0a4c/onnxruntime-1.26.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4eefd386a45202aefb7a5132b94f32df9d506c9edcc7faf2fc60d65183f4b183", size = 18197382, upload-time = "2026-05-08T19:07:46.965Z" }, +] + +[[package]] +name = "onnxscript" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "onnx" }, + { name = "onnx-ir" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/99/fd948eba63ba65b52265a4cd09a14f96bb9f5b730fcef58876c4358bf406/onnxscript-0.7.0.tar.gz", hash = "sha256:c95ed7b339b02cface56ee27689565c46612e1fc542c562298dddfdad5268dc5", size = 612032, upload-time = "2026-04-20T17:09:19.775Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/ce/2ed92575cc3be4ea1db5f38f16f20765f9b20b69b14d6c1d9972658a8ee9/onnxscript-0.7.0-py3-none-any.whl", hash = "sha256:5b356907d4501e9919f8599c91d8da967406a37b1fac2b40caa55a49acf242ea", size = 714842, upload-time = "2026-04-20T17:09:22.089Z" }, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, +] + +[[package]] +name = "optuna" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alembic" }, + { name = "colorlog" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "sqlalchemy" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/aa/05f5e3f662cc96a4c478fc3446b8ed6359825a2b504ecb614a9ac84e4a4d/optuna-4.9.0.tar.gz", hash = "sha256:b322e5cbdf1655fb84c37646c4a7a1f391de1b47806bbe222e015825d0a82b87", size = 485834, upload-time = "2026-06-01T06:23:30.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/f3/e5fcd5d9b15771ed6dc10e3a7eeddc672e418f4f4c4653d216cc1d857e2d/optuna-4.9.0-py3-none-any.whl", hash = "sha256:f52f3be6148654850c92a5860d398fd88ec6b2c84ab68d9c3d07dcff02e7afee", size = 425553, upload-time = "2026-06-01T06:23:28.804Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and platform_machine != 's390x'", + "python_full_version < '3.11' and platform_machine == 's390x'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, + { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, +] + +[[package]] +name = "parsedatetime" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/20/cb587f6672dbe585d101f590c3871d16e7aec5a576a1694997a3777312ac/parsedatetime-2.6.tar.gz", hash = "sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455", size = 60114, upload-time = "2020-05-31T23:50:57.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/a4/3dd804926a42537bf69fb3ebb9fd72a50ba84f807d95df5ae016606c976c/parsedatetime-2.6-py3-none-any.whl", hash = "sha256:cb96edd7016872f58479e35879294258c71437195760746faffedb692aef000b", size = 42548, upload-time = "2020-05-31T23:50:56.315Z" }, +] + +[[package]] +name = "plotly" +version = "6.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/fd/d72c292d78aadb93d1a9bcd76bf3c678271040c7cf10abe5788b33040a39/plotly-6.8.0.tar.gz", hash = "sha256:e088e7ddc68d4f70e3d66659224727a45296d71d2b8284181862d3d8f1f0d88f", size = 6915161, upload-time = "2026-06-03T18:33:40.226Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/14/abe5ce876ab5b66ee3c691bf537fcd43d037aea55d447aacf74630a8f31e/plotly-6.8.0-py3-none-any.whl", hash = "sha256:13c5c4a0f70b74cab1913eda0de49b826df5931708eb6f9c3010040614700ec8", size = 9902055, upload-time = "2026-06-03T18:33:34.26Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "polars" +version = "1.41.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/f9/aeda46259b0669247a160315d2d51269de9504b9dd2f70acadbcb22f46b7/polars-1.41.2.tar.gz", hash = "sha256:256d6731162371b77f3f29a55eacb8c0fc740ddb1a293a01d2ef5b5393c5c708", size = 737996, upload-time = "2026-05-29T17:39:15.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/22/28f62d24f7db56ac4343588f9362d49b7b4177e55ac47a466fe696b0099b/polars-1.41.2-py3-none-any.whl", hash = "sha256:23ce9a2910b6e3e8d4258770bf44aa17170958df7af6e85feedf4458a04d8d29", size = 833445, upload-time = "2026-05-29T17:37:05.576Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.41.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/56/54e3ea0e9b64f327179049e4742241cc6b1d3e8fa414b05a057dd26df367/polars_runtime_32-1.41.2.tar.gz", hash = "sha256:7af09ec1ab053da2c9669e8d15f809a4083a29be05db57111688b8051062af56", size = 2989474, upload-time = "2026-05-29T17:39:17.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/9b/fe72a3811c0357cdb06c67bdc7695fa1623ad47948fc523195f5ac31037f/polars_runtime_32-1.41.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:95a08346dac337357cdb825c8076df7d36da54c4caa59a5cb41d0a30691c5edd", size = 52265283, upload-time = "2026-05-29T17:37:09.407Z" }, + { url = "https://files.pythonhosted.org/packages/0a/93/fab9da803fd80d9e83ef88c20932f637a10bc611b20415fc322eec84bc44/polars_runtime_32-1.41.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:dedfaeec2c7f995298da7319dd9431d662e5dd1d0ec51b1459df4a0234ceff52", size = 46571222, upload-time = "2026-05-29T17:37:13.698Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/8843f34a8ac57acd058a39b87b03b580dd352a490e9dae0415e02033bdd4/polars_runtime_32-1.41.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eea22c5cc34e27f8a60950458ad81e6a9ea75e89363ca1367e14e7e7f781fc", size = 50409372, upload-time = "2026-05-29T17:37:17.875Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c6/92b352fe88cf51bd0a19fb99e1c0cbe46aa26c14dcf7995b89869cd932ae/polars_runtime_32-1.41.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2630540dfdfb0f36f9b04a07c7c2e3f50bf2ad384113263c1c812007ee9141e0", size = 56405484, upload-time = "2026-05-29T17:37:22.684Z" }, + { url = "https://files.pythonhosted.org/packages/74/c4/bae3174c3b02f6b441d2e58594387abcd509f67a098f682a83b195f08966/polars_runtime_32-1.41.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:20e969e08f9b137e233c04cc04de73d9795f89eb77d34854e40a025965a43763", size = 50603512, upload-time = "2026-05-29T17:37:27.422Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ed/f2d26ae02d92c2689056838ed59e2a626326ad23c2831d58637d25f6c82a/polars_runtime_32-1.41.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e7016a3deb641b64a31447abbbee0f34bd020a6a9ae34ee6b743837def15e2a4", size = 54328561, upload-time = "2026-05-29T17:37:32.587Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c4/9c3831cc885dc7769e59abf8f583821a5fb4403fd0e4eba0ccc6d47a3d4b/polars_runtime_32-1.41.2-cp310-abi3-win_amd64.whl", hash = "sha256:1e5e5377c315e0dcafdfb2a31adc546abbaeb3f9cb1864e6536523d2af473265", size = 51978643, upload-time = "2026-05-29T17:37:37.443Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c6/79e9f3f270270d7ed5575d92b7bfef49f01abd9275447161275b23b553a8/polars_runtime_32-1.41.2-cp310-abi3-win_arm64.whl", hash = "sha256:843d96f69d18eca53429c1198e58891db7f18111f83b9c419bb45ad9d73eaed5", size = 46006901, upload-time = "2026-05-29T17:37:42.522Z" }, +] + +[[package]] +name = "protobuf" +version = "7.35.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/01/9ef0afd7999eb9badb3a768b4aedd78c86d4c65cfaf1958ab276199e76b4/protobuf-7.35.1.tar.gz", hash = "sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a", size = 458717, upload-time = "2026-06-11T21:55:40.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/03/8aeeb7458d22546bf64b5250ca1daeb5ff757d900e8e4a7476c6f0db843e/protobuf-7.35.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6", size = 433226, upload-time = "2026-06-11T21:55:31.719Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/dfb89eb0e652a1ff073c39a59fb5e3a83cfe9b57a2c83fa6d78270101767/protobuf-7.35.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799", size = 328847, upload-time = "2026-06-11T21:55:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/0f/58/dc12f2cd484951524af6e3382c785869b9b3fb5e52ee95ae23add53ee8f9/protobuf-7.35.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4", size = 344030, upload-time = "2026-06-11T21:55:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/be/5b3cfe508bfab6761414ff944e3366eb13be4fd71efcd69450f89ba39f43/protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4", size = 327130, upload-time = "2026-06-11T21:55:35.921Z" }, + { url = "https://files.pythonhosted.org/packages/d8/bc/6d6c7ba8709c85f8f2c390b2b118d6fb08a783676a572271851bf45a7d22/protobuf-7.35.1-cp310-abi3-win32.whl", hash = "sha256:353652e4efd0bca5b5fc2656abf8307ef351f0cf938c9eba09f0e09c20a25c30", size = 428945, upload-time = "2026-06-11T21:55:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/0a/19/8d0cb6f20a1ef7b18f1c8986ad5783f22f84cce39c6ce9a6e645ea55192e/protobuf-7.35.1-cp310-abi3-win_amd64.whl", hash = "sha256:230a75ddfc2de4806e56696ce9640c1cdfdb6543b7cfce98d42a4c0a0e7bdb87", size = 439996, upload-time = "2026-06-11T21:55:38.123Z" }, + { url = "https://files.pythonhosted.org/packages/19/c7/5f7c636ec43e0c545e28d1f1db71990108306f7bdcb89f069ba97e428e7f/protobuf-7.35.1-py3-none-any.whl", hash = "sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9", size = 171659, upload-time = "2026-06-11T21:55:39.155Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "pyarrow" +version = "24.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/bf/a34fee1d624152124fa8355c42f34195ad5fe5233ce5bb87946432047d52/pyarrow-24.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7c2b98645d576a0b9616892ead22b64a83a5f043c5e2ca15ebcefcb5b70c80cb", size = 35076681, upload-time = "2026-04-21T08:51:46.845Z" }, + { url = "https://files.pythonhosted.org/packages/1d/41/64180033d7027afce12dc96d0fe1f504c6fa112190582b458acea2399530/pyarrow-24.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:644a246325b8c69c595ad1dd4b463eba4b0cdb731370e4a86137d433208d6147", size = 36684260, upload-time = "2026-04-21T08:51:53.642Z" }, + { url = "https://files.pythonhosted.org/packages/57/02/9b9320e673dd8a99411fac78690f3df92f6dd6f59754c750110bca66d64e/pyarrow-24.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3a577bd840ca83f646f0a625dbc571dba7044c43c2d1503afc378b570954345c", size = 45698566, upload-time = "2026-04-21T10:46:02.133Z" }, + { url = "https://files.pythonhosted.org/packages/67/33/f75e91b9a64c3f33c787e263c93b871ad91b8a4a68c1d5cebddd9840e835/pyarrow-24.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:e3268e43984d0b1a185c89b4cfff282a7ead12fc93f56cfd7088bdbcbe727041", size = 48835562, upload-time = "2026-04-21T10:46:10.278Z" }, + { url = "https://files.pythonhosted.org/packages/a5/63/097510448e47e4091faa41c43ba92f97cecaab8f4535b56a3d149578f634/pyarrow-24.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2392d954fcb920f42d230284b677605e4e2fbb11f2821e823e642abd67fbb491", size = 49394997, upload-time = "2026-04-21T10:46:18.08Z" }, + { url = "https://files.pythonhosted.org/packages/60/6b/c047d6222ab279024a062742d1807e2fbaf27bba88a98637299ff47b9236/pyarrow-24.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bec9373df11544592b0ba7ec2af0e35059e5f0e7647c6183a854dedd193298f1", size = 51911424, upload-time = "2026-04-21T10:46:25.347Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ba/464cc70761c2a525d97ebd84e21c31ebd47f3ef4bdcee117009f51c46f24/pyarrow-24.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:c42ab9439498270139cc63e18847a02afe5c8b3ed9c931266533cfe378bd3591", size = 27251730, upload-time = "2026-04-21T10:46:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/62/c9/a47ab7ece0d86cbe6678418a0fbd1ac4bb493b9184a3891dfa0e7f287ae0/pyarrow-24.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b0e131f880cda8d04e076cee175a46fc0e8bc8b65c99c6c09dff6669335fde74", size = 35068898, upload-time = "2026-04-21T10:46:36.599Z" }, + { url = "https://files.pythonhosted.org/packages/d1/bc/8db86617a9a58008acf8913d6fed68ea2a46acb6de928db28d724c891a68/pyarrow-24.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:1b2fe7f9a5566401a0ef2571f197eb92358925c1f0c8dba305d6e43ea0871bb3", size = 36679915, upload-time = "2026-04-21T10:46:42.602Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8e/fb178720400ef69db251eb4a9c3ccf4af269bc1feb5055529b8fc87170d1/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0b3537c00fb8d384f15ac1e79b6eb6db04a16514c8c1d22e59a9b95c8ba42868", size = 45697931, upload-time = "2026-04-21T10:46:48.403Z" }, + { url = "https://files.pythonhosted.org/packages/f3/27/99c42abe8e21b44f4917f62631f3aa31404882a2c41d8a4cd5c110e13d52/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:14e31a3c9e35f1ab6356c6378f6f72830e6d2d5f1791df3774a7b097d18a6a1e", size = 48837449, upload-time = "2026-04-21T10:46:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/36/b6/333749e2666e9032891125bf9c691146e92901bece62030ac1430e2e7c88/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d9a514e73bc42711e6a35aaccf3587c520024fe0a25d830a1a8a27c15f4f57", size = 49395949, upload-time = "2026-04-21T10:47:01.869Z" }, + { url = "https://files.pythonhosted.org/packages/17/25/c5201706a2dd374e8ba6ee3fd7a8c89fb7ffc16eed5217a91fd2bd7f7626/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b196eb3f931862af3fa84c2a253514d859c08e0d8fe020e07be12e75a5a9780c", size = 51912986, upload-time = "2026-04-21T10:47:09.872Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d2/4d1bbba65320b21a49678d6fbdc6ff7c649251359fdcfc03568c4136231d/pyarrow-24.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:35405aecb474e683fb36af650618fd5340ee5471fc65a21b36076a18bbc6c981", size = 27255371, upload-time = "2026-04-21T10:47:15.943Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a9/9686d9f07837f91f775e8932659192e02c74f9d8920524b480b85212cc68/pyarrow-24.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6233c9ed9ab9d1db47de57d9753256d9dcffbf42db341576099f0fd9f6bf4810", size = 34981559, upload-time = "2026-04-21T10:47:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/0ddf0e9b6ead3474ab087ae598c76b031fc45532bf6a63f3a553440fb258/pyarrow-24.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f7616236ec1bc2b15bfdec22a71ab38851c86f8f05ff64f379e1278cf20c634a", size = 36663654, upload-time = "2026-04-21T10:47:28.315Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/926382efe8ce27ba729071d3566ade6dfb86bdf112f366000196b2f5780a/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:1617043b99bd33e5318ae18eb2919af09c71322ef1ca46566cdafc6e6712fb66", size = 45679394, upload-time = "2026-04-21T10:47:34.821Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/829f7d9dfd37c207206081d6dad474d81dde29952401f07f2ba507814818/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6165461f55ef6314f026de6638d661188e3455d3ec49834556a0ebbdbace18bb", size = 48863122, upload-time = "2026-04-21T10:47:42.056Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e8/f88ce625fe8babaae64e8db2d417c7653adb3019b08aae85c5ed787dc816/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b13dedfe76a0ad2d1d859b0811b53827a4e9d93a0bcb05cf59333ab4980cc7e", size = 49376032, upload-time = "2026-04-21T10:47:48.967Z" }, + { url = "https://files.pythonhosted.org/packages/36/7a/82c363caa145fff88fb475da50d3bf52bb024f61917be5424c3392eaf878/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:25ea65d868eb04015cd18e6df2fbe98f07e5bda2abefabcb88fce39a947716f6", size = 51929490, upload-time = "2026-04-21T10:47:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826", size = 27355660, upload-time = "2026-04-21T10:48:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a1abf004482026ddc17f4503db227787fa3cfe41ec5091ff20e4fea55e57/pyarrow-24.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:02b001b3ed4723caa44f6cd1af2d5c86aa2cf9971dacc2ffa55b21237713dfba", size = 34976759, upload-time = "2026-04-21T10:48:07.258Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/34f0a36d28a2dd32225301b79daad44e243dc1a2bb77d43b60749be255c4/pyarrow-24.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:04920d6a71aabd08a0417709efce97d45ea8e6fb733d9ca9ecffb13c67839f68", size = 36658471, upload-time = "2026-04-21T10:48:13.347Z" }, + { url = "https://files.pythonhosted.org/packages/1f/78/543b94712ae8bb1a6023bcc1acf1a740fbff8286747c289cd9468fced2a5/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a964266397740257f16f7bb2e4f08a0c81454004beab8ff59dd531b73610e9f2", size = 45675981, upload-time = "2026-04-21T10:48:20.201Z" }, + { url = "https://files.pythonhosted.org/packages/84/9f/8fb7c222b100d314137fa40ec050de56cd8c6d957d1cfff685ce72f15b17/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f066b179d68c413374294bc1735f68475457c933258df594443bb9d88ddc2a0", size = 48859172, upload-time = "2026-04-21T10:48:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/1ea72538e6c8b3b475ed78d1049a2c518e655761ea50fe1171fc855fcab7/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1183baeb14c5f587b1ec52831e665718ce632caab84b7cd6b85fd44f96114495", size = 49385733, upload-time = "2026-04-21T10:48:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/c3d8b06a1ba35f2260f8e1f771abbee7d5e345c0937aab90675706b1690a/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:806f24b4085453c197a5078218d1ee08783ebbba271badd153d1ae22a3ee804f", size = 51934335, upload-time = "2026-04-21T10:48:42.099Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/89e07a1e7329d2cde3e3c6994ba0839a24977a2beda8be6005ea3d860b99/pyarrow-24.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e4505fc6583f7b05ab854934896bcac8253b04ac1171a77dfb73efef92076d91", size = 27271748, upload-time = "2026-04-21T10:49:42.532Z" }, + { url = "https://files.pythonhosted.org/packages/17/1a/cff3a59f80b5b1658549d46611b67163f65e0664431c076ad728bf9d5af4/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1a4e45017efbf115032e4475ee876d525e0e36c742214fbe405332480ecd6275", size = 35238554, upload-time = "2026-04-21T10:48:48.526Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/cce0f42a327bfef2c420fb6078a3eb834826e5d6697bf3009fe11d2ad051/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:7986f1fa71cee060ad00758bcc79d3a93bab8559bf978fab9e53472a2e25a17b", size = 36782301, upload-time = "2026-04-21T10:48:55.181Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/8e560d5ff6793ca29aca213c53eec0dd482dd46cb93b2819e5aab52e4252/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d3e0b61e8efb24ed38898e5cdc5fffa9124be480008d401a1f8071500494ae42", size = 45721929, upload-time = "2026-04-21T10:49:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/27/0c/a26e25505d030716e078d9f16eb74973cbf0b33b672884e9f9da1c83b871/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:55a3bc1e3df3b5567b7d27ef551b2283f0c68a5e86f1cd56abc569da4f31335b", size = 48825365, upload-time = "2026-04-21T10:49:11.714Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/771f9ecb0c65e73fe9dccdd1717901b9594f08c4515d000c7c62df573811/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:641f795b361874ac9da5294f8f443dfdbee355cf2bd9e3b8d97aaac2306b9b37", size = 49451819, upload-time = "2026-04-21T10:49:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/48/da/61ae89a88732f5a785646f3ec6125dbb640fa98a540eb2b9889caa561403/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8adc8e6ce5fccf5dc707046ae4914fd537def529709cc0d285d37a7f9cd442ca", size = 51909252, upload-time = "2026-04-21T10:49:31.164Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1a/8dd5cafab7b66573fa91c03d06d213356ad4edd71813aa75e08ce2b3a844/pyarrow-24.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:9b18371ad2f44044b81a8d23bc2d8a9b6a6226dca775e8e16cfee640473d6c5d", size = 27388127, upload-time = "2026-04-21T10:49:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/d022a34ff05d2cbedd8ccf841fc1f532ecfa9eb5ed1711b56d0e0ea71fc9/pyarrow-24.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:1cc9057f0319e26333b357e17f3c2c022f1a83739b48a88b25bfd5fa2dc18838", size = 35007997, upload-time = "2026-04-21T10:49:48.796Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ff/f01485fda6f4e5d441afb8dd5e7681e4db18826c1e271852f5d3957d6a80/pyarrow-24.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e6f1278ee4785b6db21229374a1c9e54ec7c549de5d1efc9630b6207de7e170b", size = 36678720, upload-time = "2026-04-21T10:49:55.858Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/2d2d5fea814237923f71b36495211f20b43a1576f9a4d6da7e751a64ec6f/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:adbbedc55506cbdabb830890444fb856bfb0060c46c6f8026c6c2f2cf86ae795", size = 45741852, upload-time = "2026-04-21T10:50:04.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3a/28ba9c1c1ebdbb5f1b94dfebb46f207e52e6a554b7fe4132540fde29a3a0/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ae8a1145af31d903fa9bb166824d7abe9b4681a000b0159c9fb99c11bc11ad26", size = 48889852, upload-time = "2026-04-21T10:50:12.293Z" }, + { url = "https://files.pythonhosted.org/packages/df/51/4a389acfd31dca009f8fb82d7f510bb4130f2b3a8e18cf00194d0687d8ac/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d7027eba1df3b2069e2e8d80f644fa0918b68c46432af3d088ddd390d063ecde", size = 49445207, upload-time = "2026-04-21T10:50:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/0bab2b23d2ae901b1b9a03c0efd4b2d070256f8ce3fc43f6e58c167b2081/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e56a1ffe9bf7b727432b89104cc0849c21582949dd7bdcb34f17b2001a351a76", size = 51954117, upload-time = "2026-04-21T10:50:29.14Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/f4e9145da0417b3d2c12035a8492b35ff4a3dbc653e614fcfb51d9dedb38/pyarrow-24.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:38be1808cdd068605b787e6ca9119b27eb275a0234e50212c3492331680c3b1e", size = 28001155, upload-time = "2026-04-21T10:51:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/79/4f/46a49a63f43526da895b1a45bbb51d5baf8e4d77159f8528fc3e5490007f/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:418e48ce50a45a6a6c73c454677203a9c75c966cb1e92ca3370959185f197a05", size = 35250387, upload-time = "2026-04-21T10:50:35.552Z" }, + { url = "https://files.pythonhosted.org/packages/a0/da/d5e0cd5ef00796922404806d5f00325cdadc3441ce2c13fe7115f2df9a64/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:2f16197705a230a78270cdd4ea8a1d57e86b2fdcbc34a1f6aebc72e65c986f9a", size = 36797102, upload-time = "2026-04-21T10:50:42.417Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/5904145b0a593a05236c882933d439b5720f0a145381179063722fbfc123/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:fb24ac194bfc5e86839d7dcd52092ee31e5fe6733fe11f5e3b06ef0812b20072", size = 45745118, upload-time = "2026-04-21T10:50:49.324Z" }, + { url = "https://files.pythonhosted.org/packages/13/d3/cca42fe166d1c6e4d5b80e530b7949104d10e17508a90ae202dac205ce2a/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9700ebd9a51f5895ce75ff4ac4b3c47a7d4b42bc618be8e713e5d56bacf5f931", size = 48844765, upload-time = "2026-04-21T10:50:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/942c3b79878ba928324d1e17c274ed84581db8c0a749b24bcf4cbdf15bd3/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d8ddd2768da81d3ee08cfea9b597f4abb4e8e1dc8ae7e204b608d23a0d3ab699", size = 49471890, upload-time = "2026-04-21T10:51:02.439Z" }, + { url = "https://files.pythonhosted.org/packages/76/97/ff71431000a75d84135a1ace5ca4ba11726a231a8007bbb320a4c54075d5/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:61a3d7eaa97a14768b542f3d284dc6400dd2470d9f080708b13cd46b6ae18136", size = 51932250, upload-time = "2026-04-21T10:51:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/51/be/6f79d55816d5c22557cf27533543d5d70dfe692adfbee4b99f2760674f38/pyarrow-24.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c91d00057f23b8d353039520dc3a6c09d8608164c692e9f59a175a42b2ae0c19", size = 28131282, upload-time = "2026-04-21T10:51:16.815Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +] + +[[package]] +name = "pytest" +version = "7.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287, upload-time = "2023-12-31T12:00:13.963Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, +] + +[[package]] +name = "pytimeparse" +version = "1.1.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/5d/231f5f33c81e09682708fb323f9e4041408d8223e2f0fb9742843328778f/pytimeparse-1.1.8.tar.gz", hash = "sha256:e86136477be924d7e670646a98561957e8ca7308d44841e21f5ddea757556a0a", size = 9403, upload-time = "2018-05-18T17:40:42.76Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/b4/afd75551a3b910abd1d922dbd45e49e5deeb4d47dc50209ce489ba9844dd/pytimeparse-1.1.8-py2.py3-none-any.whl", hash = "sha256:04b7be6cc8bd9f5647a6325444926c3ac34ee6bc7e69da4367ba282f076036bd", size = 9969, upload-time = "2018-05-18T17:40:41.28Z" }, +] + +[[package]] +name = "pytorch-ranger" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/32/9269ee5981995e760c3bf51d6cf7f84a2ce051eca2315753910585bce50d/pytorch_ranger-0.1.1.tar.gz", hash = "sha256:aa7115431cef11b57d7dd7bc86e7302a911dae467f62ec5d0b10e1ff744875db", size = 7865, upload-time = "2020-03-30T07:37:22.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/70/12256257d861bbc3e176130d25be1de085ce7a9e60594064888a950f2154/pytorch_ranger-0.1.1-py3-none-any.whl", hash = "sha256:1e69156c9cc8439185cb8ba4725b18c91947fbe72743e25aca937da8aeb0c8ec", size = 14436, upload-time = "2020-03-30T07:37:21.198Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "sequifier" +version = "1.9.9.9" +source = { editable = "." } +dependencies = [ + { name = "beartype" }, + { name = "csvkit" }, + { name = "fastparquet" }, + { name = "loguru" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "onnx" }, + { name = "onnxruntime", version = "1.24.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "onnxruntime", version = "1.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "onnxscript" }, + { name = "optuna" }, + { name = "plotly" }, + { name = "polars" }, + { name = "psutil" }, + { name = "pyarrow" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "torch" }, + { name = "torch-optimizer" }, +] + +[package.optional-dependencies] +test = [ + { name = "plotly" }, + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "beartype", specifier = ">=0.18.5,<0.19.0" }, + { name = "csvkit", specifier = ">=1.0,<2.0" }, + { name = "fastparquet", specifier = ">=2024.2.0,<2025.0.0" }, + { name = "loguru", specifier = ">=0.7.3,<1.0.0" }, + { name = "numpy", specifier = ">=1.23" }, + { name = "onnx", specifier = ">=1.15.0,<2.0.0" }, + { name = "onnxruntime", specifier = ">=1.17" }, + { name = "onnxscript", specifier = ">=0.5.4" }, + { name = "optuna", specifier = ">=2.10.0" }, + { name = "plotly", specifier = ">=4.0.0" }, + { name = "plotly", marker = "extra == 'test'", specifier = ">=6.0,<7.0" }, + { name = "polars", specifier = ">=1.0.0,<2.0.0" }, + { name = "polars", specifier = ">=1.31.0,<2.0" }, + { name = "psutil", specifier = ">=7.0.0,<8.0.0" }, + { name = "pyarrow", specifier = ">=16.1" }, + { name = "pydantic", specifier = ">=2.0,<3.0" }, + { name = "pytest", marker = "extra == 'test'", specifier = ">=7.2,<8.0" }, + { name = "pyyaml", specifier = ">=6.0,<7.0" }, + { name = "torch", specifier = ">=2.4" }, + { name = "torch-optimizer", specifier = ">=0.3.0,<0.4.0" }, +] +provides-extras = ["test"] + +[[package]] +name = "setuptools" +version = "81.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.50" +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/57/da/6fbf010c8ebb347679d0d100b22fe9ba5e13fd04046c5df7280d2f0bf706/sqlalchemy-2.0.50.tar.gz", hash = "sha256:af5607d11ef90fd6a5c0549fe0045dce1663d427426bcfb506dcb5346a85a3b9", size = 9907424, upload-time = "2026-05-24T19:20:04.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/a9/812a775bd8c1af0966d660238d005baf25e9bced1f038c8e71f00aa637a7/sqlalchemy-2.0.50-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7af6eeb84985bf840ba779018ff9424d61ff69b52e66b8789d3c8da7bf5341b2", size = 2161617, upload-time = "2026-05-24T20:00:00.761Z" }, + { url = "https://files.pythonhosted.org/packages/d5/74/5a6bc5496e9be8f740fbf80f9e6bd4ab965c8a80870eb07ab015e360957a/sqlalchemy-2.0.50-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fe7822866f3a9fc5f3db21a290ce8961a53050115f05edf9402b6a5feb92a9f", size = 3244104, upload-time = "2026-05-24T20:07:38.158Z" }, + { url = "https://files.pythonhosted.org/packages/81/55/b260d8df2adc9bb0bf294f67b5f802ff0d84d99442b536b9efd0ea72d447/sqlalchemy-2.0.50-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e1b0f6a4dcd9b4839e2320afb5df37a6981cbc20ff9c423ae11c5537bdbd21", size = 3243039, upload-time = "2026-05-24T20:14:23.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6d/58714005cbf370f16c3f30d30324a43be10069efcfe764f7236a2e851947/sqlalchemy-2.0.50-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e195687f1af431c9515416288373b323b6eb599f774409814e89e9d603a56e39", size = 3195017, upload-time = "2026-05-24T20:07:40.086Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/67527fee039bd3e1a6ce3f03d2b62fd87ab9099c17052810d79496727b66/sqlalchemy-2.0.50-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ea1a8a2db4b2217d456c8d7a873bfc605f06fe3584d315264ea18c2a17585d0b", size = 3215308, upload-time = "2026-05-24T20:14:26.034Z" }, + { url = "https://files.pythonhosted.org/packages/94/b2/dd3155a6a6706cb89adecf5ee6e0512f7b0ee5cf3e6f4cde67d3c20ebfda/sqlalchemy-2.0.50-cp310-cp310-win32.whl", hash = "sha256:68b154b08088b4ec32bb4d2958bfbb50e57549f91a4cd3e7f928e3553ed69031", size = 2121637, upload-time = "2026-05-24T20:08:06.401Z" }, + { url = "https://files.pythonhosted.org/packages/93/a1/a09c463ee3e7764b5ce5bd19a7f0b6eefbde62e637439ab58498cdbd6b47/sqlalchemy-2.0.50-cp310-cp310-win_amd64.whl", hash = "sha256:66e374271ecb7101273f57af1a62446a953d327eec4f8089147de57c591bbacc", size = 2144673, upload-time = "2026-05-24T20:08:07.936Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5d/3172686af1770e4de2805f919a51441085f589ddadf3dd76ec582f84f497/sqlalchemy-2.0.50-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1aa6e403663a9c43c8fef7ce4bdb4cf48bcd8d352e91deda2a99f963270bd508", size = 2161366, upload-time = "2026-05-24T20:00:02.061Z" }, + { url = "https://files.pythonhosted.org/packages/0f/90/e98dedea3c3e663a17afcd003a34ba45efdac2cea3b6f2e4585e2b1e2537/sqlalchemy-2.0.50-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51b637a84f9fa35ae1f9017e786cb142974a25305085e1b378b3647a67f65ad3", size = 3318926, upload-time = "2026-05-24T20:07:42.369Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4f/501308c2babb62c11753ecb4ee88ba9eef019419a4d6cbf7cb13e2bad353/sqlalchemy-2.0.50-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2dab927761d9108550f0cf8e66ff21af56f907a0ce0a689793db615e2b55f62c", size = 3319199, upload-time = "2026-05-24T20:14:28.551Z" }, + { url = "https://files.pythonhosted.org/packages/ac/39/d88996c5e03ed6248c3a788d20f0b8d8b376b9f8a495e4bab9df7c72d2f8/sqlalchemy-2.0.50-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:545eae198d37bcf837a10ede3684e2af32458d6f35c597c35c2de7502dc38fc4", size = 3270301, upload-time = "2026-05-24T20:07:44.917Z" }, + { url = "https://files.pythonhosted.org/packages/42/1b/1ae0e65161b51cc43e5ca75430ef79d80e23b5042d645586c2c342c3b92e/sqlalchemy-2.0.50-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fec460e18cdbb4c7773531122ce9a27e96c6ca17af3933941d94da475ad2c86", size = 3293465, upload-time = "2026-05-24T20:14:30.501Z" }, + { url = "https://files.pythonhosted.org/packages/83/29/17c0003f2c0dfa6d1b97672475707e3ec5980db09defd7fa20beb6833bbd/sqlalchemy-2.0.50-cp311-cp311-win32.whl", hash = "sha256:e6e814658818fd165e749e3d8490ef16cc7f379a118c37ada8b0589ffbaaac22", size = 2120694, upload-time = "2026-05-24T20:08:09.237Z" }, + { url = "https://files.pythonhosted.org/packages/c9/18/280d00654cc19d1fccf236fa5070f6dd04b84dde6f1b2e637bde0ff340a7/sqlalchemy-2.0.50-cp311-cp311-win_amd64.whl", hash = "sha256:1c5f858fe79c9f5d8fda065c06186356acb7f8df3cd52dbd5ee3f200e4b144f5", size = 2145315, upload-time = "2026-05-24T20:08:10.952Z" }, + { url = "https://files.pythonhosted.org/packages/be/b0/a9d19b43f38f878b1278bca5b00b909f7540d41494396dd2561f9ad0956d/sqlalchemy-2.0.50-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae23d8b9d344d30d0a92f06d45825024a5790f1c1dd4cf452636a50d3e58cb", size = 2159807, upload-time = "2026-05-24T19:27:53.086Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2c/191dd58a248fd2cfd4780fa82c375c505e4ad98c8b522fa69ec492130d77/sqlalchemy-2.0.50-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47b71b933e7b4ebad407c8fdfd70d2c4f08b78b3238bb30eebdd6eb32ca51b89", size = 3343358, upload-time = "2026-05-24T20:09:29.279Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2b/514fce8a7df81cf5bad7ff7865de7ac0c5776a38cc043475c4703eb7fe8b/sqlalchemy-2.0.50-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:110fdac56ace278949f00de805edacbd6141e382d992f9ba28238b3a0827a600", size = 3357994, upload-time = "2026-05-24T20:17:13.495Z" }, + { url = "https://files.pythonhosted.org/packages/35/a6/a0e283f5494f92b0d77e319ff77e437b1ffe4a051ba67c81d53234825475/sqlalchemy-2.0.50-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5e4ac70e9e757f6b3e87c0491ff034442ecd8dfd36d041a50564c322dafc0e", size = 3289399, upload-time = "2026-05-24T20:09:32.239Z" }, + { url = "https://files.pythonhosted.org/packages/b7/96/1b07325ba71752d6a028b77d07bed1483ad545f794e8b1dc89b3ba3b3c68/sqlalchemy-2.0.50-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:724f3dcbe53dd0151e3cb5e7ec4ba4c620bede579caacd16275dc35ce06e8615", size = 3321216, upload-time = "2026-05-24T20:17:15.581Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8e/bad6ed253e8a99edfc99af02f7173ec48a1d3ed1b9b35a1b8bc1700900cc/sqlalchemy-2.0.50-cp312-cp312-win32.whl", hash = "sha256:1208050441471d003b7c8cb4054fb084f185cf35ac3f0ea270803865bca9939a", size = 2119194, upload-time = "2026-05-24T19:50:04.943Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2d/314a6690dda4b9cfc571eab1a63cf6fe6e1470aa3759ccda6aa016ee0f5a/sqlalchemy-2.0.50-cp312-cp312-win_amd64.whl", hash = "sha256:9d1af51558029a156a70986b7df88f042b3d158d7c8d8fb5072912d4b32d89c7", size = 2146186, upload-time = "2026-05-24T19:50:06.74Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c4/c42356b527296e9862f67990efce31ef78b4cf69cd3f80873a528a060320/sqlalchemy-2.0.50-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:06a9210bdc5f4298cff0781087e2ff45683922252dacc452846373a58761f093", size = 2156697, upload-time = "2026-05-24T19:27:54.764Z" }, + { url = "https://files.pythonhosted.org/packages/60/a1/b1a70e3c4365ac7fe9e347f3710f19b562c866fb96d45e3c891588789a7b/sqlalchemy-2.0.50-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b53784972ade4f8174b9aa661f31a06f8a936d2cfdd602913ff3c6dd40ae873", size = 3284260, upload-time = "2026-05-24T20:09:34.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/4a/f3ac3caa19f263d57b0a47f8c91bbf56583dc2d3fc63acfbf644abb24fe0/sqlalchemy-2.0.50-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31648fa14460537e768a7303b078e4344d208e0d23e06867c1f376a227ed82db", size = 3302280, upload-time = "2026-05-24T20:17:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/66/55/ccada3e3d62254587819749a0bc69f41173eb48a6e385d10e66d32a9c88e/sqlalchemy-2.0.50-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:03f4323c980ad0e918cc9e5369b015f759f4e534db5bbaf4dc36832c10d05064", size = 3231580, upload-time = "2026-05-24T20:09:36.406Z" }, + { url = "https://files.pythonhosted.org/packages/05/f6/6809349130a2de0e109e7f00fd7d431da9565b9b2868b32ee684754f672b/sqlalchemy-2.0.50-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b9dcc43afef8ac157cd92fce96985d6b8b0cfbd3df4d666f66b4d55a75d202f", size = 3269375, upload-time = "2026-05-24T20:17:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/48/84/278a811ef4e07be9c89dc5cdd7be833268509a66a68c4897cf585e67428f/sqlalchemy-2.0.50-cp313-cp313-win32.whl", hash = "sha256:60922d6599065ddca2c6f376b9aa2f41a6b85a271725e0909490bbc50b1998a5", size = 2117229, upload-time = "2026-05-24T19:50:08.215Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1c/067cc6187ed32d2ec222fe6d2643acc1659a6d0659f8a7cbc5ad3ae83280/sqlalchemy-2.0.50-cp313-cp313-win_amd64.whl", hash = "sha256:287086e67275a212c4582d166a6fb03a65ccc5551d80866270ce0dd9f34eccd3", size = 2143126, upload-time = "2026-05-24T19:50:09.691Z" }, + { url = "https://files.pythonhosted.org/packages/df/32/10ac51b4be7cdecd7e93d069251c86dfbf70b7adbd7c67b48ccea6c49e1c/sqlalchemy-2.0.50-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c966932507a4d7d0a37314927dbfcd89720e3f37d2a1e3352e7ae7939fa8e8a0", size = 2158519, upload-time = "2026-05-24T19:27:56.472Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/e703d2f7681d7d66c4c891af3f07c7ccf4c76ad7f18351de035b5eda007a/sqlalchemy-2.0.50-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:faffef4bcc20a1892e65e155293d99d60855bbbc79250ab712819cfd56a8e6bb", size = 3282063, upload-time = "2026-05-24T20:09:38.57Z" }, + { url = "https://files.pythonhosted.org/packages/31/26/ef168b184a25701f9995e8fb7e503fafd7a99c1c77cda1bc1a26ea2ed486/sqlalchemy-2.0.50-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c206aec519a2e7bd08abbfb33436e325fd22c632d9c21a9047e376ce241646e", size = 3287069, upload-time = "2026-05-24T20:17:21.942Z" }, + { url = "https://files.pythonhosted.org/packages/c2/15/765acc2bc693bccc43ca4a95d5b69750da8aaf6db1b5c616536e087f8920/sqlalchemy-2.0.50-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bef4ac756363227ef6402a75fee025a4bc690f92328e825868939b3b3a446a6d", size = 3230453, upload-time = "2026-05-24T20:09:40.398Z" }, + { url = "https://files.pythonhosted.org/packages/63/61/08e03c3adbf5db0087a0b6816746fec8f3032fb2f7fc899a9bb9b2a48ce4/sqlalchemy-2.0.50-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:96fbee6b19c19cd1556c8bf9419447cf2ec149ffcab7ab64348c23e54ef8547f", size = 3252413, upload-time = "2026-05-24T20:17:24.067Z" }, + { url = "https://files.pythonhosted.org/packages/03/0c/370a1f2db38436c615e10134c8a37de3688e74084792380695f3f5083860/sqlalchemy-2.0.50-cp314-cp314-win32.whl", hash = "sha256:8f00e3eb43ba30eb1b238ee03a8a62309486d1321eda3328bb611e0340033ad8", size = 2120063, upload-time = "2026-05-24T19:50:11.08Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a0/fe92bb9817863bc13ba093bda931979a26cc2ca69f8e8f26d07add3d7c6f/sqlalchemy-2.0.50-cp314-cp314-win_amd64.whl", hash = "sha256:15708c613cd5005b7dffe1f66ee6a63ee8f5e46799f71c70ebad74178c676a39", size = 2145830, upload-time = "2026-05-24T19:50:12.452Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ff/e5640a98a0b2f491eb8fde10fb6c773621a2e44340de231fafcc9370f4a9/sqlalchemy-2.0.50-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3699dac4be410e97049a1658e9480da9cde956594aa0f3aebc60b88f21c5ba70", size = 2178435, upload-time = "2026-05-24T19:42:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/b7/85/337116e186f1236375b5fb70c21cfac98e8e8ab0d3a47be838dc47a59e08/sqlalchemy-2.0.50-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f96233858e3df43932ac11589e22520da6e8aeb624b03fedfeebb0e8ea213086", size = 3566059, upload-time = "2026-05-24T20:01:20.848Z" }, + { url = "https://files.pythonhosted.org/packages/96/34/bb0e190e161c3c2c24314a65add57218be14a4a9486886b7f5047c1ff7c8/sqlalchemy-2.0.50-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c4e70c46fad30c3bcc6a4708bc0130a3173e11a5b25f0ea4a9d8911b450f1f52", size = 3535366, upload-time = "2026-05-24T20:03:56.768Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/a7f759f97e4fd499c5d4e4488c760d5a7fbecf3028b465a04274fcd52384/sqlalchemy-2.0.50-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1918a3cf564d16d95bca7301005f41ab2ad50b07cd3b9da50d3ed986db148d6a", size = 3474879, upload-time = "2026-05-24T20:01:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d9/2907ea38eb60687d297bf9c39e5ee58053c87b57fe8a9cae97090cecbf10/sqlalchemy-2.0.50-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b00098cdbdbd38c7be3d568b0c9c3122b8c0ec62b911b57cd5e6e0254d60a76d", size = 3486117, upload-time = "2026-05-24T20:03:59.052Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e3/5aa06f167559f8c0bdae487e297d23ba548150ab016a3418265d617a4985/sqlalchemy-2.0.50-cp314-cp314t-win32.whl", hash = "sha256:1fbd55a969d7ac44a98e3dec75016074f809fa08f871585ace58dde110d1bf3e", size = 2150823, upload-time = "2026-05-24T20:08:58.644Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/112fb8f977582d7489d036e409e3723948bcf5320b3ac465f3c481bbe8f9/sqlalchemy-2.0.50-cp314-cp314t-win_amd64.whl", hash = "sha256:c5c3cdb753a9004183e1ccb634b41611654c989e61bc68617ce878e46d6f1e51", size = 2185794, upload-time = "2026-05-24T20:09:00.319Z" }, + { url = "https://files.pythonhosted.org/packages/d0/10/f7220e9b784d295d241c86ed99aeb537f92afcd469a64861f2717e9bb077/sqlalchemy-2.0.50-py3-none-any.whl", hash = "sha256:92064363517a3ff8212b5a93b8c62876579d8dfd1ca5b561335f30152d884fa9", size = 1943861, upload-time = "2026-05-24T19:59:01.119Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "torch" +version = "2.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, + { name = "cuda-toolkit", extra = ["cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "nvidia-cublas", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" }, + { name = "setuptools" }, + { name = "sympy" }, + { name = "triton", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/b7/53fe0436586716ab7aecff41e26b9302d57c85ded481fd83a2cd741e6b4e/torch-2.12.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1834bd984f8a2f4f16bdfbeecca9146184b220aa46276bf5756735b5dae12812", size = 87981887, upload-time = "2026-05-13T14:55:53.234Z" }, + { url = "https://files.pythonhosted.org/packages/34/60/d930eac44c30de06ed16f6d1ba4e785e1632532b50d8f0bf9bf699a4d0c7/torch-2.12.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d4d029801cb7b6df858804a2a21b00cc2aa0bf0ee5d2ab18d343c9e9e5681f35", size = 426355000, upload-time = "2026-05-13T14:54:31.944Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0c/c76b6a087820bab55705b94dfc074e520de9ae91f5ef90da2ecbf2a3ef12/torch-2.12.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d47e7dee68ac4cd7a068b26bcd6b989935427709fae1c8f7bd0019978f829e15", size = 532144998, upload-time = "2026-05-13T14:56:05.523Z" }, + { url = "https://files.pythonhosted.org/packages/4a/64/8a0d036e166a6aa85ee09bef072f3655d1ba5d5486a68d1b03b6813c01b3/torch-2.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:cf9839790285dd472e7a16aafcb4a4e6bf58ec1b494045044b0eefb0eb4bd1f2", size = 122949877, upload-time = "2026-05-13T14:55:46.841Z" }, + { url = "https://files.pythonhosted.org/packages/18/62/131124fb95df03811b8260d1d43dcc5ee85ea1a344b964613d7efe77fb08/torch-2.12.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:10802fd383bbfed646212e765a72c37d2185205d4f26eb197a254e8ac7ddcb25", size = 87990344, upload-time = "2026-05-13T14:55:42.154Z" }, + { url = "https://files.pythonhosted.org/packages/12/9c/dda0dbd547dc549839824135f223792fd0e725f28ed0715dda366b7acaa2/torch-2.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c12592630aef72feaf18bd3f197ef587bbfa21131b31c38b23ab2e55fce92e36", size = 426362932, upload-time = "2026-05-13T14:54:15.295Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d2/a7dd5a3f9bdaa7842124e8e2359202b317c48d47d2fc5816fafdf2049adb/torch-2.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:415c1b8d0412f67551c8e89a2daca0fb3e56694af0281ba155eaa9da481f58b4", size = 532170085, upload-time = "2026-05-13T14:55:20.788Z" }, + { url = "https://files.pythonhosted.org/packages/12/1b/a61ce2004f9ab0ea8964a6e6168133a127795667639e2ff4f8f2bdb16a65/torch-2.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:dd37188ea325042cb1f6cafa56822b11ada2520c04791a52629b0af25bdfbfd9", size = 122953128, upload-time = "2026-05-13T14:54:52.744Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/285d643f254731294c9b595a007eac39db4600a98682d7bca688f42ca164/torch-2.12.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b41339df93d491435e790ff8bcbae1c0ce777175889bfd1281d119862793e6a2", size = 88010197, upload-time = "2026-05-13T14:55:35.414Z" }, + { url = "https://files.pythonhosted.org/packages/79/81/76debf1db1343bd929bbb5d74c89fb437c2ed88eb144712557e7bd3eea45/torch-2.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8fbef9f108a863e7722a73740998967e3b074742a834fc5be3a535a2befa7057", size = 426376751, upload-time = "2026-05-13T14:55:03.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/f0/80026028b603c4650ff270fc3785bdef4bd6738765a9cc5a0f5a637d65a2/torch-2.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4b4f64c2c2b11f7510d93dd6412b87025ff6eddd6bb61c3b5a3d892ea20c4756", size = 532261691, upload-time = "2026-05-13T14:52:54.453Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c2/64b06cbb7830fb3cd9be13e1158b31a3f36b68e6a209105ee3c9d9480be0/torch-2.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:8b958caff4a14d3a3b0b2dfc6a378f64dda9728a9dad28c08a0db9ce4dafb549", size = 122988114, upload-time = "2026-05-13T14:54:42.153Z" }, + { url = "https://files.pythonhosted.org/packages/86/ca/01896c80ba921676aa45886b2c5b8d774912de2a1f719de48169c6f755cd/torch-2.12.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:90dd587a5f61bfe1307148b581e2084fc5bc4a06e2b90a20e9a36b81087ff16b", size = 88009511, upload-time = "2026-05-13T14:54:47.411Z" }, + { url = "https://files.pythonhosted.org/packages/a5/04/52bdaf4787eab6ac7d7f5851dff934e4def0bc8ead9c8fd2b69b3e529699/torch-2.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:864392c73b7654f4d2b3ae712f607937d0dbb1101c4555fbb41848106b297f39", size = 426383231, upload-time = "2026-05-13T14:53:32.129Z" }, + { url = "https://files.pythonhosted.org/packages/49/8a/94bdecd13f5aaa90d45920b89789d9fe7c6f4af8c3cdd7ce01fcb59908fc/torch-2.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5d6b560dfa7d56291c07d615c3bb73e8d9943d9b6d87f76cd0d9d570c4797fa6", size = 532269288, upload-time = "2026-05-13T14:53:49.423Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/bdbaaa267de519ef1b73054bf590d8c93c37a266c9a4e24a01bd38b6918f/torch-2.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:3fee918902090ade827643e758e98363278815de583c75d111fdd665ebffde9f", size = 122987706, upload-time = "2026-05-13T14:54:00.335Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ad/e95e822f3538171e22640a7fbe839a1fdb666600bf6487025de2ff03b11a/torch-2.12.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:10ee1448a9f304d3b987eb4656f664ba6e4d7b410ca7a5a7c642199777a2cf88", size = 88319556, upload-time = "2026-05-13T14:54:05.574Z" }, + { url = "https://files.pythonhosted.org/packages/b7/07/055d06d985b445d67422d25b033c11cf55bbb81785d4c4e68e28bca5820e/torch-2.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:af68dbf403439cae9ceaeaaf92f8352b460787dcd27b92aa05c40dd4a19c0f1e", size = 426397656, upload-time = "2026-05-13T14:52:38.84Z" }, + { url = "https://files.pythonhosted.org/packages/43/94/b0b4fdc3014122e0a7302fb90086d352aa48f2576f0b252561ebb38c01a8/torch-2.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:a6a2eebb237d3b1d9ad3b378e86d9b9e0782afdea8b1e0eba6a13646b9b49c07", size = 532183124, upload-time = "2026-05-13T14:53:16.178Z" }, + { url = "https://files.pythonhosted.org/packages/d8/c8/052405e6ad05d3237bfe5a4df78f917773956f8e17813a2d44c059068b74/torch-2.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2140e373e9a51a3e22ef62e8d14366d0b470d18f0adf19fdc757368077133a34", size = 123232462, upload-time = "2026-05-13T14:52:27.26Z" }, + { url = "https://files.pythonhosted.org/packages/67/dc/ac069f8d6e8be701535921141055293b0d4819d3d7f224a4612cf157c7f9/torch-2.12.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7dfae4a519197dfa050e98d8e36378a0fb5899625a875c2b54445005a2e404e", size = 88027282, upload-time = "2026-05-13T14:53:05.258Z" }, + { url = "https://files.pythonhosted.org/packages/33/c3/1c1eb00e34555b536dddf792676026a988d710ed36981aa00499b36b0620/torch-2.12.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:891c769072637c74e9a5a77a3bc782894696d8ffec83b938df8536dee7f0ba78", size = 426386961, upload-time = "2026-05-13T14:51:28.406Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d4/7e730dba0c7032a4154dc9056b76cf9625515e030e269cfbf8098fcfee7d/torch-2.12.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e2ad3eb85d39c3cab62dfa93ed5a73516e6a53c6713cb97d004004fe089f0f1f", size = 532272265, upload-time = "2026-05-13T14:51:59.308Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b4/92c80d1bbfee1c0036c06d1d2155a3065bd2423134c83bf8a47e65cd6b9b/torch-2.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:c66696857e987efb8bc1777a37357ec4f60ab5e8af6250b83d6034437fa2d8f3", size = 122987138, upload-time = "2026-05-13T14:51:45.942Z" }, + { url = "https://files.pythonhosted.org/packages/7b/78/2e12b37ce50a19a037d7bc62d652a5a8f27385a7b05859d6bc9204f20cfe/torch-2.12.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:b4556715c8572758625d62b6e0ae3b1f76c440221913a6fb5e100f321fb4fb02", size = 88320100, upload-time = "2026-05-13T14:51:39.955Z" }, + { url = "https://files.pythonhosted.org/packages/56/5e/83c450ec7b0bb40a7b74611c1b5440f9260e33c54c90d556fd4a1f0fd955/torch-2.12.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a43ac605a5e13116c72b64c359644cce0229f213dde48d2ae0ae5eb5becf7feb", size = 426391871, upload-time = "2026-05-13T14:52:14.989Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e9/1a0b575d98d0afedd8f157d23fa3d2759421483660448e60d0a4b10b6daa/torch-2.12.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6a7512adfdd7f6732e40de1c620831e3c75b39b98cef60b11d0c5f0a76473ec5", size = 532192241, upload-time = "2026-05-13T14:51:07.795Z" }, + { url = "https://files.pythonhosted.org/packages/88/21/afadd25ecd81b3cea1e11c73cf1ab41a983a50271548c3ec7ec3b9efc3e9/torch-2.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5f96b63f8287f66a005dd1b5a6abba2920f11156c5e5c4d815f3e2050fd1aa16", size = 123231092, upload-time = "2026-05-13T14:51:18.854Z" }, +] + +[[package]] +name = "torch-optimizer" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytorch-ranger" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/13/c4c0a206131e978d8ceaa095ad1e3153d7daf48efad207b6057efe3491a2/torch-optimizer-0.3.0.tar.gz", hash = "sha256:b2180629df9d6cd7a2aeabe71fa4a872bba938e8e275965092568cd9931b924c", size = 54409, upload-time = "2021-10-31T03:00:22.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/54/bbb1b4c15afc2dac525c8359c340ade685542113394fd4c6564ee3c71da3/torch_optimizer-0.3.0-py3-none-any.whl", hash = "sha256:7de8e57315e43561cdd0370a1b67303cc8ef1b053f9b5573de629a62390f2af9", size = 61897, upload-time = "2021-10-31T03:00:19.812Z" }, +] + +[[package]] +name = "tqdm" +version = "4.68.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/05/0d5260f1f1ca784f4a4a0def9cbe6affe587f5b4025328d446c3d67765f4/tqdm-4.68.2.tar.gz", hash = "sha256:89c230e8dbc67c7615c142487111222f878c77427ea09549960f62389e258add", size = 171923, upload-time = "2026-06-09T13:26:42.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/75/1a0392bcc21c44dcdf87b3cf2d137e7829be2c083a1e38d44efca3d57a16/tqdm-4.68.2-py3-none-any.whl", hash = "sha256:d4240441fb5353290b87d6a85968c9decc131a99b8c7faa28269d829de669ede", size = 78578, upload-time = "2026-06-09T13:26:40.731Z" }, +] + +[[package]] +name = "triton" +version = "3.7.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/97/dcd1f2a0f8336691bff74abc59b2ed9c69a0c0f8f65cd77109c49e05f068/triton-3.7.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223ac302091491436c248a34ee1e6c47a1026486579103c906ffd805be50cb89", size = 188367104, upload-time = "2026-05-07T19:04:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c0/c2ac4fd2d8809b7579d4a820a0f9e5de62a9bc8a757ed4b3abf4f7ee964a/triton-3.7.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c631b65668d4951213b948a413c0564184305b77bb45cc9d686d3e1ecc4701a3", size = 201313191, upload-time = "2026-05-07T18:45:58.444Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c1/5d842314bb6c78442cc60437928781701c6050b8d479bc2a1aed691d37ca/triton-3.7.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9e71fc392675fac364e0ecf4ef3f76f85b7f5433a16f4c3c5fe5f05a52c85fe", size = 188480277, upload-time = "2026-05-07T19:05:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/13/31/8315ea5f8dd18e60970b3022e3a8b93fd37e0b784fbbef86e10c8e6e5ca1/triton-3.7.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22bacffce443f54593dd20f05294d5a40622e0ea9ab632816f87154504356221", size = 201415942, upload-time = "2026-05-07T18:46:06.479Z" }, + { url = "https://files.pythonhosted.org/packages/f7/13/ec05adfcd87311d532ba61e3af143e8be59fcd26675884c4682841406a20/triton-3.7.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4bf49b00a7a377a68a6da603a876e797614e6455a80e9021669c476a953ad9a", size = 188505104, upload-time = "2026-05-07T19:05:09.843Z" }, + { url = "https://files.pythonhosted.org/packages/62/7b/468a576e35beef1426e0828e28e9ba9e65f5474d496f16ee126c15646324/triton-3.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f111161d49bf903c0eaedde3962353a3d841c08a836839b7cc1025b8426efcf", size = 201457567, upload-time = "2026-05-07T18:46:13.505Z" }, + { url = "https://files.pythonhosted.org/packages/01/e1/a59a583de59b8f62c495d67c80ee3ea97d09e91ac80c4c6e76456ed8d8ac/triton-3.7.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abdf6beaa89b1bcfb9a43cd990536ce66091a997841a4814b260b7bee4c88c3c", size = 188503209, upload-time = "2026-05-07T19:05:17.935Z" }, + { url = "https://files.pythonhosted.org/packages/30/b1/b7507bb9815d403927c8dd51d4158ed2e11751a92dbc118a044f247b6848/triton-3.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a35d7afe3f3f058e7ec49fcce09794049e0ffc5c59019ac25ec3413741b8c4e7", size = 201453566, upload-time = "2026-05-07T18:46:20.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/0bea7a6a0c989315c9135a1d7fb37e41905cfb3a17cbc1f10044ebd4cc3a/triton-3.7.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc1d61c172d257db80ddf42595131fb196ad2e9bdd751e90fe2ef13531734e8b", size = 188612899, upload-time = "2026-05-07T19:05:24.955Z" }, + { url = "https://files.pythonhosted.org/packages/e1/02/d96f57828d0912aec733b9bc7e0e7dbfd2c6f079a8fa433ac25cb93d1a30/triton-3.7.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70fb9bbdc9f400afc54bbf6eb2670af28829a6ae3996863317964783141daf56", size = 201553816, upload-time = "2026-05-07T18:46:27.49Z" }, + { url = "https://files.pythonhosted.org/packages/40/fb/82a802dac4689f2a2fb2e69302e6a138eecc3e175bbe976ba3cfc717683a/triton-3.7.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a44a8476d0d3571eac4e4d1048e1ff75aad81a09ff4602ccfc56c6dea1672e", size = 188507879, upload-time = "2026-05-07T19:05:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/8f/af/9904ec6d3c93d9b24e5ec360445bbdf758b7f00bfbeedb89cb0eb64eb8bb/triton-3.7.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9b85e72968a9d8bba5ddb24e9b64aaabaf48affb042f2755cb7cfa92b7531ce", size = 201460637, upload-time = "2026-05-07T18:46:34.749Z" }, + { url = "https://files.pythonhosted.org/packages/a1/f9/4835a8ea746b88727d8899f4e3ccce4f9cacb38abfc3bb0a638266c53111/triton-3.7.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18a160de426fd99f92b0baf509045360afbd3bfaa0b4a5171dde800ec9f09684", size = 188608706, upload-time = "2026-05-07T19:05:39.218Z" }, + { url = "https://files.pythonhosted.org/packages/c1/68/fa86e5a39608000f645535b2c124920126327ab731f8c4fafd5b07ff8d4b/triton-3.7.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce061073102714b725f3660ec6939d94a1da7984b3aa99c921417cae273672f5", size = 201546766, upload-time = "2026-05-07T18:46:42.088Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, +] + +[[package]] +name = "xlrd" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload-time = "2025-06-14T08:46:39.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, +]