diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b48690fb..e86c0492 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -146,3 +146,84 @@ jobs: - name: Run unit tests run: poetry run pytest tests/ -v + + smoke: + name: Smoke tests (Python 3.12, ubuntu) + runs-on: ubuntu-latest + needs: lint + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install Poetry + run: pipx install poetry + + - name: Configure Poetry + run: poetry config virtualenvs.in-project true + + - name: Cache virtualenv + uses: actions/cache@v4 + with: + path: .venv + key: venv-smoke-${{ runner.os }}-3.12-${{ hashFiles('poetry.lock') }} + + - name: Install dependencies + run: poetry install + + - name: Run smoke tests + run: poetry run pytest tests/ -v -m smoke --tb=short + + coverage: + name: Coverage (stable modules) + runs-on: ubuntu-latest + needs: tests + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install Poetry + run: pipx install poetry + + - name: Configure Poetry + run: poetry config virtualenvs.in-project true + + - name: Cache virtualenv + uses: actions/cache@v4 + with: + path: .venv + key: venv-coverage-${{ runner.os }}-3.12-${{ hashFiles('poetry.lock') }} + + - name: Install dependencies + run: poetry install + + - name: Run tests with coverage + run: | + poetry run pytest tests/ \ + --cov=deeptab \ + --cov-branch \ + --cov-report=term-missing \ + --cov-report=xml:coverage.xml \ + -q + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: coverage.xml + retention-days: 30 + + - name: Upload to Codecov + uses: codecov/codecov-action@v4 + with: + files: coverage.xml + fail_ci_if_error: false diff --git a/.gitignore b/.gitignore index 4d1c027d..5bff3c85 100644 --- a/.gitignore +++ b/.gitignore @@ -168,12 +168,28 @@ dist/ # logs and checkpoints examples/lightning_logs *.ckpt - +*.deeptab +lightning_logs +lightning_logs/* +checkpoints +checkpoints/* +model_checkpoints +model_checkpoints/* +outputs +outputs/* +experiment_logs +experiment_logs/* +mlruns +mlruns/* +deeptab_runs +deeptab_runs/* +obs_runs +obs_runs/* + +# Sphinx build artifacts docs/_build/doctrees/* docs/_build/html/* +# dev files dev dev/* - - -lightning_logs/* diff --git a/README.md b/README.md index e3d7a106..59363091 100644 --- a/README.md +++ b/README.md @@ -1,428 +1,431 @@ -
-
-[](https://pypi.org/project/deeptab)
-
-[](https://deeptab.readthedocs.io/en/latest/?badge=latest)
-[](https://deeptab.readthedocs.io/en/latest/)
-[](https://github.com/OpenTabular/deeptab/issues)
-
-[πDocumentation](https://deeptab.readthedocs.io/en/latest/index.html) |
-[π οΈInstallation](https://deeptab.readthedocs.io/en/latest/installation.html) |
-[Models](https://deeptab.readthedocs.io/en/latest/api/models/index.html) |
-[π€Report Issues](https://github.com/OpenTabular/deeptab/issues)
-
-
+
+[](https://pypi.org/project/deeptab)
+
+[](https://pypi.org/project/deeptab)
+[](https://github.com/OpenTabular/DeepTab/blob/main/LICENSE)
+[](https://deeptab.readthedocs.io/en/latest/?badge=latest)
+[](https://deeptab.readthedocs.io/en/latest/)
+[](https://github.com/OpenTabular/DeepTab/issues)
+
+[π Documentation](https://deeptab.readthedocs.io) |
+[π Getting Started](https://deeptab.readthedocs.io/en/latest/getting_started/quickstart.html) |
+[π― Model Zoo](https://deeptab.readthedocs.io/en/latest/model_zoo/index.html) |
+[π Tutorials](https://deeptab.readthedocs.io/en/latest/tutorials/index.html) |
+[π€ Report Issues](https://github.com/OpenTabular/DeepTab/issues)
+
+MambularClassifier(model_config=MambularConfig(head_layer_sizes=[], n_layers=3),\n",
+ " preprocessing_config=PreprocessingConfig(numerical_preprocessing='quantile',\n",
+ " categorical_preprocessing=None,\n",
+ " n_bins=None,\n",
+ " feature_preprocessing=None,\n",
+ " use_decision_tree_bins=None,\n",
+ " binning_strategy=None,\n",
+ " task=None,\n",
+ " cat_cutoff=None,\n",
+ " treat_all_integers_as_numerical=None,\n",
+ " degree=None,...\n",
+ " monitor='val_loss',\n",
+ " mode='min',\n",
+ " lr=0.0003,\n",
+ " lr_patience=10,\n",
+ " lr_factor=0.1,\n",
+ " weight_decay=1e-06,\n",
+ " optimizer_type='scaledadam',\n",
+ " optimizer_kwargs={'scale': 0.8},\n",
+ " scheduler_type='ReduceLROnPlateau',\n",
+ " scheduler_kwargs=None,\n",
+ " scheduler_monitor=None,\n",
+ " scheduler_interval='epoch',\n",
+ " scheduler_frequency=1,\n",
+ " no_weight_decay_for_bias_and_norm=False,\n",
+ " checkpoint_path='model_checkpoints'))In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. MambularClassifier(model_config=MambularConfig(head_layer_sizes=[], n_layers=3),\n",
+ " preprocessing_config=PreprocessingConfig(numerical_preprocessing='quantile',\n",
+ " categorical_preprocessing=None,\n",
+ " n_bins=None,\n",
+ " feature_preprocessing=None,\n",
+ " use_decision_tree_bins=None,\n",
+ " binning_strategy=None,\n",
+ " task=None,\n",
+ " cat_cutoff=None,\n",
+ " treat_all_integers_as_numerical=None,\n",
+ " degree=None,...\n",
+ " monitor='val_loss',\n",
+ " mode='min',\n",
+ " lr=0.0003,\n",
+ " lr_patience=10,\n",
+ " lr_factor=0.1,\n",
+ " weight_decay=1e-06,\n",
+ " optimizer_type='scaledadam',\n",
+ " optimizer_kwargs={'scale': 0.8},\n",
+ " scheduler_type='ReduceLROnPlateau',\n",
+ " scheduler_kwargs=None,\n",
+ " scheduler_monitor=None,\n",
+ " scheduler_interval='epoch',\n",
+ " scheduler_frequency=1,\n",
+ " no_weight_decay_for_bias_and_norm=False,\n",
+ " checkpoint_path='model_checkpoints'))MambularClassifier(model_config=MambularConfig(head_layer_sizes=[], n_layers=3),\n",
+ " preprocessing_config=PreprocessingConfig(numerical_preprocessing='quantile',\n",
+ " categorical_preprocessing=None,\n",
+ " n_bins=None,\n",
+ " feature_preprocessing=None,\n",
+ " use_decision_tree_bins=None,\n",
+ " binning_strategy=None,\n",
+ " task=None,\n",
+ " cat_cutoff=None,\n",
+ " treat_all_integers_as_numerical=None,\n",
+ " degree=None,...\n",
+ " monitor='val_loss',\n",
+ " mode='min',\n",
+ " lr=0.0003,\n",
+ " lr_patience=10,\n",
+ " lr_factor=0.1,\n",
+ " weight_decay=1e-06,\n",
+ " optimizer_type='Adam',\n",
+ " optimizer_kwargs=None,\n",
+ " scheduler_type='warmupconstant',\n",
+ " scheduler_kwargs={'warmup_steps': 200},\n",
+ " scheduler_monitor=None,\n",
+ " scheduler_interval='step',\n",
+ " scheduler_frequency=1,\n",
+ " no_weight_decay_for_bias_and_norm=False,\n",
+ " checkpoint_path='model_checkpoints'))In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. MambularClassifier(model_config=MambularConfig(head_layer_sizes=[], n_layers=3),\n",
+ " preprocessing_config=PreprocessingConfig(numerical_preprocessing='quantile',\n",
+ " categorical_preprocessing=None,\n",
+ " n_bins=None,\n",
+ " feature_preprocessing=None,\n",
+ " use_decision_tree_bins=None,\n",
+ " binning_strategy=None,\n",
+ " task=None,\n",
+ " cat_cutoff=None,\n",
+ " treat_all_integers_as_numerical=None,\n",
+ " degree=None,...\n",
+ " monitor='val_loss',\n",
+ " mode='min',\n",
+ " lr=0.0003,\n",
+ " lr_patience=10,\n",
+ " lr_factor=0.1,\n",
+ " weight_decay=1e-06,\n",
+ " optimizer_type='Adam',\n",
+ " optimizer_kwargs=None,\n",
+ " scheduler_type='warmupconstant',\n",
+ " scheduler_kwargs={'warmup_steps': 200},\n",
+ " scheduler_monitor=None,\n",
+ " scheduler_interval='step',\n",
+ " scheduler_frequency=1,\n",
+ " no_weight_decay_for_bias_and_norm=False,\n",
+ " checkpoint_path='model_checkpoints'))| \n", + " | model | \n", + "accuracy | \n", + "
|---|---|---|
| 0 | \n", + "Trompt (experimental) | \n", + "0.525 | \n", + "
| 1 | \n", + "Mambular (stable) | \n", + "0.400 | \n", + "
| 2 | \n", + "Tangos (experimental) | \n", + "0.335 | \n", + "
| \n", + " | timestamp | \n", + "event | \n", + "run_id | \n", + "
|---|---|---|---|
| 0 | \n", + "2026-06-20T06:22:48 | \n", + "fit.started | \n", + "da675b55 | \n", + "
| 1 | \n", + "2026-06-20T06:22:48 | \n", + "data.created | \n", + "da675b55 | \n", + "
| 2 | \n", + "2026-06-20T06:22:48 | \n", + "model.created | \n", + "da675b55 | \n", + "
| 3 | \n", + "2026-06-20T06:22:48 | \n", + "train.started | \n", + "da675b55 | \n", + "
| 4 | \n", + "2026-06-20T06:22:49 | \n", + "train.completed | \n", + "da675b55 | \n", + "
| 5 | \n", + "2026-06-20T06:22:49 | \n", + "fit.completed | \n", + "da675b55 | \n", + "
FTTransformerRegressor(model_config=FTTransformerConfig(head_layer_sizes=[]),\n", + " preprocessing_config=PreprocessingConfig(numerical_preprocessing='ple',\n", + " categorical_preprocessing='int',\n", + " n_bins=64,\n", + " feature_preprocessing=None,\n", + " use_decision_tree_bins=None,\n", + " binning_strategy=None,\n", + " task=None,\n", + " cat_cutoff=None,\n", + " treat_all_integers_as_numerical=None,\n", + " degree=None,\n", + " scaling_...\n", + " patience=2,\n", + " monitor='val_loss',\n", + " mode='min',\n", + " lr=0.0002,\n", + " lr_patience=10,\n", + " lr_factor=0.1,\n", + " weight_decay=1e-05,\n", + " optimizer_type='AdamW',\n", + " optimizer_kwargs=None,\n", + " scheduler_type='ReduceLROnPlateau',\n", + " scheduler_kwargs=None,\n", + " scheduler_monitor=None,\n", + " scheduler_interval='epoch',\n", + " scheduler_frequency=1,\n", + " no_weight_decay_for_bias_and_norm=False,\n", + " checkpoint_path='model_checkpoints'))In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
FTTransformerRegressor(model_config=FTTransformerConfig(head_layer_sizes=[]),\n", + " preprocessing_config=PreprocessingConfig(numerical_preprocessing='ple',\n", + " categorical_preprocessing='int',\n", + " n_bins=64,\n", + " feature_preprocessing=None,\n", + " use_decision_tree_bins=None,\n", + " binning_strategy=None,\n", + " task=None,\n", + " cat_cutoff=None,\n", + " treat_all_integers_as_numerical=None,\n", + " degree=None,\n", + " scaling_...\n", + " patience=2,\n", + " monitor='val_loss',\n", + " mode='min',\n", + " lr=0.0002,\n", + " lr_patience=10,\n", + " lr_factor=0.1,\n", + " weight_decay=1e-05,\n", + " optimizer_type='AdamW',\n", + " optimizer_kwargs=None,\n", + " scheduler_type='ReduceLROnPlateau',\n", + " scheduler_kwargs=None,\n", + " scheduler_monitor=None,\n", + " scheduler_interval='epoch',\n", + " scheduler_frequency=1,\n", + " no_weight_decay_for_bias_and_norm=False,\n", + " checkpoint_path='model_checkpoints'))
NODELSS(model_config=NODEConfig(depth=5, head_layer_sizes=[], num_layers=3),\n", + " preprocessing_config=PreprocessingConfig(numerical_preprocessing='ple',\n", + " categorical_preprocessing=None,\n", + " n_bins=64,\n", + " feature_preprocessing=None,\n", + " use_decision_tree_bins=None,\n", + " binning_strategy=None,\n", + " task=None,\n", + " cat_cutoff=None,\n", + " treat_all_integers_as_numerical=None,\n", + " degree=None,\n", + " scaling_stra...\n", + " stratify=True,\n", + " patience=2,\n", + " monitor='val_loss',\n", + " mode='min',\n", + " lr=0.001,\n", + " lr_patience=10,\n", + " lr_factor=0.1,\n", + " weight_decay=1e-05,\n", + " optimizer_type='Adam',\n", + " optimizer_kwargs=None,\n", + " scheduler_type='ReduceLROnPlateau',\n", + " scheduler_kwargs=None,\n", + " scheduler_monitor=None,\n", + " scheduler_interval='epoch',\n", + " scheduler_frequency=1,\n", + " no_weight_decay_for_bias_and_norm=False,\n", + " checkpoint_path='model_checkpoints'))In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
NODELSS(model_config=NODEConfig(depth=5, head_layer_sizes=[], num_layers=3),\n", + " preprocessing_config=PreprocessingConfig(numerical_preprocessing='ple',\n", + " categorical_preprocessing=None,\n", + " n_bins=64,\n", + " feature_preprocessing=None,\n", + " use_decision_tree_bins=None,\n", + " binning_strategy=None,\n", + " task=None,\n", + " cat_cutoff=None,\n", + " treat_all_integers_as_numerical=None,\n", + " degree=None,\n", + " scaling_stra...\n", + " stratify=True,\n", + " patience=2,\n", + " monitor='val_loss',\n", + " mode='min',\n", + " lr=0.001,\n", + " lr_patience=10,\n", + " lr_factor=0.1,\n", + " weight_decay=1e-05,\n", + " optimizer_type='Adam',\n", + " optimizer_kwargs=None,\n", + " scheduler_type='ReduceLROnPlateau',\n", + " scheduler_kwargs=None,\n", + " scheduler_monitor=None,\n", + " scheduler_interval='epoch',\n", + " scheduler_frequency=1,\n", + " no_weight_decay_for_bias_and_norm=False,\n", + " checkpoint_path='model_checkpoints'))
NODELSS(model_config=NODEConfig(depth=5, head_layer_sizes=[], num_layers=3),\n", + " preprocessing_config=PreprocessingConfig(numerical_preprocessing='ple',\n", + " categorical_preprocessing=None,\n", + " n_bins=64,\n", + " feature_preprocessing=None,\n", + " use_decision_tree_bins=None,\n", + " binning_strategy=None,\n", + " task=None,\n", + " cat_cutoff=None,\n", + " treat_all_integers_as_numerical=None,\n", + " degree=None,\n", + " scaling_stra...\n", + " stratify=True,\n", + " patience=2,\n", + " monitor='val_loss',\n", + " mode='min',\n", + " lr=0.001,\n", + " lr_patience=10,\n", + " lr_factor=0.1,\n", + " weight_decay=1e-05,\n", + " optimizer_type='Adam',\n", + " optimizer_kwargs=None,\n", + " scheduler_type='ReduceLROnPlateau',\n", + " scheduler_kwargs=None,\n", + " scheduler_monitor=None,\n", + " scheduler_interval='epoch',\n", + " scheduler_frequency=1,\n", + " no_weight_decay_for_bias_and_norm=False,\n", + " checkpoint_path='model_checkpoints'))In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
NODELSS(model_config=NODEConfig(depth=5, head_layer_sizes=[], num_layers=3),\n", + " preprocessing_config=PreprocessingConfig(numerical_preprocessing='ple',\n", + " categorical_preprocessing=None,\n", + " n_bins=64,\n", + " feature_preprocessing=None,\n", + " use_decision_tree_bins=None,\n", + " binning_strategy=None,\n", + " task=None,\n", + " cat_cutoff=None,\n", + " treat_all_integers_as_numerical=None,\n", + " degree=None,\n", + " scaling_stra...\n", + " stratify=True,\n", + " patience=2,\n", + " monitor='val_loss',\n", + " mode='min',\n", + " lr=0.001,\n", + " lr_patience=10,\n", + " lr_factor=0.1,\n", + " weight_decay=1e-05,\n", + " optimizer_type='Adam',\n", + " optimizer_kwargs=None,\n", + " scheduler_type='ReduceLROnPlateau',\n", + " scheduler_kwargs=None,\n", + " scheduler_monitor=None,\n", + " scheduler_interval='epoch',\n", + " scheduler_frequency=1,\n", + " no_weight_decay_for_bias_and_norm=False,\n", + " checkpoint_path='model_checkpoints'))