Skip to main content
. 2026 Aug 17;16(8):872. doi: 10.3390/brainsci16080872
Algorithm 1: Per-Fold Inductive Cross-Validation for HDGNN-Mamba2
  1. Input: Dataset D with n = 533 subjects, 10-fold stratified split

  2. Output: Mean ± Std of metrics across 10 folds

  3. Partition 533 subjects into 10 stratified folds

  4. for each fold k = 1 to 10 do

  5.   D_train ← 9 folds (~480 subjects), D_test ← 1 fold (~53 subjects)

  6.   D_train_s, D_val ← stratified_split(D_train, ratio=0.9/0.1)

  7.    // ── Stage 1: Preprocessing

  8.   C_age = k-means(D_train_s.age, k=2)

  9.   C_edu= k-means(D_train_s.edu, k=2)

  10.   // Build adjacency matrix: TRAIN nodes only

  11.   A_train←{Samesex(D_train_s.sex),SameCluster(D_train_s.edu,C_edu), SameCluster(D_train_s.age, C_age)}  //S-G-S,S-E-S,S-A-S

  12.   // ── Stage 2: End-to-End Training (HDGNN-Mamba2)

  13.   for epoch = 1 to 100 do

  14.       for each subject s in D_train_s do

  15.           z_s ← Mamba2_GNN({X_s})

  16.       end for

  17.       in_emb_train ← {z_s | s ∈ D_train_s}

  18.       //Dynamic edge update (every Δ epochs, train embeddings only)

  19.       A′_train ← DEU( A_train, sim( in_emb_train ), Δ=10 ) // Dynamic edge update, train only

  20.       Z_train = HGNN( A′_train, {in_emb_train} )    // Population graph, train only

  21.       Z_cache ← Detach(Z_train)        // Training inner subset, detached

  22.       L_cl ← SupervisedcontrastiveLoss(Z_cache, D_train_s.y) // Standard supervised contrastive loss

  23.       L_ce ← CrossEntropy(Z_train, D_train_s.y)

  24.       L ← L_ce + λ·L_cl 

  25.       L.backward(); optimizer.step()

  26.       val_loss, val_acc ← Evaluate(D_val)

  27.        if val_loss not improved for 20 epochs then

  28.           break

  29.        end if

  30.        RestoreBestModelState()

  31.   end for

  32.   //── Stage 3: Test Evaluation

  33.   // Build test adjacency: test nodes connect to train nodes via phenotype

  34.   A_test ←∅

  35.   for each test subject t in D_test do

  36.       z_t ← Mamba2_GNN(X_t)  // Test subject feature

  37.   // Connect test node to top-K train nodes by phenotype similarity

  38.       sim_train ← Similarity(t, D_train_s, [sex, age, edu])

  39.       top_k ← TopK(sim_train, k=5)

  40.       A_test ← A_test ∪ {(t, neighbor) | neighbor ∈ top_k}

  41.   end for

  42.   // Concatenate train and test, forward through HGNN (no grad)

  43.   Z_all ← HGNN_Inference(A_train ⋃A_test, concat(in_emb_train, {z_t}))

  44.   ŷ_test ← argmax(Z_all[n_train_s:])  // Test predictions

  45.     Compute metrics: ACC, SEN, SPE, AUROC, AUPRC

  46. end for

  47. return Mean ± Std of metrics across 10 folds