Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
8b39132
feat: agregar metadata opcional a los converters
constanzaru May 20, 2026
9bbc59f
feat: add task executors and clustering model flow
constanzaru Jun 1, 2026
df6d989
feat: add supervised and unsupervised task contracts
constanzaru Jun 2, 2026
edd227d
feat: add supervised and clustering model
constanzaru Jun 2, 2026
da2b8f4
feat: add sklearn clustering adapters and models
constanzaru Jun 3, 2026
cd4e0d3
fix: update tests for task executors and metadata
constanzaru Jun 3, 2026
243466c
feat: add clustering metrics
constanzaru Jun 3, 2026
856c9c0
fix: restore supervised metrics for image classifiers
constanzaru Jun 3, 2026
17ec4c8
feat: add sklearn clustering models (Agglomerative, GMM, Spectral, HD…
constanzaru Jun 4, 2026
76a0bec
feat: add clustering algorithms from the faiss library
constanzaru Jun 9, 2026
64bd323
feat: add clustering converter with dynamic algorithm selection
constanzaru Jun 18, 2026
361ce0f
feat: expose post-fit metadata per clustering algorithm
constanzaru Jun 18, 2026
02d54b9
feat: allow explorers to access converter reports and move report sto…
constanzaru Jun 21, 2026
b3a5012
feat: add clustering profile explorer and results visualizer
constanzaru Jun 22, 2026
48f5770
feat: add clustering explorers with converter-scope column and algori…
constanzaru Jun 29, 2026
cccdf2c
feat: add dynamic algorithm params form and clustering explorer valid…
constanzaru Jul 1, 2026
5fc5b9d
Merge remote-tracking branch 'origin/develop' into clustering
constanzaru Jul 1, 2026
c0acade
fix: add methods deleted during merge and change inheritance
constanzaru Jul 2, 2026
39a836f
feat: support full-dataset split as a metric option
constanzaru Jul 3, 2026
588bb4f
feat: adapt prepare-dataset step to tasks without target columns or s…
constanzaru Jul 5, 2026
c2b5ebd
feat: disable hyperparameter optimization for clustering models
constanzaru Jul 5, 2026
d67a177
feat: adapt run results and live metrics to clustering sessions
constanzaru Jul 7, 2026
f14c284
feat: add supervised/unsupervised badge to task selection cards
constanzaru Aug 24, 2026
c9d282e
fix: complete missing pt/de/zh translations for clustering components
constanzaru Aug 24, 2026
7cfcf75
fix: clustering scope validation and missing translations
constanzaru Aug 25, 2026
7175286
fix: avoid duplicate cluster column name
constanzaru Aug 25, 2026
c5cfedf
Fixed conflicts, added a temporary flag on model_job. This will need …
cristian-tamblay Aug 31, 2026
6138f59
Fixed develop conflicts again
cristian-tamblay Sep 1, 2026
762948d
fix: keep the model session form working for tasks without a target
cristian-tamblay Sep 1, 2026
4e0b2cc
fix: scale clustering features and report runs that found no clusters
cristian-tamblay Sep 1, 2026
9b77383
fix: make the FAISS model loader static like every other adapter
cristian-tamblay Sep 1, 2026
adbe578
test: cover the clustering models, metrics, task and job path
cristian-tamblay Sep 1, 2026
9a0e8a7
Merge develop into clustering
cristian-tamblay Sep 2, 2026
09e80b1
fix: stop FAISS deadlocking the whole job on macOS
cristian-tamblay Sep 2, 2026
40d7c72
ci: cap the pytest job so a hung test cannot hold a runner all day
cristian-tamblay Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/build-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ jobs:
pytest:
needs: react-build-test
runs-on: ${{ matrix.os }}
# Without this a hung test holds the runner for GitHub's six hour default.
# The suite takes four to nine minutes depending on the platform, so thirty
# leaves plenty of headroom while turning a deadlock into a red job with a
# readable log instead of a silent afternoon of runner time.
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
Expand Down
2 changes: 1 addition & 1 deletion DashAI/back/api/api_v1/schemas/converter_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

class ConverterParams(BaseModel):
order: int = 0
params: Dict[str, Union[str, int, float, bool, None]] = None
params: Dict[str, Any] = None
scope: Dict[str, Union[List[int], List[Dict[str, Any]]]] = None
target: Union[Dict[str, Any], None] = None

Expand Down
39 changes: 39 additions & 0 deletions DashAI/back/converters/base_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,45 @@ def get_metadata(cls) -> Dict[str, Any]:

return meta

def changes_row_count(self) -> bool:
"""Indicate whether this converter changes the number of dataset rows.

Samplers (e.g. SMOTE, RandomUnderSampler) return True because they
add or remove rows. Most transformers return False.

Returns
-------
bool
True if the converter may add or remove rows, False otherwise.
"""
return False

def get_report(self) -> Union[Dict[str, Any], None]:
"""Return the converter report produced after execution, if any.

The report complements the transformed dataset with information that
helps downstream tools (explorers, visualisations) interpret what the
converter did during its pipeline step. Persisted to disk per converter
execution. Optional — converters that produce no supplementary
information return ``None``.

Returns
-------
Dict[str, Any] or None
JSON-serializable report dict, or ``None`` when the converter does
not produce one.
"""
return None

def build_report(self, data: Dict[str, Any]) -> Dict[str, Any]:
"""Wrap converter-specific data with the producer converter name.

Subclasses pass only information that is useful after the conversion
has finished. Configuration parameters are already persisted with the
converter DB row.
"""
return {"converter": self.__class__.__name__, **data}

@abstractmethod
def get_output_type(self, column_name: str = None) -> DashAIDataType:
"""Return the DashAI data type produced by this converter for a given column.
Expand Down
28 changes: 28 additions & 0 deletions DashAI/back/converters/category/clustering.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from typing import Final

from DashAI.back.converters.base_converter import BaseConverter
from DashAI.back.core.utils import MultilingualString
from DashAI.back.static.icons import Icon


class ClusteringConverter(BaseConverter):
"""Base class for converters that assign clusters to dataset rows.

Clustering converters learn an unsupervised grouping from the selected
feature columns and typically enrich the dataset with a new categorical
column containing the cluster label assigned to each row.

Use these converters when you want to discover natural groupings in the
data or create new features based on similarity, without relying on any target
variable.
"""

CATEGORY = MultilingualString(
en="Clustering",
es="Agrupamiento",
pt="Agrupamento",
de="Clustering",
zh="聚类",
)
ICON: Final[str] = Icon.Psychology.value
COLOR: Final[str] = "rgb(72, 149, 239)"
Empty file.
Loading
Loading