From 4d31c4858986140a768b46e5a8cc9d76dba20afe Mon Sep 17 00:00:00 2001 From: Achille-V <72287888+Achille-V@users.noreply.github.com> Date: Mon, 13 Jul 2026 10:58:34 -0400 Subject: [PATCH 1/4] Correction methods_config.json --- .../achillev@narval.alliancecan | 32 ---------- .../run_scripts_slurm/methods_config.json | 60 +++++++++---------- 2 files changed, 30 insertions(+), 62 deletions(-) delete mode 100644 task_dFC/run_scripts_slurm/achillev@narval.alliancecan diff --git a/task_dFC/run_scripts_slurm/achillev@narval.alliancecan b/task_dFC/run_scripts_slurm/achillev@narval.alliancecan deleted file mode 100644 index 3247942..0000000 --- a/task_dFC/run_scripts_slurm/achillev@narval.alliancecan +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# -#SBATCH --job-name=assess_dfc_job -#SBATCH --output=logs/dfc_out_%A_%a.txt -#SBATCH --error=logs/dfc_err_%A_%a.txt -#SBATCH --time=24:00:00 -#SBATCH --mem=32G -#SBATCH --requeue - -SUBJECT_LIST="./subj_list.txt" -DATASET_INFO="./dataset_info.json" -METHODS_CONFIG="./methods_config.json" - -echo "Number subjects found: $(cat $SUBJECT_LIST | wc -l)" - -SUBJECT_ID=$(sed -n "${SLURM_ARRAY_TASK_ID}p" $SUBJECT_LIST) -echo "Subject ID: $SUBJECT_ID" - -# ---- Cluster configuration (set these for your system) ---- -VENV_PATH="/home/achillev/projects/def-jbpoline/achillev/pydfc_env/bin/activate" -PYDFC_CODE_DIR="/home/achillev/scratch/Git_repo" -# ----------------------------------------------------------- - -# Activate virtual environment -source "$VENV_PATH" - -python "$PYDFC_CODE_DIR/task_dFC/dFC_assessment.py" \ ---dataset_info $DATASET_INFO \ ---methods_config $METHODS_CONFIG \ ---participant_id $SUBJECT_ID - -deactivate diff --git a/task_dFC/run_scripts_slurm/methods_config.json b/task_dFC/run_scripts_slurm/methods_config.json index ea411eb..25bcb63 100644 --- a/task_dFC/run_scripts_slurm/methods_config.json +++ b/task_dFC/run_scripts_slurm/methods_config.json @@ -47,36 +47,36 @@ "dict_alpha": 0.1 }, "MEASURES_name_lst": [ - "ADAPTIVE_DCC_RANDOM_HYBRID_ENSEMBLE", - "ADAPTIVE_EDGE_KALMAN_HYBRID", - "ADAPTIVE_QUANTUM_RESERVOIR_HYBRID", - "ADAPTIVE_RANDOM_SPARSE_HYBRID", - "ADAPTIVE_ROBUST_DIFFERENTIAL_HYBRID_ENSEMBLE", - "CHANGEPOINT_MULTISCALE_EXP_HYBRID_ENSEMBLE", - "CHANGEPOINT_ROBUST_EXP_HYBRID", - "DCC_CHANGEPOINT_SPARSE_HYBRID", - "DCC_EDGE_EXPONENTIAL_HYBRID", - "DCC_KALMAN_VOLATILITY_HYBRID_ENSEMBLE", - "DIFFERENTIAL_EDGE_KALMAN_HYBRID", - "EDGE_KALMAN_EXP_HYBRID_ENSEMBLE", - "EDGE_RANDOM_RESERVOIR_HYBRID_ENSEMBLE", - "EDGE_STFT_QUANTUM_HYBRID", - "KALMAN_RESERVOIR_MULTISCALE_HYBRID", - "MULTISCALE_DCC_KALMAN_HYBRID", - "QUANTUM_MULTISCALE_KALMAN_HYBRID_ENSEMBLE", - "QUANTUM_RANDOM_EXP_HYBRID", - "RANDOM_FOURIER_KALMAN_HYBRID", - "RESERVOIR_CHANGEPOINT_ROBUST_HYBRID_ENSEMBLE", - "RESERVOIR_EDGE_DCC_HYBRID", - "ROBUST_DIFFERENTIAL_STFT_HYBRID", - "ROBUST_SPARSE_EDGE_HYBRID", - "ROBUST_VOLATILITY_SLIDING_HYBRID_ENSEMBLE", - "SLIDING_VOLATILITY_DCC_HYBRID", - "SPARSE_DCC_EXP_HYBRID_ENSEMBLE", - "STFT_EDGE_ADAPTIVE_HYBRID_ENSEMBLE", - "STFT_EXP_KALMAN_HYBRID", - "STFT_QUANTUM_SPARSE_HYBRID_ENSEMBLE", - "VOLATILITY_ADAPTIVE_EDGE_HYBRID" + "AdaptiveDccRandom_hybrid_ensemble", + "AdaptiveEdgeKalman_hybrid", + "AdaptiveQuantumReservoir_hybrid", + "AdaptiveRandomSparse_hybrid", + "AdaptiveRobustDifferential_hybrid_ensemble", + "ChangepointMultiscaleExp_hybrid_ensemble", + "ChangepointRobustExp_hybrid", + "DccChangepointSparse_hybrid", + "DccEdgeExponential_hybrid", + "DccKalmanVolatility_hybrid_ensemble", + "DifferentialEdgeKalman_hybrid", + "EdgeKalmanExp_hybrid_ensemble", + "EdgeRandomReservoir_hybrid_ensemble", + "EdgeStftQuantum_hybrid", + "KalmanReservoirMultiscale_hybrid", + "MultiscaleDccKalman_hybrid", + "QuantumMultiscaleKalman_hybrid_ensemble", + "QuantumRandomExp_hybrid", + "RandomFourierKalman_hybrid", + "ReservoirChangepointRobust_hybrid_ensemble", + "ReservoirEdgeDcc_hybrid", + "RobustDifferentialStft_hybrid", + "RobustSparseEdge_hybrid", + "RobustVolatilitySliding_hybrid_ensemble", + "SlidingVolatilityDcc_hybrid", + "SparseDccExp_hybrid_ensemble", + "StftEdgeAdaptive_hybrid_ensemble", + "StftExpKalman_hybrid", + "StftQuantumSparse_hybrid_ensemble", + "VolatilityAdaptiveEdge_hybrid" ], "alter_hparams": [], "params_multi_analysis": { From 4717568bfbbb4bd115473710f10e487a2577540e Mon Sep 17 00:00:00 2001 From: Achille-V <72287888+Achille-V@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:55:25 -0400 Subject: [PATCH 2/4] Lower memory request for run_ML.sh --- task_dFC/run_scripts_slurm/run_ML.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task_dFC/run_scripts_slurm/run_ML.sh b/task_dFC/run_scripts_slurm/run_ML.sh index b16c2a2..f6ed500 100644 --- a/task_dFC/run_scripts_slurm/run_ML.sh +++ b/task_dFC/run_scripts_slurm/run_ML.sh @@ -4,7 +4,7 @@ #SBATCH --output=logs/ML_out_%A_%a.txt # %A = array job ID, %a = task ID #SBATCH --error=logs/ML_err_%A_%a.txt #SBATCH --time=24:00:00 -#SBATCH --mem=128G +#SBATCH --mem=64G #SBATCH --requeue DATASET_INFO="./dataset_info.json" From ed4544b3cbe15902fa5a6adf46591599e3fc5433 Mon Sep 17 00:00:00 2001 From: Achille-V <72287888+Achille-V@users.noreply.github.com> Date: Thu, 16 Jul 2026 15:52:39 -0400 Subject: [PATCH 3/4] Added separation for hybrid methods in multi_dataset_analysis --- task_dFC/multi_dataset_analysis/ml_results.py | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/task_dFC/multi_dataset_analysis/ml_results.py b/task_dFC/multi_dataset_analysis/ml_results.py index 61e0aca..636d09e 100644 --- a/task_dFC/multi_dataset_analysis/ml_results.py +++ b/task_dFC/multi_dataset_analysis/ml_results.py @@ -56,9 +56,47 @@ "DiscreteHMM", ] ) + +HYBRID_METHODS = frozenset( + [ + "AdaptiveDccRandom_hybrid_ensemble", + "AdaptiveEdgeKalman_hybrid", + "AdaptiveQuantumReservoir_hybrid", + "AdaptiveRandomSparse_hybrid", + "AdaptiveRobustDifferential_hybrid_ensemble", + "ChangepointMultiscaleExp_hybrid_ensemble", + "ChangepointRobustExp_hybrid", + "DccChangepointSparse_hybrid", + "DccEdgeExponential_hybrid", + "DccKalmanVolatility_hybrid_ensemble", + "DifferentialEdgeKalman_hybrid", + "EdgeKalmanExp_hybrid_ensemble", + "EdgeRandomReservoir_hybrid_ensemble", + "EdgeStftQuantum_hybrid", + "KalmanReservoirMultiscale_hybrid", + "MultiscaleDccKalman_hybrid", + "QuantumMultiscaleKalman_hybrid_ensemble", + "QuantumRandomExp_hybrid", + "RandomFourierKalman_hybrid", + "ReservoirChangepointRobust_hybrid_ensemble", + "ReservoirEdgeDcc_hybrid", + "RobustDifferentialStft_hybrid", + "RobustSparseEdge_hybrid", + "RobustVolatilitySliding_hybrid_ensemble", + "SlidingVolatilityDcc_hybrid", + "SparseDccExp_hybrid_ensemble", + "StftEdgeAdaptive_hybrid_ensemble", + "StftExpKalman_hybrid", + "StftQuantumSparse_hybrid_ensemble", + "VolatilityAdaptiveEdge_hybrid" + ] +) + _AIGM_COLOR = "#0077B6" +_HYBRID_COLOR = "#1A759F" _NON_AIGM_COLOR = "#E63946" _NON_AIGM_LABEL_COLOR = "#D4721A" +_HYBRID_LABEL_COLOR = "#1A759F" _METRIC_SHORT = { "Logistic regression balanced accuracy": "LogReg BA", "SVM balanced accuracy": "SVM BA", @@ -487,6 +525,9 @@ def _highlight_nonaigm_labels(ax): for label in ax.get_yticklabels(): if label.get_text() in NON_AIGM_METHODS: label.set_color(_NON_AIGM_LABEL_COLOR) + for label in ax.get_yticklabels(): + if label.get_text() in HYBRID_METHODS: + label.set_color(_HYBRID_LABEL_COLOR) def _build_experiment_legend( @@ -922,13 +963,14 @@ def plot_aigm_comparison( df_best = df_best.copy() df_best["group"] = df_best["dFC method"].apply( - lambda m: "Non-AIGM" if m in NON_AIGM_METHODS else "AIGM" + lambda m: "Non-AIGM" if m in NON_AIGM_METHODS else "Hybrid" if m in HYBRID_METHODS else "AIGM" ) - group_order = ["AIGM", "Non-AIGM"] + group_order = ["AIGM", "Non-AIGM", "Hybrid"] n_aigm = df_best[df_best["group"] == "AIGM"]["dFC method"].nunique() n_non_aigm = df_best[df_best["group"] == "Non-AIGM"]["dFC method"].nunique() - group_labels = [f"AIGM\n(n={n_aigm} methods)", f"Non-AIGM\n(n={n_non_aigm} methods)"] + n_hybrid = df_best[df_best["group"] == "Hybrid"]["dFC method"].nunique() + group_labels = [f"AIGM\n(n={n_aigm} methods)", f"Non-AIGM\n(n={n_non_aigm} methods)", f"Hybrid\n(n={n_hybrid} methods)"] df_best["group_label"] = df_best["group"].map(dict(zip(group_order, group_labels))) fig, ax = plt.subplots(figsize=(9, 4)) @@ -953,7 +995,7 @@ def plot_aigm_comparison( # One point per (method × experiment), colored by group rng = np.random.default_rng(42) - group_colors = {"AIGM": _AIGM_COLOR, "Non-AIGM": _NON_AIGM_COLOR} + group_colors = {"AIGM": _AIGM_COLOR, "Non-AIGM": _NON_AIGM_COLOR, "Hybrid": _HYBRID_COLOR} for i, (group, label) in enumerate(zip(group_order, group_labels)): vals = df_best[df_best["group"] == group]["score"].dropna().values y_jit = i + rng.uniform(-0.18, 0.18, len(vals)) @@ -970,7 +1012,8 @@ def plot_aigm_comparison( # Mann-Whitney p-value aigm_vals = df_best[df_best["group"] == "AIGM"]["score"].dropna().values non_aigm_vals = df_best[df_best["group"] == "Non-AIGM"]["score"].dropna().values - if len(aigm_vals) >= 2 and len(non_aigm_vals) >= 2: + hybrid_vals = df_best[df_best["group"] == "Hybrid"]["score"].dropna().values + if len(aigm_vals) >= 2 and len(non_aigm_vals) >= 2: #Ajouter version pour p-value AIGM vs Hybrid _, pval = mannwhitneyu(aigm_vals, non_aigm_vals, alternative="two-sided") pstr = "p<0.001" if pval < 0.001 else f"p={pval:.3f}" ax.text( From 9433063f74c76a74d2099ad06aa452bfb815ffc0 Mon Sep 17 00:00:00 2001 From: Achille-V <72287888+Achille-V@users.noreply.github.com> Date: Fri, 17 Jul 2026 16:49:40 -0400 Subject: [PATCH 4/4] Adding hybrid set to ml_results.py --- task_dFC/multi_dataset_analysis/ml_results.py | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/task_dFC/multi_dataset_analysis/ml_results.py b/task_dFC/multi_dataset_analysis/ml_results.py index 636d09e..750450a 100644 --- a/task_dFC/multi_dataset_analysis/ml_results.py +++ b/task_dFC/multi_dataset_analysis/ml_results.py @@ -93,10 +93,10 @@ ) _AIGM_COLOR = "#0077B6" -_HYBRID_COLOR = "#1A759F" +_HYBRID_COLOR = "#30AC30" _NON_AIGM_COLOR = "#E63946" _NON_AIGM_LABEL_COLOR = "#D4721A" -_HYBRID_LABEL_COLOR = "#1A759F" +_HYBRID_LABEL_COLOR = "#30AC30" _METRIC_SHORT = { "Logistic regression balanced accuracy": "LogReg BA", "SVM balanced accuracy": "SVM BA", @@ -966,11 +966,11 @@ def plot_aigm_comparison( lambda m: "Non-AIGM" if m in NON_AIGM_METHODS else "Hybrid" if m in HYBRID_METHODS else "AIGM" ) - group_order = ["AIGM", "Non-AIGM", "Hybrid"] + group_order = ["Hybrid","AIGM", "Non-AIGM"] n_aigm = df_best[df_best["group"] == "AIGM"]["dFC method"].nunique() n_non_aigm = df_best[df_best["group"] == "Non-AIGM"]["dFC method"].nunique() n_hybrid = df_best[df_best["group"] == "Hybrid"]["dFC method"].nunique() - group_labels = [f"AIGM\n(n={n_aigm} methods)", f"Non-AIGM\n(n={n_non_aigm} methods)", f"Hybrid\n(n={n_hybrid} methods)"] + group_labels = [f"Hybrid\n(n={n_hybrid} methods)",f"AIGM\n(n={n_aigm} methods)", f"Non-AIGM\n(n={n_non_aigm} methods)"] df_best["group_label"] = df_best["group"].map(dict(zip(group_order, group_labels))) fig, ax = plt.subplots(figsize=(9, 4)) @@ -1013,7 +1013,8 @@ def plot_aigm_comparison( aigm_vals = df_best[df_best["group"] == "AIGM"]["score"].dropna().values non_aigm_vals = df_best[df_best["group"] == "Non-AIGM"]["score"].dropna().values hybrid_vals = df_best[df_best["group"] == "Hybrid"]["score"].dropna().values - if len(aigm_vals) >= 2 and len(non_aigm_vals) >= 2: #Ajouter version pour p-value AIGM vs Hybrid + #Ajouter version pour p-value AIGM vs Hybrid + if len(aigm_vals) >= 2 and len(non_aigm_vals) >= 2: _, pval = mannwhitneyu(aigm_vals, non_aigm_vals, alternative="two-sided") pstr = "p<0.001" if pval < 0.001 else f"p={pval:.3f}" ax.text( @@ -1027,6 +1028,20 @@ def plot_aigm_comparison( fontweight="bold", bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="#BBBBBB", alpha=0.9), ) + if len(aigm_vals) >= 2 and len(hybrid_vals) >= 2: + _, pval = mannwhitneyu(aigm_vals, hybrid_vals, alternative="two-sided") + pstr = "p<0.001" if pval < 0.001 else f"p={pval:.3f}" + ax.text( + 0.97, + 0.03, + pstr, + transform=ax.transAxes, + ha="right", + va="top", + fontsize=11, + fontweight="bold", + bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="#BBBBBB", alpha=0.9), + ) lower, upper = get_pointplot_limits(metric) if metric == "SI":