diff --git a/2026_tdl_challenge/outputs/2026-07-20_23-26-18_merged/results.json b/2026_tdl_challenge/outputs/2026-07-20_23-26-18_merged/results.json new file mode 100644 index 000000000..04e9c8e1e --- /dev/null +++ b/2026_tdl_challenge/outputs/2026-07-20_23-26-18_merged/results.json @@ -0,0 +1,5272 @@ +{ + "metadata": { + "study_id": "2026-07-20_23-26-18_merged", + "model_config": "combinatorial/smcn", + "generated_at_utc": "2026-07-24T11:09:49.048977+00:00", + "n_runs": 72, + "train_seeds": [ + 42, + 43, + 44 + ], + "heatmap_note": "Cells show mean \u00b1 std over train_seeds (in-distribution test)." + }, + "results": [ + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_lo__d_lo__pl_lo", + "test_loss": 2.280086040496826, + "test_best_rerun_accuracy": 0.31488272547721863, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.31843534111976624, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2902437150478363, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3114447295665741, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2750401198863983, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.28203070163726807, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.26747649908065796, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.265642911195755, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2549087107181549, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.254221111536026, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.25425928831100464, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.23710750043392181, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__00__h_lo__d_lo__pl_lo__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_lo__d_lo__pl_lo", + "test_loss": 2.272982358932495, + "test_best_rerun_accuracy": 0.3110245168209076, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.31423333287239075, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.28581252694129944, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.31083351373672485, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.26816409826278687, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2788601219654083, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2612498998641968, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2617083191871643, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24894949793815613, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.24532049894332886, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24787989258766174, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2355794906616211, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__00__h_lo__d_lo__pl_lo__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_lo__d_lo__pl_lo", + "test_loss": 2.268031120300293, + "test_best_rerun_accuracy": 0.3148445188999176, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.31557032465934753, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.28787532448768616, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.31136831641197205, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2690044939517975, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2784399092197418, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2562839090824127, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2565130889415741, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.25208190083503723, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2460463047027588, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24910229444503784, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.23729848861694336, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__00__h_lo__d_lo__pl_lo__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_lo__d_lo__pl_hi", + "test_loss": 2.1869924068450928, + "test_best_rerun_accuracy": 0.3208419382572174, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3139277398586273, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2887539267539978, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3123997151851654, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2682023048400879, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.27847811579704285, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.25918710231781006, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.26040950417518616, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2468867003917694, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2457789033651352, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24050728976726532, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2306898981332779, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__01__h_lo__d_lo__pl_hi__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_lo__d_lo__pl_hi", + "test_loss": 2.1873233318328857, + "test_best_rerun_accuracy": 0.3203071355819702, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3160669207572937, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2856215238571167, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.310184121131897, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2652226984500885, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.28023532032966614, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2570478916168213, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2589578926563263, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24749790132045746, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.24344870448112488, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2379096895456314, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.22427229583263397, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__01__h_lo__d_lo__pl_hi__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_lo__d_lo__pl_hi", + "test_loss": 2.188967704772949, + "test_best_rerun_accuracy": 0.32049813866615295, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3139277398586273, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2901291251182556, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.31152111291885376, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.26759111881256104, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.27863091230392456, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.258041113615036, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.25823211669921875, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2467339038848877, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.24558790028095245, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.241424098610878, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.23431889712810516, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__01__h_lo__d_lo__pl_hi__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_lo__d_hi__pl_lo", + "test_loss": 2.3012638092041016, + "test_best_rerun_accuracy": 0.3016655147075653, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3020857274532318, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2978837192058563, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3103751242160797, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.26025670766830444, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2546030879020691, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.27274811267852783, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.26354190707206726, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.23943769931793213, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.234357088804245, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24352510273456573, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.24776530265808105, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__02__h_lo__d_hi__pl_lo__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_lo__d_hi__pl_lo", + "test_loss": 2.312134027481079, + "test_best_rerun_accuracy": 0.29857131838798523, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.29860952496528625, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.294216513633728, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3031553328037262, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2597601115703583, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2567805051803589, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2738941013813019, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2664451003074646, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.23959049582481384, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2349300980567932, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24425089359283447, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2516235113143921, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__02__h_lo__d_hi__pl_lo__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_lo__d_hi__pl_lo", + "test_loss": 2.318045139312744, + "test_best_rerun_accuracy": 0.3042631149291992, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.30116891860961914, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2970433235168457, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.30827412009239197, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.26147910952568054, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2584612965583801, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.27492550015449524, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.27060890197753906, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24260829389095306, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.23550309240818024, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24856750667095184, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.25127971172332764, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__02__h_lo__d_hi__pl_lo__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_lo__d_hi__pl_hi", + "test_loss": 2.3176660537719727, + "test_best_rerun_accuracy": 0.30770111083984375, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.30514171719551086, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3075101375579834, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2842845022678375, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.25265491008758545, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.25891971588134766, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2495989054441452, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2516235113143921, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.23202688992023468, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.22725188732147217, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.22874169051647186, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2275574952363968, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__03__h_lo__d_hi__pl_hi__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_lo__d_hi__pl_hi", + "test_loss": 2.2984578609466553, + "test_best_rerun_accuracy": 0.30945831537246704, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3038047254085541, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.30510351061820984, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2823745012283325, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.25154709815979004, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2566277086734772, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2470013052225113, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2510887086391449, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.22591489553451538, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.22572389245033264, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2294674962759018, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.221598282456398, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__03__h_lo__d_hi__pl_hi__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_lo__d_hi__pl_hi", + "test_loss": 2.3077385425567627, + "test_best_rerun_accuracy": 0.3096875250339508, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3050271272659302, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3043777346611023, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2820689082145691, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24963709712028503, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.25956910848617554, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24371609091758728, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2418442964553833, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2285124957561493, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.22465428709983826, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.23049889504909515, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.217243492603302, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__03__h_lo__d_hi__pl_hi__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_mid__d_lo__pl_lo", + "test_loss": 2.2231574058532715, + "test_best_rerun_accuracy": 0.330048143863678, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24952250719070435, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.24948430061340332, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2320650964975357, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2520436942577362, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3154939115047455, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.31625792384147644, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3281763195991516, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3821529448032379, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3689357340335846, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3831843435764313, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.38345175981521606, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__04__h_mid__d_lo__pl_lo__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_mid__d_lo__pl_lo", + "test_loss": 2.2273242473602295, + "test_best_rerun_accuracy": 0.33394452929496765, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2563984990119934, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2562839090824127, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.23821529746055603, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.26105889678001404, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3251967430114746, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.310184121131897, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3222171366214752, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3800901472568512, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3730231523513794, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3831079602241516, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3753533363342285, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__04__h_mid__d_lo__pl_lo__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_mid__d_lo__pl_lo", + "test_loss": 2.214012861251831, + "test_best_rerun_accuracy": 0.33875772356987, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2636183202266693, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2640385031700134, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2448239028453827, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.26514631509780884, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3310031294822693, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3232485353946686, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.32458552718162537, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.38517075777053833, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3800901472568512, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.38941094279289246, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.37688136100769043, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__04__h_mid__d_lo__pl_lo__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_mid__d_lo__pl_hi", + "test_loss": 2.1789047718048096, + "test_best_rerun_accuracy": 0.3329513370990753, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.26201391220092773, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2662159204483032, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24054549634456635, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.26690351963043213, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.33474674820899963, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.31465351581573486, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.32118573784828186, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.38734814524650574, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3793261647224426, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.37279394268989563, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3590037524700165, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__05__h_mid__d_lo__pl_hi__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_mid__d_lo__pl_hi", + "test_loss": 2.1886661052703857, + "test_best_rerun_accuracy": 0.3288639187812805, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.25280770659446716, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2552907168865204, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.23004049062728882, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2556726932525635, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3269157409667969, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.30147451162338257, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3145771324634552, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3825731575489044, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3742455542087555, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3718389570713043, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3542669415473938, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__05__h_mid__d_lo__pl_hi__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_mid__d_lo__pl_hi", + "test_loss": 2.1879959106445312, + "test_best_rerun_accuracy": 0.33352434635162354, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.25903430581092834, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.26178470253944397, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.23473909497261047, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.26056230068206787, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.32947513461112976, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.30296432971954346, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3145771324634552, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3836427628993988, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.37707236409187317, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3777981400489807, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.35212773084640503, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__05__h_mid__d_lo__pl_hi__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_mid__d_hi__pl_lo", + "test_loss": 2.17061185836792, + "test_best_rerun_accuracy": 0.3489953279495239, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24371609091758728, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.24467109143733978, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24512949585914612, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.25234928727149963, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3293987214565277, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3127817213535309, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3597295582294464, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.38983115553855896, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3786385655403137, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.41523417830467224, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.4390709698200226, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__06__h_mid__d_hi__pl_lo__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_mid__d_hi__pl_lo", + "test_loss": 2.1732497215270996, + "test_best_rerun_accuracy": 0.3470853269100189, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24314309656620026, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2418442964553833, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.24218809604644775, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.25456491112709045, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3297043442726135, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3144243359565735, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3570937514305115, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.38914355635643005, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.37733975052833557, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.414622962474823, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.43479257822036743, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__06__h_mid__d_hi__pl_lo__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_mid__d_hi__pl_lo", + "test_loss": 2.1903185844421387, + "test_best_rerun_accuracy": 0.34700894355773926, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.24803270399570465, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.24512949585914612, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2423790991306305, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.25823211669921875, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3271067440509796, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3154939115047455, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.35854533314704895, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3806249499320984, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.37783634662628174, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.41126134991645813, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.43548017740249634, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__06__h_mid__d_hi__pl_lo__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_mid__d_hi__pl_hi", + "test_loss": 2.1282899379730225, + "test_best_rerun_accuracy": 0.3595767319202423, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2245778888463974, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.22541828453540802, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.22194208204746246, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.23909389972686768, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3212621212005615, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3138895332813263, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.333027720451355, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3949499726295471, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.38967835903167725, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.42638856172561646, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.4799067974090576, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__07__h_mid__d_hi__pl_hi__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_mid__d_hi__pl_hi", + "test_loss": 2.1215081214904785, + "test_best_rerun_accuracy": 0.36034074425697327, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.21754908561706543, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.21701428294181824, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.21353808045387268, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2315302938222885, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3203835189342499, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3094201385974884, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.33134692907333374, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.39197036623954773, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3883795440196991, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.42218658328056335, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.4726869761943817, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__07__h_mid__d_hi__pl_hi__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_mid__d_hi__pl_hi", + "test_loss": 2.1090598106384277, + "test_best_rerun_accuracy": 0.3680189549922943, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.22969669103622437, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2321796864271164, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2252654880285263, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.24467109143733978, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3326457440853119, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.32183513045310974, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3397127389907837, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.40003055334091187, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.395637571811676, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.4269997775554657, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.48277178406715393, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__07__h_mid__d_hi__pl_hi__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_hi__d_lo__pl_lo", + "test_loss": 1.9756443500518799, + "test_best_rerun_accuracy": 0.408892959356308, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2146458923816681, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.21686148643493652, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.20058828592300415, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.22835968434810638, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.32863473892211914, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3193139135837555, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.31706011295318604, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3397509455680847, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.40369775891304016, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.4302849769592285, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.43181297183036804, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__08__h_hi__d_lo__pl_lo__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_hi__d_lo__pl_lo", + "test_loss": 1.9812650680541992, + "test_best_rerun_accuracy": 0.4097333550453186, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.21529528498649597, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.21667048335075378, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.19818167388439178, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.23007869720458984, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3297043442726135, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3229811191558838, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3105279207229614, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3355107307434082, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.40492016077041626, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.42871877551078796, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.42478418350219727, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__08__h_hi__d_lo__pl_lo__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_hi__d_lo__pl_lo", + "test_loss": 1.977277398109436, + "test_best_rerun_accuracy": 0.4151577651500702, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.221025288105011, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.22446328401565552, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.2073114812374115, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.23554129898548126, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3270685374736786, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.32863473892211914, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.31518831849098206, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3428451418876648, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.40518754720687866, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.4297501742839813, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.42787837982177734, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__08__h_hi__d_lo__pl_lo__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_hi__d_lo__pl_hi", + "test_loss": 1.977097749710083, + "test_best_rerun_accuracy": 0.40900754928588867, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.20788449048995972, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2130414843559265, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.20085568726062775, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.22629688680171967, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3232485353946686, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3193521201610565, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3077393174171448, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.33703872561454773, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.41160517930984497, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.43643516302108765, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.44609978795051575, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__09__h_hi__d_lo__pl_hi__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_hi__d_lo__pl_hi", + "test_loss": 1.9709720611572266, + "test_best_rerun_accuracy": 0.4125983715057373, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.21094048023223877, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.21510428190231323, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.19818167388439178, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.22835968434810638, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3263809382915497, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.321682333946228, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3088853359222412, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3429979383945465, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.41171976923942566, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.44025516510009766, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.436396986246109, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__09__h_hi__d_lo__pl_hi__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_hi__d_lo__pl_hi", + "test_loss": 1.9767389297485352, + "test_best_rerun_accuracy": 0.40923675894737244, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.2067766785621643, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.21204829216003418, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.1983344852924347, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.22721369564533234, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3209565281867981, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.32187333703041077, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3050271272659302, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3284437358379364, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.40980976819992065, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.4409809708595276, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.4276491701602936, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__09__h_hi__d_lo__pl_hi__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_hi__d_hi__pl_lo", + "test_loss": 1.8479543924331665, + "test_best_rerun_accuracy": 0.46267858147621155, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.1836656779050827, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.1876002699136734, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.18381847441196442, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.20792268216609955, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.30579110980033875, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.3065169155597687, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3240889310836792, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.35216593742370605, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.40843456983566284, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.40885475277900696, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.503858208656311, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__10__h_hi__d_hi__pl_lo__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_hi__d_hi__pl_lo", + "test_loss": 1.8446677923202515, + "test_best_rerun_accuracy": 0.4671097993850708, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.18771487474441528, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.18931928277015686, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.18416227400302887, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.20815187692642212, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.313240110874176, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.31217053532600403, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3204217255115509, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3561387360095978, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.4125983715057373, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.4139353632926941, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.5071052312850952, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-23_prefix_1_32__community_detection__10__h_hi__d_hi__pl_lo__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_hi__d_hi__pl_lo", + "test_loss": 1.8433395624160767, + "test_best_rerun_accuracy": 0.4679119884967804, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.18763847649097443, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.1901978701353073, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.18893727660179138, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.2107112854719162, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.31641072034835815, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.31285813450813293, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3246237337589264, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3592711389064789, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.41359156370162964, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.41362977027893066, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.5052334070205688, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__community_detection__10__h_hi__d_hi__pl_lo__s44" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_hi__d_hi__pl_hi", + "test_loss": 1.6487066745758057, + "test_best_rerun_accuracy": 0.51982581615448, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.1741538643836975, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.17698067426681519, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.17751547694206238, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.19321568310260773, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.29669952392578125, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.2913133203983307, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.30678433179855347, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.35487812757492065, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.3991137742996216, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.399381160736084, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.45129498839378357, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__community_detection__11__h_hi__d_hi__pl_hi__s42" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_hi__d_hi__pl_hi", + "test_loss": 1.6262810230255127, + "test_best_rerun_accuracy": 0.5318970084190369, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.17839406430721283, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.18240506947040558, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.18030406534671783, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.20032088458538055, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.30823591351509094, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.30567651987075806, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.31694552302360535, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3685537576675415, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.4113759696483612, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.4135151505470276, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.462984174489975, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__community_detection__11__h_hi__d_hi__pl_hi__s43" + }, + { + "experiment": "community_detection", + "wandb_project": "challenge_community_detection", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_hi__d_hi__pl_hi", + "test_loss": 1.6192649602890015, + "test_best_rerun_accuracy": 0.5328519940376282, + "test_best_rerun_mse": null, + "test_triangles_total_structural": null, + "test_mse_by_total_triangles": null, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.1810680776834488, + "test_best_rerun_mse": null + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.18702727556228638, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.182175874710083, + "test_best_rerun_mse": null + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.20738787949085236, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.31140652298927307, + "test_best_rerun_mse": null + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.30880892276763916, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.3171747326850891, + "test_best_rerun_mse": null + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": 0.3718389570713043, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": 0.4121781587600708, + "test_best_rerun_mse": null + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": 0.4161127805709839, + "test_best_rerun_mse": null + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": 0.4637099802494049, + "test_best_rerun_mse": null + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__community_detection__11__h_hi__d_hi__pl_hi__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_lo__d_lo__pl_lo", + "test_loss": 23.904645919799805, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 23.524139404296875, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.016948227236525126, + "ood_test": { + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5.431811332702637, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.02858848069843493 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6175.3056640625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.4683584121397421 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 74.68074035644531, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.02517045512519222 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6183.78857421875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8261574581454576 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 93.57080078125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.08080380032923143 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 157522.953125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.6578802044631247 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11392.73046875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.7988171693135605 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 42512.21484375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.1791078396509302 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2729.97509765625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.48532890625 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 730568.75, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.264071920636178 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 239657.125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.9881038556903468 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__00__h_lo__d_lo__pl_lo__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_lo__d_lo__pl_lo", + "test_loss": 21.24130630493164, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 21.31817626953125, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.015358916620699747, + "ood_test": { + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4.408534526824951, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.02320281329907869 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7084.205078125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.5372927628460371 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 74.80146026611328, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.025211142657941787 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6279.25244140625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8389114818178023 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 102.38488006591797, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.08841526775986008 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 160074.453125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.7171292291705367 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 12100.001953125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.8484084948201515 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 42814.6015625, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.1946076970885233 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2822.394775390625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.5017590711805555 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 733483.5, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.297043086773073 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 243849.8125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 4.0578738372189775 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__00__h_lo__d_lo__pl_lo__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_lo__d_lo__pl_lo", + "test_loss": 19.373271942138672, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 18.599016189575195, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.013399867571740054, + "ood_test": { + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5.432240962982178, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.028590741910432513 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6701.03369140625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.5082316034437808 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 60.31867218017578, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.0203298524368641 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6005.0908203125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8022833427271209 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 91.97433471679688, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.07942515951364151 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 157824.09375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.6648730668307636 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11596.845703125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.8131289933477072 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 42055.125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.1556781485468246 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2669.74658203125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.47462161458333335 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 729248.75, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.249140300668529 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 240491.125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 4.001982344033415 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__00__h_lo__d_lo__pl_lo__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_lo__d_lo__pl_hi", + "test_loss": 2.8004636764526367, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2.7688214778900146, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.014572744620473761, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 34.7624397277832, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.025044985394656487 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 8447.2880859375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.6406741058731513 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 86.33196258544922, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.029097392175749654 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6580.4150390625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8791469658066132 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 104.48129272460938, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.09022564138567303 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 163616.34375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.7993763642485603 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 12454.5263671875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.8732664680400715 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 43745.08984375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.242303031613614 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2984.1376953125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.5305133680555556 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 741419.75, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.386816623870232 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 247969.046875, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 4.126421494600037 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__01__h_lo__d_lo__pl_hi__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_lo__d_lo__pl_hi", + "test_loss": 2.7509922981262207, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2.687103271484375, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.014142648797286184, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 24.916643142700195, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.01795147200482723 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7529.66064453125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.5710777887395715 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 73.30888366699219, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.024708083473876707 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6443.77978515625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8608924228665664 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 99.29225158691406, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.08574460413377726 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 162034.34375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.7626403434423183 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 12274.60546875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.8606510635780396 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 43367.20703125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.2229333656901944 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2898.1123046875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.5152199652777778 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 737397.25, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.341314774385484 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 245737.8125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 4.08929180603398 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__01__h_lo__d_lo__pl_hi__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_1-2.5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_lo__d_lo__pl_hi", + "test_loss": 2.3769943714141846, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2.4156999588012695, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.012714210309480367, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 47.412559509277344, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.03415890454558886 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9185.9794921875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.6966992409698521 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 91.2320556640625, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.030748923378517864 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6801.35595703125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.9086647905185371 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 106.66870880126953, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.09211460172821204 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 166245.515625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.860429027145644 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 13049.1220703125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.9149573741629855 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 44160.359375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.2635890806807115 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 3088.3310546875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.5490366319444444 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 743410.0, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.409330000113119 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 251438.453125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 4.184155444477726 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__01__h_lo__d_lo__pl_hi__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_lo__d_hi__pl_lo", + "test_loss": 1825.2958984375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 1887.1043701171875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.14312509443437144, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 140.55911254882812, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.10126737215333438 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 26.00523567199707, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.13686966143156354 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 292.9267578125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.09872826350269633 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5308.8388671875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.7092637097110889 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 123.69476318359375, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.10681758478721394 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 132362.53125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.073623705415196 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7941.08154296875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.5567999960011745 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 39465.4921875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.022937730662771 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2514.264404296875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4469803385416667 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 706088.3125, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.987153292309085 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 206350.453125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.4338517485397633 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__02__h_lo__d_hi__pl_lo__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_lo__d_hi__pl_lo", + "test_loss": 1737.7515869140625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 1772.87060546875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.13446117599307925, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 89.46334075927734, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.06445485645481076 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 18.867517471313477, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.09930272353322882 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 311.20733642578125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.10488956401273382 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5483.56787109375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.732607598008517 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 116.8212661743164, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.10088192243032505 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 133703.421875, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.1047608646433216 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7948.48095703125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.5573188162271245 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 39704.39453125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.03518348102158 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2508.59423828125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4459723090277778 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 710940.6875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.04204254946099 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 207883.375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.4593609072604132 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__02__h_lo__d_hi__pl_lo__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_lo__d_hi__pl_lo", + "test_loss": 2059.203125, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2086.74267578125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.15826641454541146, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 198.4422149658203, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.14296989550851608 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 70.85696411132812, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.3729313900596217 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 528.5074462890625, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.17812856295553167 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5318.25634765625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.7105218901344356 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 175.2479705810547, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.15133676215980543 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 131414.234375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.0516030646247447 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 8141.19921875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.5708315256450708 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 38958.21484375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.996935508931775 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2513.39794921875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.44682630208333335 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 705594.9375, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.981572316550343 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 204804.59375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.4081272985206263 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__02__h_lo__d_hi__pl_lo__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_lo__d_hi__pl_hi", + "test_loss": 24.6022891998291, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 25.771020889282227, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.008685885031776955, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 46.04213333129883, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.03317156580064757 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 49.440155029296875, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.26021134225945725 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6250.11767578125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.4740324365401024 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5970.31396484375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.79763713625167 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 104.14414978027344, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.08993449894669554 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 157221.8125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.6508873420954857 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11082.1533203125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.7770406198508274 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 41526.9453125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.128604506253524 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2659.718505859375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4728388454861111 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 727540.0625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.229811912491657 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 238530.34375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.9693532316575975 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__03__h_lo__d_hi__pl_hi__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_lo__d_hi__pl_hi", + "test_loss": 24.076908111572266, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 25.344966888427734, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.008542287458182586, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 47.65872573852539, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.03433625773668976 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 56.0749397277832, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.29513126172517473 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7319.52490234375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.5551403035528062 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6017.31689453125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8039167527763861 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 106.05200958251953, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.09158204627160581 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 160029.515625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.7160857241547465 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11699.79296875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.8203472843044454 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 41713.71484375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.1381780123917165 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2676.739013671875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.47586471354166665 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 728586.375, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.241647625080597 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 242614.671875, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 4.037320018554574 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__03__h_lo__d_hi__pl_hi__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0-0.1__deg_4-5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_lo", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_lo__d_hi__pl_hi", + "test_loss": 30.406997680664062, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 28.670312881469727, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.009663064671880595, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 45.750877380371094, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.03296172721928753 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 50.2380485534668, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.26441078186035155 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6598.5234375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.5004568401592719 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6015.71142578125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8037022612934202 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 100.38771057128906, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.08669059634826344 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 158432.25, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.6789952164220696 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11287.2734375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.791422902643388 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 41666.265625, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.135745841662822 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2693.863037109375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.478908984375 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 728194.25, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.237211972444374 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 239686.234375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.988588261111943 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__03__h_lo__d_hi__pl_hi__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_mid__d_lo__pl_lo", + "test_loss": 4754.3857421875, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4838.50146484375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.6464263814086506, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 326.8262634277344, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.23546560765686914 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 134.6788787841797, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.7088362041272616 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4317.00146484375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.327417631008248 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 693.3106689453125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.2336739699849385 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 233.68780517578125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.20180294056630504 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 138994.984375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.2276375714053502 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9444.3974609375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.6622070860284321 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 36626.8828125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.877435174150392 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2468.868896484375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4389100260416667 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 692754.1875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.836319892990057 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 218695.703125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.639287489807465 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__04__h_mid__d_lo__pl_lo__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_mid__d_lo__pl_lo", + "test_loss": 4870.83349609375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4963.55078125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.6631330369071476, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 557.6729125976562, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.40178163731819616 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 417.0576477050781, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 2.1950402510793587 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4067.136962890625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.30846696722719946 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 837.8663940429688, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.28239514460497767 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 452.705322265625, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.3909372385713515 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 139816.40625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.246712015836894 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9323.51953125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.6537315615797223 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 36534.5625, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.8727029832385054 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2475.26123046875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.44004644097222223 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 695008.1875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.861816765268147 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 220127.59375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.6631154002962076 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__04__h_mid__d_lo__pl_lo__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_mid__d_lo__pl_lo", + "test_loss": 4541.8642578125, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4603.98388671875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.6150947076444556, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 519.9282836914062, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.37458810064222353 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 214.59991455078125, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 1.129473234477796 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4151.62841796875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.3148751170245544 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 889.3506469726562, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.299747437469719 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 330.82269287109375, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.28568453615811207 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 137085.4375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.18329550204347 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9540.6142578125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.6689534607917894 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 35353.71875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.8121748295658413 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2363.326171875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.420146875 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 687351.1875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.7752020576224785 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 218326.59375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.633145187459438 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__04__h_mid__d_lo__pl_lo__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_mid__d_lo__pl_hi", + "test_loss": 84.30755615234375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 88.520263671875, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.07644236931940847, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 27.545921325683594, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.01984576464386426 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 8.945663452148438, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.04708243922183388 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6783.7080078125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.5145019346084566 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 54.55781555175781, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.0183882088142089 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6011.45654296875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.8031338066758517 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 157793.109375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.66415357084804 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11494.16796875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.8059296009500772 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 41832.76171875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.144280163962786 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2663.614013671875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.47353138020833335 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 727391.8125, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.228134933203624 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 240366.75, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.9999126354151064 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__05__h_mid__d_lo__pl_hi__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_mid__d_lo__pl_hi", + "test_loss": 88.82088470458984, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 90.79950714111328, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.07841062792842252, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 23.872989654541016, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.01719956026984223 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7.266171932220459, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.038243010169581364 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6200.74072265625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.47028750266638225 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 79.7925796508789, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.026893353438112205 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5839.79443359375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.7801996571267535 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 156005.171875, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.6226354234395317 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11226.482421875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.7871604558880241 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 41293.48046875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.116637473409708 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2589.7080078125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.46039253472222225 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 724091.0, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.19079669241994 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 238241.8125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.964551819679497 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__05__h_mid__d_lo__pl_hi__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_1-2.5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_mid__d_lo__pl_hi", + "test_loss": 84.97125244140625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 88.66398620605469, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.07656648204322512, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 20.46120262145996, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.014741500447737725 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7.390232086181641, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.038895958348324426 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 6279.19287109375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.47623760872914295 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 57.58989715576172, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.019410143968911938 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5857.03955078125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.782503613998831 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 156302.765625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.6295459229286644 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11341.8271484375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.7952480120906955 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 41555.52734375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.130069575260136 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2602.6064453125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4626855902777778 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 726921.5, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.222814836600568 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 239389.5, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.9836503419699465 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__05__h_mid__d_lo__pl_hi__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_mid__d_hi__pl_lo", + "test_loss": 120665.8359375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 83749.75, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 1.9447740572171652, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 67239.3046875, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 48.44330308897695 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 72784.2421875, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 383.07495888157894 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 33890.51171875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 2.5703838997914294 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 71626.4140625, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 24.141022602797438 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 48232.0234375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 6.443824106546426 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 67976.6953125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 58.70180942357513 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 38292.75390625, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 2.684949790089048 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 40365.2265625, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.069056669357732 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 52259.4140625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 9.2905625 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 475135.5625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 5.374654282094499 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 133775.234375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 2.2261367276554673 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__06__h_mid__d_hi__pl_lo__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_mid__d_hi__pl_lo", + "test_loss": 120422.6015625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 82678.015625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 1.919887043121865, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 75584.15625, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 54.45544398414986 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 77556.4140625, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 408.1916529605263 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 46867.01953125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 3.5545710679749716 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 84494.828125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 28.478202940680823 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 57003.46484375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 7.615693365898464 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 74908.8828125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 64.68815441493955 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 49009.62890625, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 3.4363784116007574 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 44990.1875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.306124737300733 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 58087.453125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 10.326658333333333 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 453494.34375, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 5.129852422994695 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 127214.0234375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 2.1169524476644535 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__06__h_mid__d_hi__pl_lo__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_mid__d_hi__pl_lo", + "test_loss": 118435.828125, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 83023.2890625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 1.9279047246540033, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 74466.953125, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 53.650542597262245 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 82981.71875, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 436.74588815789474 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 33837.765625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 2.566383437618506 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 76017.140625, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 25.62087651668352 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 52088.6953125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 6.95907753006012 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 77203.296875, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 66.669513708981 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 40421.921875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 2.834239368601879 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 42335.3984375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.170044514711159 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 57678.5078125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 10.253956944444445 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 475633.0625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 5.380281919165639 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 133931.46875, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 2.228736604096983 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__06__h_mid__d_hi__pl_lo__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_mid__d_hi__pl_hi", + "test_loss": 7763.61083984375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7660.396484375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.537119372063876, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 388.4454040527344, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.27985980119073084 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 142.7963104248047, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.7515595285516036 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2562.2138671875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.19432793835324233 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 352.0533752441406, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.11865634487500526 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5110.87060546875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.6828150441508016 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 266.8460693359375, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.2304370201519322 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 132783.75, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.083404932193944 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 36765.03125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.884516441129735 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2575.365966796875, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4578428385416667 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 690219.75, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.807650758458423 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 201651.703125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.3556604450601566 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__07__h_mid__d_hi__pl_hi__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_mid__d_hi__pl_hi", + "test_loss": 8160.4365234375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7767.62841796875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.5446380884846971, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 904.259033203125, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.6514834533163725 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 565.6788330078125, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 2.977257015830592 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2579.4736328125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.1956369839069018 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 576.4423217773438, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.19428457087204037 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5387.0537109375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.7197132546342685 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 660.798095703125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.5706373883446675 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 132427.046875, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.075121839007059 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 35379.328125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.8134875249884668 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2727.369384765625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4848656684027778 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 683586.0, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.73261088424601 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 200430.828125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.3353440188541095 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__07__h_mid__d_hi__pl_hi__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.4-0.6__deg_4-5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_mid", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_mid__d_hi__pl_hi", + "test_loss": 7860.9404296875, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7653.75146484375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.5366534472615166, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 440.5615234375, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.31740743763508644 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 192.81570434570312, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 1.0148194965563322 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2296.66845703125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.17418797550483503 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 316.15899658203125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.10655847542367079 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4977.166015625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.664952039495658 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 279.2500305175781, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.24114855830533516 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 130631.9453125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.0334373330972504 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 36637.99609375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.8780048230944693 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2476.675537109375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.44029787326388886 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 694012.5625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 7.850554421230049 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 203890.5625, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.3929170202852243 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__07__h_mid__d_hi__pl_hi__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_hi__d_lo__pl_lo", + "test_loss": 24397.263671875, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 24958.619140625, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.279338722672869, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 13354.3212890625, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 9.621268940246757 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 13973.701171875, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 73.54579564144737 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 30328.359375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 2.3002168657565414 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 17685.359375, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 5.9606873525446575 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 10237.4140625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 1.3677239896459585 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 13628.16015625, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 11.76870479814335 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 132031.59375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.0659389223016906 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 18078.736328125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 1.2676157851721357 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 10292.677734375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 1.829809375 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 599636.0625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 6.782983184959787 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 220945.40625, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.676724514502521 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__08__h_hi__d_lo__pl_lo__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_hi__d_lo__pl_lo", + "test_loss": 22449.66015625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 22706.908203125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.163919637250756, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 15069.841796875, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 10.857234723973344 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 12837.0703125, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 67.56352796052632 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 22689.0078125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 1.7208197051573757 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 19737.50390625, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 6.65234375 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 10407.8330078125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 1.3904920518119572 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11749.4833984375, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 10.146358720585061 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 101074.5703125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.3470780771061674 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 16081.0966796875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 1.127548498084946 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9778.4462890625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 1.7383904513888888 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 551707.625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 6.24082468920738 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 184987.140625, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.078347571680562 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__08__h_hi__d_lo__pl_lo__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_lo", + "run_slug": "h_hi__d_lo__pl_lo", + "test_loss": 23221.462890625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 23311.6328125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.1949168492746938, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 12367.419921875, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 8.910244900486312 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 12047.3388671875, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 63.4070466694079 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 20960.58984375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 1.5897299843572241 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 17407.58984375, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 5.867067692534547 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 8801.6943359375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 1.1759110669255177 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 11201.98046875, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 9.673558263169257 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 120673.1328125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.802181237518577 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 16517.244140625, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 1.158129584954775 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 7600.61083984375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 1.3512197048611112 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 591574.3125, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 6.691790012782372 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 210275.984375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.4991760167573593 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__08__h_hi__d_lo__pl_lo__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_hi__d_lo__pl_hi", + "test_loss": 2346.16943359375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2491.35302734375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.4429072048611111, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 59.445125579833984, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.04282790027365561 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 15.19217300415039, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.07995880528500206 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4647.3291015625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.3524709216202124 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 233.16571044921875, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.07858635337014451 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5442.6904296875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.72714634999165 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 96.90707397460938, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.08368486526304782 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 148041.75, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.4377147965818318 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9935.8916015625, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.6966688824542491 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 39869.7734375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.0436605380849864 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 714955.4375, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.087456732237595 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 228789.703125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.807260465029205 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__09__h_hi__d_lo__pl_hi__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_hi__d_lo__pl_hi", + "test_loss": 2317.1416015625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2461.087646484375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.43752669270833333, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 94.03990936279297, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.06775209608270387 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 35.12610626220703, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 0.18487424348530015 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 4758.2939453125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.36088691280337504 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 252.6472625732422, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.08515243093132531 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5444.63818359375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.7274065709544089 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 119.0107650756836, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.10277268141250742 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 149244.359375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.465640892044399 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 10303.623046875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.722452885070467 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 39620.39453125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 2.0308777759623764 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 713897.5, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.075489519586439 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 230385.734375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.833819818864094 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__09__h_hi__d_lo__pl_hi__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_1-2.5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_lo", + "power_law": "pl_hi", + "run_slug": "h_hi__d_lo__pl_hi", + "test_loss": 2209.64599609375, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 2340.2578125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 0.41604583333333334, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 265.19952392578125, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 0.1910659394277963 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 259.3502197265625, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 1.3650011564555922 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5013.4677734375, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 0.38024025585419036 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 293.0236511230469, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 0.09876092049984728 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 5046.6787109375, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 0.674238972737141 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 280.4268798828125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 0.24216483582280873 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 147425.609375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.4234072398058704 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 9679.9716796875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 0.6787247005810896 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 38008.046875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 1.9482314252396329 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 708686.5, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 8.016543556214156 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 228055.6875, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 3.795045804003794 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__09__h_hi__d_lo__pl_hi__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_1.5-2__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_hi__d_hi__pl_lo", + "test_loss": 458434.90625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 297462.03125, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 3.364840913204303, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 555654.375, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 400.32735951008647 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 643740.8125, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 3388.1095394736844 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 188542.0, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 14.299734546833523 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 575644.8125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 194.0157777216043 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 409252.0625, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 54.67629425517702 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 589301.25, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 508.895725388601 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 119924.75, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.7848028515697565 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 241290.59375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 16.91842614990885 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 311512.84375, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 15.967647944538419 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 432576.0625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 76.9024111111111 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 90605.8203125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 1.5077599772436057 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__10__h_hi__d_hi__pl_lo__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_1.5-2__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_hi__d_hi__pl_lo", + "test_loss": 432670.40625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 287549.71875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 3.252714486499327, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 647189.25, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 466.2746757925072 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 742142.9375, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 3906.0154605263156 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 224246.0, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 17.00766021994691 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 660217.8125, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 222.52032777216044 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 465904.53125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 62.24509435537742 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 678029.75, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 585.5179188255613 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 139265.765625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 3.233925451072822 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 287627.9375, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 20.16743356471743 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 359435.53125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 18.424087920959558 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 490575.15625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 87.21336111111111 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 102955.0234375, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 1.713261501963623 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__10__h_hi__d_hi__pl_lo__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_1.5-2__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_lo", + "run_slug": "h_hi__d_hi__pl_lo", + "test_loss": 467957.5625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 304421.875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 3.443569505559766, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 549036.875, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 395.5597082132565 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 635729.0625, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 3345.9424342105262 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 172642.96875, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 13.09389220705347 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 552415.9375, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 186.1866995281429 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 399052.8125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 53.31366900467602 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 579697.25, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 500.602115716753 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 117866.15625, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.736999727150288 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 221494.453125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 15.530392169751789 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 304918.0, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 15.62960684812138 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 423531.40625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 75.29447222222223 + }, + "h_hi__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 108242.171875, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 1.8012442692992527 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__10__h_hi__d_hi__pl_lo__s44" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_4-5__s42", + "train_seed": 42, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_hi__d_hi__pl_hi", + "test_loss": 96789.015625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 91998.9765625, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 1.5309433139051138, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 358895.875, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 258.570515129683 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 397228.5, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 2090.676315789474 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 194021.0625, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 14.71528725824801 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 384782.90625, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 129.6875315975733 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 267719.1875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 35.76742651970608 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 369828.53125, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 319.36833441278065 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 114930.5078125, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.6688302947357423 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 192374.296875, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 13.488591843710559 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 209228.28125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 10.72470558460198 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 292372.4375, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 51.97732222222222 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 318157.90625, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 3.5989492013845683 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__11__h_hi__d_hi__pl_hi__s42" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_4-5__s43", + "train_seed": 43, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_hi__d_hi__pl_hi", + "test_loss": 93034.515625, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 88370.328125, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 1.4705594349591466, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 337981.34375, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 243.50240904178673 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 384109.53125, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 2021.6291118421052 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 135121.3125, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 10.24810864618885 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 353448.84375, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 119.12667467138523 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 241657.46875, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 32.28556696726787 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 353586.34375, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 305.3422657599309 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 88487.09375, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.0547811106724874 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 156479.28125, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 10.97176281377086 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 180961.3125, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 9.275786175611257 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 264696.15625, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 47.057094444444445 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 316398.875, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 3.5790513330995553 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__11__h_hi__d_hi__pl_hi__s43" + }, + { + "experiment": "triangle_counting", + "wandb_project": "challenge_triangle_counting", + "wandb_run_name": "smcn_hom_0.9-1__deg_4-5__gamma_4-5__s44", + "train_seed": 44, + "homophily": "h_hi", + "avg_degree": "d_hi", + "power_law": "pl_hi", + "run_slug": "h_hi__d_hi__pl_hi", + "test_loss": 92360.71875, + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 88592.546875, + "test_triangles_total_structural": 60093.0, + "test_mse_by_total_triangles": 1.474257349025677, + "ood_test": { + "h_lo__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 352248.25, + "test_triangles_total_structural": 1388.0, + "test_mse_by_total_triangles": 253.7811599423631 + }, + "h_lo__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 391310.75, + "test_triangles_total_structural": 190.0, + "test_mse_by_total_triangles": 2059.5302631578948 + }, + "h_lo__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 142189.5, + "test_triangles_total_structural": 13185.0, + "test_mse_by_total_triangles": 10.784186575654152 + }, + "h_lo__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 359024.09375, + "test_triangles_total_structural": 2967.0, + "test_mse_by_total_triangles": 121.00576129086619 + }, + "h_mid__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 253763.3125, + "test_triangles_total_structural": 7485.0, + "test_mse_by_total_triangles": 33.902914161656646 + }, + "h_mid__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 362659.1875, + "test_triangles_total_structural": 1158.0, + "test_mse_by_total_triangles": 313.1771912780656 + }, + "h_mid__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 100264.9921875, + "test_triangles_total_structural": 43064.0, + "test_mse_by_total_triangles": 2.328278659379064 + }, + "h_mid__d_hi__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 161947.65625, + "test_triangles_total_structural": 14262.0, + "test_mse_by_total_triangles": 11.35518554550554 + }, + "h_hi__d_lo__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 192470.046875, + "test_triangles_total_structural": 19509.0, + "test_mse_by_total_triangles": 9.8657054116049 + }, + "h_hi__d_lo__pl_hi": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 282128.8125, + "test_triangles_total_structural": 5625.0, + "test_mse_by_total_triangles": 50.15623333333333 + }, + "h_hi__d_hi__pl_lo": { + "test_best_rerun_accuracy": null, + "test_best_rerun_mse": 325475.34375, + "test_triangles_total_structural": 88403.0, + "test_mse_by_total_triangles": 3.6817228346323088 + } + }, + "output_dir": "C:\\Users\\Salwa Khattami\\Coding_stuff\\topobench\\logs\\train\\runs\\notebook_gu_grid_2026-07-20_23-26-18__triangle_counting__11__h_hi__d_hi__pl_hi__s44" + } + ] +} diff --git a/configs/model/combinatorial/smcn.yaml b/configs/model/combinatorial/smcn.yaml new file mode 100644 index 000000000..3d6fe8861 --- /dev/null +++ b/configs/model/combinatorial/smcn.yaml @@ -0,0 +1,52 @@ +_target_: topobench.model.TBModel + +model_name: smcn +model_domain: combinatorial +tune_gnn: GCN + +feature_encoder: + _target_: topobench.nn.encoders.${model.feature_encoder.encoder_name} + encoder_name: AllCellFeatureEncoder + in_channels: ${infer_in_channels:${dataset},${oc.select:transforms,null}} + out_channels: 32 + proj_dropout: 0. + selected_dimensions: + - 0 + - 1 + - 2 + +backbone: + _target_: topobench.nn.backbones.combinatorial.smcn.SMCN + in_channels: ${model.feature_encoder.out_channels} + hidden_channels: ${model.feature_encoder.out_channels} + use_subcomplex_signal: true + tuple_pooling: mean + subcomplex_aggregation: mean + max_rank02_tuples: 512 + tuple_selection: incident + neighborhoods: + - up_adjacency-1 + - up_incidence-0 + - down_incidence-2 + - 2-up_adjacency-0 + layers: 1 + activation: relu + marking_embed_dim: 4 + +backbone_wrapper: + _target_: topobench.nn.wrappers.combinatorial.TuneWrapper + _partial_: true + wrapper_name: TuneWrapper + out_channels: ${model.feature_encoder.out_channels} + num_cell_dimensions: ${infer_topotune_num_cell_dimensions:${oc.select:model.backbone.neighborhoods}} + +readout: + _target_: topobench.nn.readouts.${model.readout.readout_name} + readout_name: PropagateSignalDown + num_cell_dimensions: ${infer_topotune_num_cell_dimensions:${oc.select:model.backbone.neighborhoods}} + hidden_dim: ${model.feature_encoder.out_channels} + out_channels: ${dataset.parameters.num_classes} + task_level: ${define_task_level:${dataset.parameters.task_level},${dataset.split_params.learning_setting}} + pooling_type: sum + +compile: false diff --git a/test/nn/backbones/combinatorial/test_smcn.py b/test/nn/backbones/combinatorial/test_smcn.py new file mode 100644 index 000000000..d7acbb7a9 --- /dev/null +++ b/test/nn/backbones/combinatorial/test_smcn.py @@ -0,0 +1,997 @@ +"""Tests for the SMCN combinatorial backbone skeleton.""" + +import pytest +import torch +from torch_geometric.data import Data + +from topobench.nn.backbones.combinatorial.smcn import ( + SMCN, + SubComplexLayer, + SubComplexRelationConv, +) + + +def _set_linear_identity(linear): + linear.weight.copy_(torch.eye(linear.in_features, linear.out_features)) + linear.bias.zero_() + + +def _set_relation_conv_identity(conv): + _set_linear_identity(conv.message_linear) + if conv.bridge_linear is not None: + _set_linear_identity(conv.bridge_linear) + _set_linear_identity(conv.update[0]) + _set_linear_identity(conv.update[2]) + + +def test_subcomplex_layer_has_relation_specific_transforms(): + """SubComplexLayer should use separate transforms for each relation type.""" + layer = SubComplexLayer(channels=2) + + assert isinstance(layer.self_linear, torch.nn.Linear) + assert isinstance(layer.low_conv, SubComplexRelationConv) + assert isinstance(layer.high_conv, SubComplexRelationConv) + assert isinstance(layer.incidence_conv, SubComplexRelationConv) + + +def test_subcomplex_layer_sum_aggregates_placeholder_edges(): + """SubComplexLayer should sum tuple features when aggregation is sum.""" + layer = SubComplexLayer(channels=2, aggregation="sum") + with torch.no_grad(): + _set_linear_identity(layer.self_linear) + for conv in (layer.low_conv, layer.high_conv, layer.incidence_conv): + _set_relation_conv_identity(conv) + + tuple_features = torch.tensor( + [ + [1.0, 0.0], + [0.0, 2.0], + [3.0, 0.0], + ] + ) + edge_index_low_adjacency = torch.tensor([[0, 1], [1, 0]]) + edge_index_high_adjacency = torch.tensor([[1, 2], [2, 1]]) + edge_index_incidence = torch.tensor([[0, 1, 2], [0, 1, 2]]) + + out = layer( + tuple_features, + edge_index_low_adjacency, + edge_index_high_adjacency, + edge_index_incidence, + ) + + assert torch.equal( + out, + torch.tensor( + [ + [2.0, 2.0], + [4.0, 4.0], + [6.0, 2.0], + ] + ), + ) + + +def test_subcomplex_layer_aggregates_low_bridge_edge_features(): + """SubComplexLayer should aggregate low bridge features aligned to tuple edges.""" + layer = SubComplexLayer(channels=2, aggregation="sum") + with torch.no_grad(): + _set_linear_identity(layer.self_linear) + for conv in (layer.low_conv, layer.high_conv, layer.incidence_conv): + _set_relation_conv_identity(conv) + + tuple_features = torch.zeros(2, 2) + edge_index_low_adjacency = torch.tensor([[0], [1]]) + edge_index_high_adjacency = torch.empty((2, 0), dtype=torch.long) + edge_index_incidence = torch.empty((2, 0), dtype=torch.long) + low_bridge_features = torch.tensor([[10.0, 20.0]]) + + out = layer( + tuple_features, + edge_index_low_adjacency, + edge_index_high_adjacency, + edge_index_incidence, + low_bridge_features=low_bridge_features, + ) + + assert torch.equal(out, torch.tensor([[0.0, 0.0], [10.0, 20.0]])) + + +def test_subcomplex_layer_aggregates_high_bridge_edge_features(): + """SubComplexLayer should aggregate high bridge features aligned to tuple edges.""" + layer = SubComplexLayer(channels=2, aggregation="sum") + with torch.no_grad(): + _set_linear_identity(layer.self_linear) + for conv in (layer.low_conv, layer.high_conv, layer.incidence_conv): + _set_relation_conv_identity(conv) + + tuple_features = torch.zeros(2, 2) + edge_index_low_adjacency = torch.empty((2, 0), dtype=torch.long) + edge_index_high_adjacency = torch.tensor([[0], [1]]) + edge_index_incidence = torch.empty((2, 0), dtype=torch.long) + high_bridge_features = torch.tensor([[3.0, 4.0]]) + + out = layer( + tuple_features, + edge_index_low_adjacency, + edge_index_high_adjacency, + edge_index_incidence, + high_bridge_features=high_bridge_features, + ) + + assert torch.equal(out, torch.tensor([[0.0, 0.0], [3.0, 4.0]])) + + +def test_subcomplex_layer_mean_aggregates_placeholder_edges(): + """SubComplexLayer should average incoming messages when aggregation is mean.""" + layer = SubComplexLayer(channels=2, aggregation="mean") + with torch.no_grad(): + _set_linear_identity(layer.self_linear) + for conv in (layer.low_conv, layer.high_conv, layer.incidence_conv): + _set_relation_conv_identity(conv) + + tuple_features = torch.tensor( + [ + [1.0, 0.0], + [0.0, 2.0], + [3.0, 0.0], + ] + ) + edge_index_low_adjacency = torch.tensor([[0, 2], [1, 1]]) + empty_edge_index = torch.empty(2, 0, dtype=torch.long) + + out = layer( + tuple_features, + edge_index_low_adjacency, + empty_edge_index, + empty_edge_index, + ) + + assert torch.equal( + out, + torch.tensor( + [ + [1.0, 0.0], + [2.0, 2.0], + [3.0, 0.0], + ] + ), + ) + + +def test_subcomplex_layer_rejects_unknown_aggregation(): + """SubComplexLayer should fail clearly for unsupported aggregation.""" + with pytest.raises(ValueError, match="Unsupported aggregation"): + SubComplexLayer(channels=2, aggregation="max") + + +def test_smcn_rejects_unknown_subcomplex_aggregation(): + """SMCN should fail clearly for unsupported subcomplex aggregation.""" + with pytest.raises(ValueError, match="Unsupported subcomplex_aggregation"): + SMCN( + in_channels=8, + hidden_channels=16, + subcomplex_aggregation="max", + ) + + +def test_smcn_forward_returns_rank_dict(): + """SMCN should return updated rank-wise features.""" + in_channels = 8 + hidden_channels = 16 + + batch = Data( + x_0=torch.randn(5, in_channels), + x_1=torch.randn(7, in_channels), + x_2=torch.randn(3, in_channels), + ) + + model = SMCN( + in_channels=in_channels, + hidden_channels=hidden_channels, + neighborhoods=[ + "up_adjacency-1", + "up_incidence-0", + "down_incidence-2", + ], + layers=1, + activation="relu", + ) + + out = model(batch) + + assert set(out.keys()) == {0, 1, 2} + assert out[0].shape == (5, hidden_channels) + assert out[1].shape == (7, hidden_channels) + assert out[2].shape == (3, hidden_channels) + + +def test_smcn_supports_multiple_layers(): + """SMCN should support more than one placeholder update layer.""" + in_channels = 8 + hidden_channels = 16 + + batch = Data( + x_0=torch.randn(5, in_channels), + x_1=torch.randn(7, in_channels), + x_2=torch.randn(3, in_channels), + ) + + model = SMCN( + in_channels=in_channels, + hidden_channels=hidden_channels, + layers=2, + activation="relu", + ) + + out = model(batch) + + assert out[0].shape == (5, hidden_channels) + assert out[1].shape == (7, hidden_channels) + assert out[2].shape == (3, hidden_channels) + + +def test_smcn_rejects_unknown_activation(): + """SMCN should fail clearly for unsupported activations.""" + with pytest.raises(ValueError, match="Unsupported activation"): + SMCN( + in_channels=8, + hidden_channels=16, + activation="not_an_activation", + ) + + +def test_smcn_rejects_unknown_tuple_pooling(): + """SMCN should fail clearly for unsupported tuple pooling.""" + with pytest.raises(ValueError, match="Unsupported tuple_pooling"): + SMCN( + in_channels=8, + hidden_channels=16, + tuple_pooling="max", + ) + + +def test_smcn_rejects_unknown_tuple_selection(): + """SMCN should fail clearly for unsupported tuple selection.""" + with pytest.raises(ValueError, match="Unsupported tuple_selection"): + SMCN( + in_channels=8, + hidden_channels=16, + tuple_selection="max", + ) + + +def test_smcn_looks_up_sparse_binary_marking(): + """SMCN should look up tuple incidence markings from sparse indices.""" + incidence = torch.tensor( + [ + [1.0, 0.0], + [0.0, 1.0], + ] + ).to_sparse() + low_indices = torch.tensor([0, 0, 1, 1]) + high_indices = torch.tensor([0, 1, 0, 1]) + + markings = SMCN._lookup_sparse_binary_marking( + incidence, low_indices, high_indices + ) + + assert torch.equal(markings, torch.tensor([1.0, 0.0, 0.0, 1.0])) + + +def test_smcn_looks_up_empty_sparse_binary_marking(): + """SMCN should return zeros when sparse tuple incidence has no entries.""" + incidence = torch.sparse_coo_tensor(size=(2, 2)).coalesce() + low_indices = torch.tensor([0, 1]) + high_indices = torch.tensor([0, 1]) + + markings = SMCN._lookup_sparse_binary_marking( + incidence, low_indices, high_indices + ) + + assert torch.equal(markings, torch.zeros(2)) + + +def test_smcn_projects_raw_bridge_features_to_hidden_channels(): + """SMCN should project raw bridge-cell features before subcomplex update.""" + incidence_1 = torch.tensor([[1.0], [1.0]]).to_sparse() + incidence_2 = torch.tensor([[1.0]]).to_sparse() + batch = Data( + x_0=torch.zeros(2, 2), + x_1=torch.tensor([[2.0, 3.0]]), + x_2=torch.zeros(1, 2), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN( + in_channels=2, + hidden_channels=3, + use_subcomplex_signal=True, + tuple_selection="incident", + activation="identity", + ) + with torch.no_grad(): + model.rank02_low_bridge_encoder.weight.copy_( + torch.tensor([[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]) + ) + model.rank02_low_bridge_encoder.bias.zero_() + + subcomplex = model.build_rank02_subcomplex(batch) + raw_bridge_features = model._gather_bridge_features( + batch, + "x_1", + subcomplex["bridge_index_low_adjacency"], + subcomplex["edge_index_low_adjacency"], + ) + projected = model.rank02_low_bridge_encoder(raw_bridge_features) + + assert torch.equal( + projected, torch.tensor([[2.0, 3.0, 5.0], [2.0, 3.0, 5.0]]) + ) + + +def test_smcn_forward_uses_subcomplex_signal_with_projected_bridges(): + """SMCN should run subcomplex updates when bridge channels differ from hidden channels.""" + incidence_1 = torch.tensor([[1.0], [1.0]]).to_sparse() + incidence_2 = torch.tensor([[1.0]]).to_sparse() + batch = Data( + x_0=torch.ones(2, 2), + x_1=torch.ones(1, 2), + x_2=torch.ones(1, 2), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN( + in_channels=2, + hidden_channels=3, + use_subcomplex_signal=True, + tuple_selection="incident", + ) + + out = model(batch) + + assert out[0].shape == (2, 3) + assert out[1].shape == (1, 3) + assert out[2].shape == (1, 3) + + +def test_smcn_builds_binary_rank02_incidence(): + """SMCN should compose rank 0-to-2 incidence from incidences 0-to-1 and 1-to-2.""" + incidence_1 = torch.tensor( + [ + [1.0, 0.0, 1.0], + [1.0, 1.0, 0.0], + [0.0, 1.0, 1.0], + ] + ).to_sparse() + incidence_2 = torch.tensor([[1.0], [1.0], [1.0]]).to_sparse() + batch = Data( + x_0=torch.randn(3, 8), + x_2=torch.randn(1, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + incidence_0_2 = subcomplex["incidence_0_2"] + + assert incidence_0_2.is_sparse + assert incidence_0_2.shape == (3, 1) + assert torch.equal( + incidence_0_2.to_dense(), + torch.ones(3, 1), + ) + assert torch.equal(subcomplex["low_indices"], torch.tensor([0, 1, 2])) + assert torch.equal(subcomplex["high_indices"], torch.tensor([0, 0, 0])) + assert torch.equal(subcomplex["binary_marking"], torch.ones(3)) + assert subcomplex["tuple_features"].shape == (3, 16) + + +def test_smcn_builds_empty_rank02_subcomplex_when_no_rank2_cells(): + """SMCN should handle batches without rank-2 cells.""" + incidence_1 = torch.tensor( + [ + [1.0, 0.0, 1.0], + [1.0, 1.0, 0.0], + [0.0, 1.0, 1.0], + ] + ).to_sparse() + incidence_2 = torch.sparse_coo_tensor(size=(3, 0)).coalesce() + batch = Data( + x_0=torch.randn(3, 8), + x_2=torch.empty(0, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + incidence_0_2 = subcomplex["incidence_0_2"] + + assert incidence_0_2.is_sparse + assert incidence_0_2.shape == (3, 0) + assert incidence_0_2._nnz() == 0 + assert torch.equal( + subcomplex["low_indices"], torch.empty(0, dtype=torch.long) + ) + assert torch.equal( + subcomplex["high_indices"], torch.empty(0, dtype=torch.long) + ) + assert torch.equal(subcomplex["binary_marking"], torch.empty(0)) + assert subcomplex["tuple_features"].shape == (0, 16) + + +def test_smcn_pools_rank02_tuple_features_to_rank0(): + """SMCN should sum tuple features back onto their rank-0 cells.""" + subcomplex = { + "tuple_features": torch.tensor( + [ + [1.0, 2.0], + [3.0, 4.0], + [5.0, 6.0], + ] + ), + "low_indices": torch.tensor([0, 1, 0]), + } + + model = SMCN(in_channels=8, hidden_channels=16, tuple_pooling="sum") + pooled = model.pool_rank02_to_rank0(subcomplex, num_low_cells=3) + + assert torch.equal( + pooled, + torch.tensor( + [ + [6.0, 8.0], + [3.0, 4.0], + [0.0, 0.0], + ] + ), + ) + + +def test_smcn_mean_pools_rank02_tuple_features_to_rank0(): + """SMCN should average tuple features when tuple_pooling is mean.""" + subcomplex = { + "tuple_features": torch.tensor( + [ + [1.0, 2.0], + [3.0, 4.0], + [5.0, 6.0], + ] + ), + "low_indices": torch.tensor([0, 1, 0]), + } + + model = SMCN(in_channels=8, hidden_channels=16, tuple_pooling="mean") + pooled = model.pool_rank02_to_rank0(subcomplex, num_low_cells=3) + + assert torch.equal( + pooled, + torch.tensor( + [ + [3.0, 4.0], + [3.0, 4.0], + [0.0, 0.0], + ] + ), + ) + + +def test_smcn_rejects_negative_marking_embed_dim(): + """SMCN should fail clearly for negative marking embedding dimensions.""" + with pytest.raises(ValueError, match="marking_embed_dim"): + SMCN( + in_channels=8, + hidden_channels=16, + marking_embed_dim=-1, + ) + + +def test_smcn_encodes_scalar_rank02_marking_by_default(): + """SMCN should use scalar binary marking by default.""" + model = SMCN(in_channels=8, hidden_channels=16) + + marking_features = model.encode_rank02_marking(torch.tensor([0.0, 1.0])) + + assert torch.equal(marking_features, torch.tensor([[0.0], [1.0]])) + + +def test_smcn_embeds_rank02_marking_when_requested(): + """SMCN should embed binary marking when marking_embed_dim is positive.""" + model = SMCN(in_channels=8, hidden_channels=16, marking_embed_dim=4) + + marking_features = model.encode_rank02_marking(torch.tensor([0.0, 1.0])) + + assert marking_features.shape == (2, 4) + + +def test_smcn_encodes_rank02_tuple_features(): + """SMCN should encode selected rank-0/2 tuple features.""" + batch = Data( + x_0=torch.ones(2, 8), + x_2=2 * torch.ones(1, 8), + ) + low_indices = torch.tensor([0, 1]) + high_indices = torch.tensor([0, 0]) + binary_marking = torch.tensor([1.0, 0.0]) + model = SMCN(in_channels=8, hidden_channels=16, marking_embed_dim=4) + + tuple_features = model.encode_rank02_tuple_features( + batch, low_indices, high_indices, binary_marking + ) + + assert tuple_features.shape == (2, 16) + + +def test_smcn_uses_subcomplex_layer_when_enabled(): + """SMCN should update rank-0/2 tuple features with SubComplexLayer when enabled.""" + incidence_1 = torch.tensor( + [ + [1.0, 0.0, 1.0], + [1.0, 1.0, 0.0], + [0.0, 1.0, 1.0], + ] + ).to_sparse() + incidence_2 = torch.tensor([[1.0], [1.0], [1.0]]).to_sparse() + batch = Data( + x_0=torch.ones(3, 8), + x_1=torch.ones(3, 8), + x_2=2 * torch.ones(1, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN( + in_channels=8, + hidden_channels=16, + use_subcomplex_signal=True, + ) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + out = model(batch) + + assert isinstance(model.rank02_tuple_update, SubComplexLayer) + assert subcomplex["tuple_features"].shape == (3, 16) + assert set(out.keys()) == {0, 1, 2} + assert out[0].shape == (3, 16) + + +def test_smcn_rejects_non_positive_max_rank02_tuples(): + """SMCN should fail clearly for non-positive rank-0/2 tuple caps.""" + with pytest.raises(ValueError, match="max_rank02_tuples"): + SMCN(in_channels=8, hidden_channels=16, max_rank02_tuples=0) + + +def test_smcn_caps_rank02_tuples_when_requested(): + """SMCN should keep only the first rank-0/2 tuples when capped.""" + incidence_1 = torch.eye(3).to_sparse() + incidence_2 = torch.ones(3, 2).to_sparse() + batch = Data( + x_0=torch.ones(3, 8), + x_2=2 * torch.ones(2, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16, max_rank02_tuples=4) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + + assert torch.equal(subcomplex["low_indices"], torch.tensor([0, 0, 1, 1])) + assert torch.equal(subcomplex["high_indices"], torch.tensor([0, 1, 0, 1])) + assert subcomplex["binary_marking"].shape == (4,) + assert subcomplex["tuple_features"].shape == (4, 16) + + +def test_smcn_keeps_all_rank02_tuples_when_uncapped(): + """SMCN should keep all rank-0/2 tuples when no cap is configured.""" + incidence_1 = torch.eye(3).to_sparse() + incidence_2 = torch.ones(3, 2).to_sparse() + batch = Data( + x_0=torch.ones(3, 8), + x_2=2 * torch.ones(2, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + + assert subcomplex["low_indices"].shape == (6,) + assert subcomplex["high_indices"].shape == (6,) + assert subcomplex["tuple_features"].shape == (6, 16) + + +def test_smcn_builds_and_pools_rank02_subcomplex(): + """SMCN should build rank-0/2 tuples and pool them back to rank 0.""" + incidence_1 = torch.tensor( + [ + [1.0, 0.0, 1.0], + [1.0, 1.0, 0.0], + [0.0, 1.0, 1.0], + ] + ).to_sparse() + incidence_2 = torch.tensor([[1.0], [1.0], [1.0]]).to_sparse() + batch = Data( + x_0=torch.ones(3, 8), + x_2=2 * torch.ones(1, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + pooled = model.pool_rank02_to_rank0( + subcomplex, + num_low_cells=batch.x_0.size(0), + ) + + assert pooled.shape == (3, 16) + + +def test_smcn_filters_rank02_tuples_across_batched_graphs(): + """SMCN should not create node-face tuples across different graphs.""" + incidence_1 = torch.eye(4).to_sparse() + incidence_2 = torch.tensor( + [ + [1.0, 0.0], + [0.0, 0.0], + [0.0, 1.0], + [0.0, 1.0], + ] + ).to_sparse() + batch = Data( + x_0=torch.ones(4, 8), + x_2=2 * torch.ones(2, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + batch_0=torch.tensor([0, 0, 1, 1]), + batch_2=torch.tensor([0, 1]), + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + + assert torch.equal(subcomplex["low_indices"], torch.tensor([0, 1, 2, 3])) + assert torch.equal(subcomplex["high_indices"], torch.tensor([0, 0, 1, 1])) + assert torch.equal( + subcomplex["binary_marking"], torch.tensor([1.0, 0.0, 1.0, 1.0]) + ) + assert subcomplex["tuple_features"].shape == (4, 16) + + +def test_smcn_keeps_all_rank02_tuples_by_default(): + """SMCN should keep same-graph non-incident tuples by default.""" + incidence_1 = torch.eye(2).to_sparse() + incidence_2 = torch.tensor([[1.0], [0.0]]).to_sparse() + batch = Data( + x_0=torch.ones(2, 8), + x_2=2 * torch.ones(1, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + + assert torch.equal(subcomplex["low_indices"], torch.tensor([0, 1])) + assert torch.equal(subcomplex["high_indices"], torch.tensor([0, 0])) + assert torch.equal(subcomplex["binary_marking"], torch.tensor([1.0, 0.0])) + assert subcomplex["tuple_features"].shape == (2, 16) + + +def test_smcn_filters_to_incident_rank02_tuples_when_requested(): + """SMCN should keep only incident tuples in incident selection mode.""" + incidence_1 = torch.eye(2).to_sparse() + incidence_2 = torch.tensor([[1.0], [0.0]]).to_sparse() + batch = Data( + x_0=torch.ones(2, 8), + x_2=2 * torch.ones(1, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16, tuple_selection="incident") + + subcomplex = model.build_rank02_subcomplex(batch) + subcomplex = model.forward_rank02_subcomplex(batch, subcomplex) + + assert torch.equal(subcomplex["low_indices"], torch.tensor([0])) + assert torch.equal(subcomplex["high_indices"], torch.tensor([0])) + assert torch.equal(subcomplex["binary_marking"], torch.tensor([1.0])) + assert subcomplex["tuple_features"].shape == (1, 16) + + +def test_smcn_incident_selection_uses_sparse_incidence_pairs(): + """SMCN should skip non-incident rank-0/2 tuples in incident mode.""" + incidence_1 = torch.eye(4).to_sparse() + incidence_2 = torch.tensor( + [ + [1.0, 0.0], + [0.0, 0.0], + [0.0, 1.0], + [0.0, 1.0], + ] + ).to_sparse() + batch = Data( + x_0=torch.ones(4, 8), + x_2=2 * torch.ones(2, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN( + in_channels=8, + hidden_channels=16, + tuple_selection="incident", + ) + + subcomplex = model.build_rank02_subcomplex(batch) + + assert torch.equal(subcomplex["low_indices"], torch.tensor([0, 2, 3])) + assert torch.equal(subcomplex["high_indices"], torch.tensor([0, 1, 1])) + assert torch.equal(subcomplex["binary_marking"], torch.ones(3)) + + +def test_smcn_builds_rank02_subcomplex_edges(): + """SMCN should build tuple-level low, high, and incidence edge indices.""" + model = SMCN(in_channels=8, hidden_channels=16) + low_indices = torch.tensor([0, 0, 1]) + high_indices = torch.tensor([0, 1, 1]) + + edges = model.build_rank02_subcomplex_edges(low_indices, high_indices) + + assert torch.equal( + edges["edge_index_low_adjacency"], torch.tensor([[0, 1], [1, 0]]) + ) + assert torch.equal( + edges["edge_index_high_adjacency"], torch.tensor([[1, 2], [2, 1]]) + ) + assert torch.equal( + edges["edge_index_incidence"], torch.tensor([[0, 1, 2], [0, 1, 2]]) + ) + + +def test_smcn_builds_rank02_low_adjacency_bridge_indices(): + """SMCN should attach rank-1 bridge ids to rank-0/2 low-adjacency edges.""" + model = SMCN(in_channels=8, hidden_channels=16) + low_indices = torch.tensor([0, 1, 2]) + high_indices = torch.tensor([0, 0, 0]) + incidence_1 = torch.tensor( + [ + [1.0, 0.0, 1.0], + [1.0, 1.0, 0.0], + [0.0, 1.0, 1.0], + ] + ).to_sparse() + incidence_2 = torch.ones(3, 1).to_sparse() + + edges = model.build_rank02_subcomplex_edges( + low_indices, high_indices, incidence_1, incidence_2 + ) + + assert torch.equal( + edges["edge_index_low_adjacency"], + torch.tensor( + [ + [0, 1, 1, 2, 0, 2], + [1, 0, 2, 1, 2, 0], + ] + ), + ) + assert torch.equal( + edges["bridge_index_low_adjacency"], torch.tensor([0, 0, 1, 1, 2, 2]) + ) + + +def test_smcn_builds_rank02_high_adjacency_bridge_indices(): + """SMCN should attach rank-0 bridge ids to rank-0/2 high-adjacency edges.""" + model = SMCN(in_channels=8, hidden_channels=16) + low_indices = torch.tensor([0, 0]) + high_indices = torch.tensor([0, 1]) + incidence_1 = torch.tensor( + [ + [1.0, 1.0], + [1.0, 0.0], + [0.0, 1.0], + ] + ).to_sparse() + incidence_2 = torch.tensor( + [ + [1.0, 0.0], + [0.0, 1.0], + ] + ).to_sparse() + + edges = model.build_rank02_subcomplex_edges( + low_indices, high_indices, incidence_1, incidence_2 + ) + + assert torch.equal( + edges["edge_index_high_adjacency"], torch.tensor([[0, 1], [1, 0]]) + ) + assert torch.equal( + edges["bridge_index_high_adjacency"], torch.tensor([0, 0]) + ) + + +def test_smcn_builds_empty_rank02_subcomplex_edges(): + """SMCN should return empty edge indices when there are no tuples.""" + model = SMCN(in_channels=8, hidden_channels=16) + low_indices = torch.empty(0, dtype=torch.long) + high_indices = torch.empty(0, dtype=torch.long) + + edges = model.build_rank02_subcomplex_edges(low_indices, high_indices) + + assert edges["edge_index_low_adjacency"].shape == (2, 0) + assert edges["edge_index_high_adjacency"].shape == (2, 0) + assert edges["edge_index_incidence"].shape == (2, 0) + + +def test_smcn_rank02_subcomplex_includes_edge_indices(): + """SMCN rank-0/2 subcomplex output should include placeholder edge indices.""" + incidence_1 = torch.eye(2).to_sparse() + incidence_2 = torch.tensor([[1.0], [0.0]]).to_sparse() + batch = Data( + x_0=torch.ones(2, 8), + x_2=2 * torch.ones(1, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN(in_channels=8, hidden_channels=16) + + subcomplex = model.build_rank02_subcomplex(batch) + + assert "edge_index_low_adjacency" in subcomplex + assert "edge_index_high_adjacency" in subcomplex + assert "edge_index_incidence" in subcomplex + assert "tuple_features" not in subcomplex + + +def test_smcn_pools_empty_rank02_tuple_features_to_rank0(): + """SMCN should return zeros when there are no rank-0/2 tuples.""" + subcomplex = { + "tuple_features": torch.empty(0, 2), + "low_indices": torch.empty(0, dtype=torch.long), + } + + model = SMCN(in_channels=8, hidden_channels=16, tuple_pooling="sum") + pooled = model.pool_rank02_to_rank0(subcomplex, num_low_cells=3) + + assert torch.equal(pooled, torch.zeros(3, 2)) + + +def test_smcn_pools_rank02_tuple_features_to_rank2(): + """SMCN should sum tuple features back onto their rank-2 cells.""" + subcomplex = { + "tuple_features": torch.tensor( + [ + [1.0, 2.0], + [3.0, 4.0], + [5.0, 6.0], + ] + ), + "high_indices": torch.tensor([0, 1, 0]), + } + + model = SMCN(in_channels=8, hidden_channels=16, tuple_pooling="sum") + pooled = model.pool_rank02_to_rank2(subcomplex, num_high_cells=3) + + assert torch.equal( + pooled, + torch.tensor( + [ + [6.0, 8.0], + [3.0, 4.0], + [0.0, 0.0], + ] + ), + ) + + +def test_smcn_mean_pools_rank02_tuple_features_to_rank2(): + """SMCN should average tuple features back onto rank-2 cells.""" + subcomplex = { + "tuple_features": torch.tensor( + [ + [1.0, 2.0], + [3.0, 4.0], + [5.0, 6.0], + ] + ), + "high_indices": torch.tensor([0, 1, 0]), + } + + model = SMCN(in_channels=8, hidden_channels=16, tuple_pooling="mean") + pooled = model.pool_rank02_to_rank2(subcomplex, num_high_cells=3) + + assert torch.equal( + pooled, + torch.tensor( + [ + [3.0, 4.0], + [3.0, 4.0], + [0.0, 0.0], + ] + ), + ) + + +def test_smcn_pools_empty_rank02_tuple_features_to_rank2(): + """SMCN should return zeros when no rank-0/2 tuples pool to rank 2.""" + subcomplex = { + "tuple_features": torch.empty(0, 2), + "high_indices": torch.empty(0, dtype=torch.long), + } + + model = SMCN(in_channels=8, hidden_channels=16, tuple_pooling="sum") + pooled = model.pool_rank02_to_rank2(subcomplex, num_high_cells=3) + + assert torch.equal(pooled, torch.zeros(3, 2)) + + +def test_smcn_forward_updates_rank2_shape_with_subcomplex_signal(): + """SMCN should keep rank-2 outputs pipeline-shaped after rank-0/2 pooling.""" + incidence_1 = torch.eye(3).to_sparse() + incidence_2 = torch.ones(3, 2).to_sparse() + batch = Data( + x_0=torch.ones(3, 8), + x_1=torch.ones(3, 8), + x_2=2 * torch.ones(2, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN( + in_channels=8, + hidden_channels=16, + use_subcomplex_signal=True, + ) + + out = model(batch) + + assert out[0].shape == (3, 16) + assert out[2].shape == (2, 16) + + +def test_smcn_reuses_cached_rank02_subcomplex(monkeypatch): + """SMCN should cache structural rank-0/2 tensors for repeated batches.""" + incidence_1 = torch.eye(3).to_sparse() + incidence_2 = torch.ones(3, 2).to_sparse() + batch = Data( + x_0=torch.ones(3, 8), + x_2=2 * torch.ones(2, 8), + incidence_1=incidence_1, + incidence_2=incidence_2, + ) + model = SMCN( + in_channels=8, + hidden_channels=16, + tuple_selection="incident", + ) + calls = 0 + original_builder = model.build_rank02_subcomplex_edges + + def counting_builder(*args, **kwargs): + nonlocal calls + calls += 1 + return original_builder(*args, **kwargs) + + monkeypatch.setattr( + model, "build_rank02_subcomplex_edges", counting_builder + ) + + first = model.build_rank02_subcomplex(batch) + second = model.build_rank02_subcomplex(batch) + + assert calls == 1 + assert len(model._rank02_subcomplex_cache) == 1 + assert torch.equal(first["low_indices"], second["low_indices"]) + assert torch.equal(first["high_indices"], second["high_indices"]) + assert torch.equal( + first["edge_index_low_adjacency"], second["edge_index_low_adjacency"] + ) diff --git a/test/pipeline/test_pipeline.py b/test/pipeline/test_pipeline.py index a61165ae9..a2369a4ff 100644 --- a/test/pipeline/test_pipeline.py +++ b/test/pipeline/test_pipeline.py @@ -7,7 +7,7 @@ DATASET = "graph/MUTAG" # ADD YOUR DATASET HERE -MODELS = ["graph/gcn", "cell/topotune", "simplicial/topotune"] # ADD ONE OR SEVERAL MODELS +MODELS = ["graph/gcn", "cell/topotune", "simplicial/topotune", "combinatorial/smcn"] # ADD ONE OR SEVERAL MODELS class TestPipeline: diff --git a/topobench/nn/backbones/combinatorial/smcn.py b/topobench/nn/backbones/combinatorial/smcn.py new file mode 100644 index 000000000..dd1abe3da --- /dev/null +++ b/topobench/nn/backbones/combinatorial/smcn.py @@ -0,0 +1,1234 @@ +"""SMCN combinatorial backbone.""" + +from collections import OrderedDict + +import torch + + +class SubComplexRelationConv(torch.nn.Module): + """Message-passing block for one rank-0/2 subcomplex relation. + + Parameters + ---------- + channels : int + Number of input and output feature channels. + activation_layer : type[torch.nn.Module], optional + Activation module class used inside the update network. + aggregation : {"sum", "mean"}, optional + Reduction used for incoming relation messages. + use_bridge_features : bool, optional + Whether edge-aligned bridge-cell features are added to messages. + """ + + def __init__( + self, + channels, + activation_layer=torch.nn.ReLU, + aggregation="mean", + use_bridge_features=False, + ): + super().__init__() + if aggregation not in {"sum", "mean"}: + raise ValueError(f"Unsupported aggregation: {aggregation}") + self.aggregation = aggregation + self.use_bridge_features = use_bridge_features + self.message_linear = torch.nn.Linear(channels, channels) + self.bridge_linear = ( + torch.nn.Linear(channels, channels) + if use_bridge_features + else None + ) + self.update = torch.nn.Sequential( + torch.nn.Linear(channels, channels), + activation_layer(), + torch.nn.Linear(channels, channels), + ) + + def forward(self, tuple_features, edge_index, bridge_features=None): + """Aggregate relation messages into target tuple slots. + + Parameters + ---------- + tuple_features : torch.Tensor + Features associated with rank-0/2 tuples. + edge_index : torch.Tensor + Source and target tuple indices with shape ``[2, num_edges]``. + bridge_features : torch.Tensor or None, optional + Optional edge-aligned bridge-cell features. + + Returns + ------- + torch.Tensor + Updated tuple features. + """ + messages = self._aggregate_messages( + tuple_features, edge_index, bridge_features + ) + return self.update(messages) + + def _aggregate_messages( + self, tuple_features, edge_index, bridge_features=None + ): + """Aggregate transformed source messages into target tuple slots. + + Parameters + ---------- + tuple_features : torch.Tensor + Features associated with rank-0/2 tuples. + edge_index : torch.Tensor + Source and target tuple indices with shape ``[2, num_edges]``. + bridge_features : torch.Tensor or None, optional + Optional edge-aligned bridge-cell features. + + Returns + ------- + torch.Tensor + Aggregated messages for each tuple. + """ + if edge_index.numel() == 0: + return torch.zeros_like(tuple_features) + + source, target = edge_index + edge_messages = self.message_linear(tuple_features[source]) + if ( + self.use_bridge_features + and bridge_features is not None + and self.bridge_linear is not None + ): + edge_messages = edge_messages + self.bridge_linear(bridge_features) + + messages = tuple_features.new_zeros(tuple_features.shape) + messages.index_add_(0, target, edge_messages) + if self.aggregation == "mean": + counts = tuple_features.new_zeros(tuple_features.size(0)) + counts.index_add_( + 0, target, tuple_features.new_ones(target.size(0)) + ) + messages = messages / counts.clamp_min(1).unsqueeze(-1) + + return messages + + +class SubComplexLayer(torch.nn.Module): + """SCL-style layer for rank-0/2 subcomplex tuple features. + + The reference SMCN layer separates low-adjacency, high-adjacency, and + incidence tuple messages. TopoBench batches do not directly store SMCN + subcomplex tensors, so this layer consumes the tuple graph built by + :class:`SMCN` and keeps each relation in a separate message-passing block. + + Parameters + ---------- + channels : int + Number of input and output tuple feature channels. + activation_layer : type[torch.nn.Module], optional + Activation module class used by relation updates. + aggregation : {"sum", "mean"}, optional + Reduction used for incoming relation messages. + """ + + def __init__( + self, channels, activation_layer=torch.nn.ReLU, aggregation="mean" + ): + super().__init__() + if aggregation not in {"sum", "mean"}: + raise ValueError(f"Unsupported aggregation: {aggregation}") + self.aggregation = aggregation + self.self_linear = torch.nn.Linear(channels, channels) + self.low_conv = SubComplexRelationConv( + channels, + activation_layer, + aggregation, + use_bridge_features=True, + ) + self.high_conv = SubComplexRelationConv( + channels, + activation_layer, + aggregation, + use_bridge_features=True, + ) + self.incidence_conv = SubComplexRelationConv( + channels, + activation_layer, + aggregation, + ) + self.activation = activation_layer() + + def forward( + self, + tuple_features, + edge_index_low_adjacency, + edge_index_high_adjacency, + edge_index_incidence, + low_bridge_features=None, + high_bridge_features=None, + ): + """Update tuple features using relation-specific subcomplex edges. + + Parameters + ---------- + tuple_features : torch.Tensor + Features associated with rank-0/2 tuples. + edge_index_low_adjacency : torch.Tensor + Tuple edges for low-cell adjacency. + edge_index_high_adjacency : torch.Tensor + Tuple edges for high-cell adjacency. + edge_index_incidence : torch.Tensor + Tuple self-edges carrying incidence markings. + low_bridge_features : torch.Tensor or None, optional + Optional bridge features for low-adjacency tuple edges. + high_bridge_features : torch.Tensor or None, optional + Optional bridge features for high-adjacency tuple edges. + + Returns + ------- + torch.Tensor + Updated tuple features. + """ + low_messages = self.low_conv( + tuple_features, + edge_index_low_adjacency, + bridge_features=low_bridge_features, + ) + high_messages = self.high_conv( + tuple_features, + edge_index_high_adjacency, + bridge_features=high_bridge_features, + ) + incidence_messages = self.incidence_conv( + tuple_features, edge_index_incidence + ) + + updates = ( + self.self_linear(tuple_features) + + low_messages + + high_messages + + incidence_messages + ) + + return self.activation(updates) + + def _aggregate_relation_messages( + self, + tuple_features, + edge_index, + bridge_features=None, + bridge_linear=None, + ): + """Aggregate source tuple messages plus optional edge bridge features. + + Parameters + ---------- + tuple_features : torch.Tensor + Features associated with rank-0/2 tuples. + edge_index : torch.Tensor + Source and target tuple indices with shape ``[2, num_edges]``. + bridge_features : torch.Tensor or None, optional + Optional edge-aligned bridge-cell features. + bridge_linear : torch.nn.Linear or None, optional + Optional projection applied to bridge features. + + Returns + ------- + torch.Tensor + Aggregated relation messages. + """ + if bridge_linear is not None and bridge_features is not None: + bridge_features = bridge_linear(bridge_features) + return self.low_conv._aggregate_messages( + tuple_features, edge_index, bridge_features + ) + + def _aggregate(self, features, edge_index): + """Aggregate source tuple features into target tuple slots. + + Parameters + ---------- + features : torch.Tensor + Source tuple features. + edge_index : torch.Tensor + Source and target tuple indices with shape ``[2, num_edges]``. + + Returns + ------- + torch.Tensor + Aggregated features for each tuple. + """ + return self._aggregate_relation_messages(features, edge_index) + + def _aggregate_edge_features(self, edge_features, edge_index, num_tuples): + """Aggregate edge-aligned features into target tuple slots. + + Parameters + ---------- + edge_features : torch.Tensor + Features aligned with tuple edges. + edge_index : torch.Tensor + Source and target tuple indices with shape ``[2, num_edges]``. + num_tuples : int + Number of target tuple slots. + + Returns + ------- + torch.Tensor + Aggregated edge features for each tuple. + """ + messages = edge_features.new_zeros( + (num_tuples, edge_features.size(-1)) + ) + if edge_index.numel() == 0 or edge_features.numel() == 0: + return messages + + target = edge_index[1] + messages.index_add_(0, target, edge_features) + if self.aggregation == "mean": + counts = edge_features.new_zeros(num_tuples) + counts.index_add_( + 0, target, edge_features.new_ones(target.size(0)) + ) + messages = messages / counts.clamp_min(1).unsqueeze(-1) + + return messages + + +class SMCN(torch.nn.Module): + """Scalable Multi-Cellular Network backbone for combinatorial batches. + + Parameters + ---------- + in_channels : int + Input feature dimension for every available cell rank. + hidden_channels : int + Hidden feature dimension returned for every available cell rank. + neighborhoods : list[str] or None, optional + Neighborhood names kept for compatibility with TopoBench configs. + layers : int, optional + Number of placeholder rank-wise linear layers. + activation : {"relu", "gelu", "tanh", "identity"} or None, optional + Activation used after placeholder linear layers. + use_subcomplex_signal : bool, optional + Whether to add rank-0/2 tuple signals to rank-wise outputs. + tuple_pooling : {"sum", "mean"}, optional + Reduction used when tuple features are pooled back to cells. + tuple_selection : {"all", "incident"}, optional + Strategy used to choose rank-0/2 tuples. + marking_embed_dim : int, optional + Embedding size for binary tuple markings. A value of zero uses the raw + scalar marking. + subcomplex_aggregation : {"sum", "mean"}, optional + Reduction used inside subcomplex relation message passing. + max_rank02_tuples : int or None, optional + Optional cap on the number of rank-0/2 tuples. + """ + + def __init__( + self, + in_channels, + hidden_channels, + neighborhoods=None, + layers=1, + activation="relu", + use_subcomplex_signal=False, + tuple_pooling="sum", + tuple_selection="all", + marking_embed_dim=0, + subcomplex_aggregation="mean", + max_rank02_tuples=None, + ): + super().__init__() + self.hidden_channels = hidden_channels + self.neighborhoods = neighborhoods or [] + self.layers = layers + self.use_subcomplex_signal = use_subcomplex_signal + self.rank02_low_bridge_encoder = torch.nn.Linear( + in_channels, hidden_channels + ) + self.rank02_high_bridge_encoder = torch.nn.Linear( + in_channels, hidden_channels + ) + if tuple_pooling not in {"sum", "mean"}: + raise ValueError(f"Unsupported tuple_pooling: {tuple_pooling}") + self.tuple_pooling = tuple_pooling + + if tuple_selection not in {"all", "incident"}: + raise ValueError(f"Unsupported tuple_selection: {tuple_selection}") + self.tuple_selection = tuple_selection + + if subcomplex_aggregation not in {"sum", "mean"}: + raise ValueError( + f"Unsupported subcomplex_aggregation: {subcomplex_aggregation}" + ) + self.subcomplex_aggregation = subcomplex_aggregation + + activation_layer = self._get_activation(activation) + self.rank_updates = torch.nn.ModuleDict( + { + str(rank): self._make_rank_update( + in_channels, hidden_channels, layers, activation_layer + ) + for rank in range(3) + } + ) + if marking_embed_dim < 0: + raise ValueError( + f"marking_embed_dim must be non-negative, got {marking_embed_dim}" + ) + self.marking_embed_dim = marking_embed_dim + + marking_channels = marking_embed_dim if marking_embed_dim > 0 else 1 + self.rank02_marking_embed = ( + torch.nn.Embedding(2, marking_embed_dim) + if marking_embed_dim > 0 + else None + ) + + self.rank02_tuple_encoder = torch.nn.Linear( + 2 * in_channels + marking_channels, + hidden_channels, + ) + + if use_subcomplex_signal: + self.rank02_tuple_update = SubComplexLayer( + hidden_channels, + activation_layer, + aggregation=subcomplex_aggregation, + ) + else: + self.rank02_tuple_update = self._make_rank_update( + hidden_channels, hidden_channels, layers, activation_layer + ) + + if max_rank02_tuples is not None and max_rank02_tuples <= 0: + raise ValueError( + f"max_rank02_tuples must be positive, got {max_rank02_tuples}" + ) + self.max_rank02_tuples = max_rank02_tuples + self._rank02_subcomplex_cache = OrderedDict() + self._max_rank02_subcomplex_cache_size = 128 + + @staticmethod + def _get_activation(name): + """Return the activation module class for a config name. + + Parameters + ---------- + name : str or None + Activation identifier from the model config. + + Returns + ------- + type[torch.nn.Module] + Activation module class. + """ + activations = { + "relu": torch.nn.ReLU, + "gelu": torch.nn.GELU, + "tanh": torch.nn.Tanh, + "identity": torch.nn.Identity, + None: torch.nn.Identity, + } + if name not in activations: + raise ValueError(f"Unsupported activation: {name}") + return activations[name] + + @staticmethod + def _make_rank_update( + in_channels, hidden_channels, layers, activation_layer + ): + """Build a placeholder rank-wise update network. + + Parameters + ---------- + in_channels : int + Input feature dimension. + hidden_channels : int + Output feature dimension. + layers : int + Number of linear layers to apply. + activation_layer : type[torch.nn.Module] + Activation module class inserted after each linear layer, except + for identity activations. + + Returns + ------- + torch.nn.Sequential + Sequential placeholder update network. + """ + modules = [] + current_channels = in_channels + for _layer_idx in range(max(layers, 1)): + modules.append(torch.nn.Linear(current_channels, hidden_channels)) + current_channels = hidden_channels + if activation_layer is not torch.nn.Identity: + modules.append(activation_layer()) + return torch.nn.Sequential(*modules) + + @staticmethod + def _sparse_structure_signature(tensor): + """Create a hashable signature for a sparse incidence structure. + + Parameters + ---------- + tensor : torch.Tensor + Sparse structural tensor to summarize. + + Returns + ------- + tuple + Hashable shape and index signature. + """ + tensor = tensor.coalesce() + indices = tensor.indices().detach().cpu().reshape(-1).tolist() + return tuple(tensor.size()), tuple(indices) + + @staticmethod + def _dense_structure_signature(tensor): + """Create a hashable signature for a dense structural vector. + + Parameters + ---------- + tensor : torch.Tensor + Dense structural tensor to summarize. + + Returns + ------- + tuple + Hashable flattened-value signature. + """ + return tuple(tensor.detach().cpu().reshape(-1).tolist()) + + def _rank02_subcomplex_cache_key( + self, batch, incidence_1, incidence_2, num_low_cells, num_high_cells + ): + """Build a cache key for rank-0/2 structural tensors. + + Parameters + ---------- + batch : torch_geometric.data.Data + TopoBench batch containing optional graph assignment vectors. + incidence_1 : torch.Tensor + Sparse vertex-edge incidence matrix. + incidence_2 : torch.Tensor + Sparse edge-face incidence matrix. + num_low_cells : int + Number of rank-0 cells. + num_high_cells : int + Number of rank-2 cells. + + Returns + ------- + tuple + Hashable cache key for the structural subcomplex tensors. + """ + key = ( + self.tuple_selection, + self.max_rank02_tuples, + num_low_cells, + num_high_cells, + self._sparse_structure_signature(incidence_1), + self._sparse_structure_signature(incidence_2), + ) + if self.tuple_selection == "all" and hasattr(batch, "batch_0"): + key = (*key, self._dense_structure_signature(batch.batch_0)) + if self.tuple_selection == "all" and hasattr(batch, "batch_2"): + key = (*key, self._dense_structure_signature(batch.batch_2)) + return key + + def _get_cached_rank02_subcomplex(self, cache_key, device): + """Return cached rank-0/2 structure on the requested device. + + Parameters + ---------- + cache_key : tuple + Key created from rank-0/2 structural tensors. + device : torch.device + Device where returned tensors should live. + + Returns + ------- + dict[str, torch.Tensor] or None + Cached subcomplex tensors, or ``None`` when the key is absent. + """ + cached = self._rank02_subcomplex_cache.get(cache_key) + if cached is None: + return None + self._rank02_subcomplex_cache.move_to_end(cache_key) + return {name: tensor.to(device) for name, tensor in cached.items()} + + def _cache_rank02_subcomplex(self, cache_key, subcomplex): + """Store bounded rank-0/2 structural tensors for repeated batches. + + Parameters + ---------- + cache_key : tuple + Key created from rank-0/2 structural tensors. + subcomplex : dict[str, torch.Tensor] + Structural subcomplex tensors to cache. + """ + self._rank02_subcomplex_cache[cache_key] = { + name: tensor.detach() for name, tensor in subcomplex.items() + } + self._rank02_subcomplex_cache.move_to_end(cache_key) + while ( + len(self._rank02_subcomplex_cache) + > self._max_rank02_subcomplex_cache_size + ): + self._rank02_subcomplex_cache.popitem(last=False) + + @staticmethod + def _lookup_sparse_binary_marking(incidence, low_indices, high_indices): + """Look up binary incidence values for selected sparse matrix entries. + + Parameters + ---------- + incidence : torch.Tensor + Sparse rank-0 to rank-2 incidence matrix. + low_indices : torch.Tensor + Rank-0 tuple indices. + high_indices : torch.Tensor + Rank-2 tuple indices. + + Returns + ------- + torch.Tensor + Binary marking for each selected tuple. + """ + if low_indices.numel() == 0: + return torch.empty( + 0, dtype=incidence.dtype, device=low_indices.device + ) + + incidence = incidence.coalesce() + if incidence._nnz() == 0: + return torch.zeros( + low_indices.size(0), + dtype=incidence.dtype, + device=low_indices.device, + ) + + num_high_cells = incidence.size(1) + tuple_keys = low_indices * num_high_cells + high_indices + incident_indices = incidence.indices() + incident_keys = ( + incident_indices[0] * num_high_cells + incident_indices[1] + ).unique(sorted=True) + positions = torch.searchsorted(incident_keys, tuple_keys) + in_bounds = positions < incident_keys.numel() + + markings = torch.zeros( + tuple_keys.size(0), dtype=incidence.dtype, device=tuple_keys.device + ) + markings[in_bounds] = ( + incident_keys[positions[in_bounds]] == tuple_keys[in_bounds] + ).to(incidence.dtype) + return markings + + def forward(self, batch): + """Apply rank-wise updates and optional subcomplex signal. + + Parameters + ---------- + batch : torch_geometric.data.Data + TopoBench combinatorial batch. + + Returns + ------- + dict[int, torch.Tensor] + Updated cell features keyed by rank. + """ + outputs = {} + for rank in range(3): + x = getattr(batch, f"x_{rank}", None) + if x is not None: + outputs[rank] = self.rank_updates[str(rank)](x) + + if ( + self.use_subcomplex_signal + and 0 in outputs + and hasattr(batch, "incidence_1") + and hasattr(batch, "incidence_2") + and hasattr(batch, "x_0") + and hasattr(batch, "x_2") + ): + subcomplex = self.build_rank02_subcomplex(batch) + subcomplex = self.forward_rank02_subcomplex(batch, subcomplex) + pooled_rank0 = self.pool_rank02_to_rank0( + subcomplex, num_low_cells=batch.x_0.size(0) + ) + if pooled_rank0.shape == outputs[0].shape: + outputs[0] = outputs[0] + pooled_rank0 + + pooled_rank2 = self.pool_rank02_to_rank2( + subcomplex, num_high_cells=batch.x_2.size(0) + ) + if 2 in outputs and pooled_rank2.shape == outputs[2].shape: + outputs[2] = outputs[2] + pooled_rank2 + + return outputs + + def build_rank02_subcomplex(self, batch): + """Build the rank-0/2 subcomplex from incidence matrices. + + Parameters + ---------- + batch : torch_geometric.data.Data + TopoBench combinatorial batch with ``incidence_1``, + ``incidence_2``, ``x_0``, and ``x_2`` attributes. + + Returns + ------- + dict[str, torch.Tensor] + Rank-0/2 subcomplex indices, markings, and tuple edge structures. + """ + if not hasattr(batch, "incidence_1") or not hasattr( + batch, "incidence_2" + ): + raise ValueError( + "Batch must have incidence_1 and incidence_2 attributes." + ) + if not hasattr(batch, "x_0") or not hasattr(batch, "x_2"): + raise ValueError("Batch must have x_0 and x_2 attributes.") + + incidence_1 = abs(batch.incidence_1).coalesce() + incidence_2 = abs(batch.incidence_2).coalesce() + incidence_device = incidence_1.device + if incidence_device.type == "cuda": + incidence_1 = incidence_1.cpu() + incidence_2 = incidence_2.cpu() + + num_low_cells = batch.x_0.size(0) + num_high_cells = batch.x_2.size(0) + device = batch.x_0.device + cache_key = self._rank02_subcomplex_cache_key( + batch, + incidence_1, + incidence_2, + num_low_cells, + num_high_cells, + ) + cached_subcomplex = self._get_cached_rank02_subcomplex( + cache_key, device + ) + if cached_subcomplex is not None: + return cached_subcomplex + + incidence_0_2 = torch.sparse.mm(incidence_1, incidence_2).coalesce() + if incidence_0_2._nnz() > 0: + incidence_0_2 = torch.sparse_coo_tensor( + incidence_0_2.indices(), + torch.ones_like(incidence_0_2.values()), + incidence_0_2.size(), + device=incidence_0_2.device, + ).coalesce() + incidence_0_2 = incidence_0_2.to(incidence_device) + + if ( + incidence_0_2.size(0) != num_low_cells + or incidence_0_2.size(1) != num_high_cells + ): + raise ValueError( + "Incidence matrix shape mismatch: " + f"expected ({num_low_cells}, {num_high_cells}), " + f"got {incidence_0_2.size()}" + ) + + if self.tuple_selection == "incident": + low_indices, high_indices = incidence_0_2.indices().to(device) + binary_marking = torch.ones( + low_indices.size(0), + dtype=incidence_0_2.dtype, + device=device, + ) + else: + low_indices = torch.arange( + num_low_cells, device=device + ).repeat_interleave(num_high_cells) + high_indices = torch.arange(num_high_cells, device=device).repeat( + num_low_cells + ) + + if hasattr(batch, "batch_0") and hasattr(batch, "batch_2"): + same_graph = ( + batch.batch_0[low_indices] == batch.batch_2[high_indices] + ) + low_indices = low_indices[same_graph] + high_indices = high_indices[same_graph] + + binary_marking = self._lookup_sparse_binary_marking( + incidence_0_2, low_indices, high_indices + ) + + if self.max_rank02_tuples is not None: + low_indices = low_indices[: self.max_rank02_tuples] + high_indices = high_indices[: self.max_rank02_tuples] + binary_marking = binary_marking[: self.max_rank02_tuples] + + subcomplex_edges = self.build_rank02_subcomplex_edges( + low_indices, + high_indices, + getattr(batch, "incidence_1", None), + getattr(batch, "incidence_2", None), + ) + + subcomplex = { + "incidence_0_2": incidence_0_2, + "low_indices": low_indices, + "high_indices": high_indices, + "binary_marking": binary_marking, + **subcomplex_edges, + } + self._cache_rank02_subcomplex(cache_key, subcomplex) + return subcomplex + + def forward_rank02_subcomplex(self, batch, subcomplex): + """Encode and update rank-0/2 tuple features for a subcomplex. + + Parameters + ---------- + batch : torch_geometric.data.Data + TopoBench combinatorial batch containing cell features. + subcomplex : dict[str, torch.Tensor] + Rank-0/2 subcomplex structure from ``build_rank02_subcomplex``. + + Returns + ------- + dict[str, torch.Tensor] + Subcomplex dictionary with updated tuple features added. + """ + low_indices = subcomplex["low_indices"] + high_indices = subcomplex["high_indices"] + binary_marking = subcomplex["binary_marking"] + tuple_features = self.encode_rank02_tuple_features( + batch, low_indices, high_indices, binary_marking + ) + low_bridge_features = self._gather_bridge_features( + batch, + "x_1", + subcomplex.get("bridge_index_low_adjacency"), + subcomplex["edge_index_low_adjacency"], + ) + high_bridge_features = self._gather_bridge_features( + batch, + "x_0", + subcomplex.get("bridge_index_high_adjacency"), + subcomplex["edge_index_high_adjacency"], + ) + + if low_bridge_features is not None: + low_bridge_features = self.rank02_low_bridge_encoder( + low_bridge_features + ) + + if high_bridge_features is not None: + high_bridge_features = self.rank02_high_bridge_encoder( + high_bridge_features + ) + if self.use_subcomplex_signal: + tuple_features = self.rank02_tuple_update( + tuple_features, + subcomplex["edge_index_low_adjacency"], + subcomplex["edge_index_high_adjacency"], + subcomplex["edge_index_incidence"], + low_bridge_features=low_bridge_features, + high_bridge_features=high_bridge_features, + ) + else: + tuple_features = self.rank02_tuple_update(tuple_features) + + return { + **subcomplex, + "tuple_features": tuple_features, + } + + def _gather_bridge_features( + self, batch, feature_name, bridge_indices, edge_index + ): + """Gather bridge-cell features when every tuple edge has a bridge. + + Parameters + ---------- + batch : torch_geometric.data.Data + TopoBench combinatorial batch containing bridge features. + feature_name : str + Name of the batch feature tensor to gather from. + bridge_indices : torch.Tensor or None + Bridge-cell indices aligned with tuple edges. + edge_index : torch.Tensor + Tuple edge index used to validate bridge alignment. + + Returns + ------- + torch.Tensor or None + Edge-aligned bridge features, or ``None`` when unavailable. + """ + if bridge_indices is None or not hasattr(batch, feature_name): + return None + if ( + bridge_indices.numel() == 0 + or bridge_indices.numel() != edge_index.size(1) + ): + return None + bridge_features = getattr(batch, feature_name)[bridge_indices] + return bridge_features + + def pool_rank02_to_rank0(self, subcomplex, num_low_cells): + """Pool rank-0/2 tuple features back to rank-0 cells. + + Parameters + ---------- + subcomplex : dict[str, torch.Tensor] + Subcomplex dictionary containing tuple features and low indices. + num_low_cells : int + Number of rank-0 cells in the batch. + + Returns + ------- + torch.Tensor + Pooled rank-0 cell features. + """ + tuple_features = subcomplex["tuple_features"] + low_indices = subcomplex["low_indices"] + pooled = tuple_features.new_zeros( + (num_low_cells, tuple_features.size(-1)) + ) + if tuple_features.numel() == 0: + return pooled + + pooled = pooled.index_add(0, low_indices, tuple_features) + if self.tuple_pooling == "mean": + counts = tuple_features.new_zeros(num_low_cells) + counts = counts.index_add( + 0, + low_indices, + tuple_features.new_ones(low_indices.size(0)), + ) + pooled = pooled / counts.clamp_min(1).unsqueeze(-1) + + return pooled + + def pool_rank02_to_rank2(self, subcomplex, num_high_cells): + """Pool rank-0/2 tuple features back to rank-2 cells. + + Parameters + ---------- + subcomplex : dict[str, torch.Tensor] + Subcomplex dictionary containing tuple features and high indices. + num_high_cells : int + Number of rank-2 cells in the batch. + + Returns + ------- + torch.Tensor + Pooled rank-2 cell features. + """ + tuple_features = subcomplex["tuple_features"] + high_indices = subcomplex["high_indices"] + pooled = tuple_features.new_zeros( + (num_high_cells, tuple_features.size(-1)) + ) + if tuple_features.numel() == 0: + return pooled + + pooled = pooled.index_add(0, high_indices, tuple_features) + if self.tuple_pooling == "mean": + counts = tuple_features.new_zeros(num_high_cells) + counts = counts.index_add( + 0, + high_indices, + tuple_features.new_ones(high_indices.size(0)), + ) + pooled = pooled / counts.clamp_min(1).unsqueeze(-1) + return pooled + + def encode_rank02_tuple_features( + self, batch, low_indices, high_indices, binary_marking + ): + """Encode rank-0/2 tuple features from indices and markings. + + Parameters + ---------- + batch : torch_geometric.data.Data + TopoBench combinatorial batch containing ``x_0`` and ``x_2``. + low_indices : torch.Tensor + Rank-0 tuple indices. + high_indices : torch.Tensor + Rank-2 tuple indices. + binary_marking : torch.Tensor + Binary incidence marking for each tuple. + + Returns + ------- + torch.Tensor + Encoded tuple features. + """ + marking_features = self.encode_rank02_marking(binary_marking) + tuple_inputs = torch.cat( + [ + batch.x_0[low_indices], + batch.x_2[high_indices], + marking_features, + ], + dim=-1, + ) + tuple_features = self.rank02_tuple_encoder(tuple_inputs) + return tuple_features + + def encode_rank02_marking(self, binary_marking): + """Encode rank-0/2 binary marking into a feature vector. + + Parameters + ---------- + binary_marking : torch.Tensor + Binary incidence marking for each tuple. + + Returns + ------- + torch.Tensor + Raw scalar or embedded marking features. + """ + if self.rank02_marking_embed is None: + return binary_marking.unsqueeze(-1).to(torch.float32) + return self.rank02_marking_embed(binary_marking.long()) + + def build_rank02_subcomplex_edges( + self, low_indices, high_indices, incidence_1=None, incidence_2=None + ): + """Build tuple-level edge indices for rank-0/2 subcomplexes. + + Parameters + ---------- + low_indices : torch.Tensor + Rank-0 tuple indices. + high_indices : torch.Tensor + Rank-2 tuple indices. + incidence_1 : torch.Tensor or None, optional + Sparse vertex-edge incidence matrix used for bridge-aware low + adjacency edges. + incidence_2 : torch.Tensor or None, optional + Sparse edge-face incidence matrix used for bridge-aware high + adjacency edges. + + Returns + ------- + dict[str, torch.Tensor] + Tuple edge indices and bridge indices for subcomplex relations. + """ + device = low_indices.device + num_tuples = low_indices.numel() + empty_edge_index = torch.empty((2, 0), dtype=torch.long, device=device) + empty_bridge_index = torch.empty(0, dtype=torch.long, device=device) + tuple_ids = torch.arange(num_tuples, device=device) + edge_index_incidence = torch.stack([tuple_ids, tuple_ids]) + + def shared_cell_edges(cell_indices): + """Build tuple edges between tuples sharing one cell. + + Parameters + ---------- + cell_indices : torch.Tensor + Cell index assigned to each tuple. + + Returns + ------- + torch.Tensor + Directed tuple edges with shape ``[2, num_edges]``. + """ + edge_chunks = [] + for cell_id in cell_indices.unique(): + group = tuple_ids[cell_indices == cell_id] + if group.numel() < 2: + continue + pairs = torch.combinations(group, r=2).t() + edge_chunks.append(torch.cat([pairs, pairs.flip(0)], dim=1)) + return ( + torch.cat(edge_chunks, dim=1) + if edge_chunks + else empty_edge_index + ) + + def low_adjacency_edges_with_bridges(incidence_1, incidence_2): + """Build low-adjacency tuple edges and edge bridges. + + Parameters + ---------- + incidence_1 : torch.Tensor or None + Sparse vertex-edge incidence matrix. + incidence_2 : torch.Tensor or None + Sparse edge-face incidence matrix. + + Returns + ------- + tuple[torch.Tensor, torch.Tensor] + Tuple edge index and aligned rank-1 bridge indices. + """ + if incidence_1 is None or incidence_2 is None: + return shared_cell_edges(low_indices), empty_bridge_index + + incidence_1 = incidence_1.coalesce() + incidence_2 = incidence_2.coalesce() + incidence_1_indices = incidence_1.indices() + incidence_2_indices = incidence_2.indices() + + tuple_lookup = { + (int(low_id), int(high_id)): int(tuple_id) + for tuple_id, (low_id, high_id) in enumerate( + zip( + low_indices.tolist(), + high_indices.tolist(), + strict=True, + ) + ) + } + vertices_by_edge = {} + for vertex_id, edge_id in zip( + incidence_1_indices[0].tolist(), + incidence_1_indices[1].tolist(), + strict=True, + ): + vertices_by_edge.setdefault(edge_id, []).append(vertex_id) + + edges_by_face = {} + for edge_id, face_id in zip( + incidence_2_indices[0].tolist(), + incidence_2_indices[1].tolist(), + strict=True, + ): + edges_by_face.setdefault(face_id, []).append(edge_id) + + edge_chunks = [] + bridge_chunks = [] + for face_id in high_indices.unique().tolist(): + for edge_id in edges_by_face.get(face_id, []): + tuple_group = [ + tuple_lookup[(vertex_id, face_id)] + for vertex_id in vertices_by_edge.get(edge_id, []) + if (vertex_id, face_id) in tuple_lookup + ] + if len(tuple_group) < 2: + continue + pairs = torch.combinations( + torch.tensor( + tuple_group, dtype=torch.long, device=device + ), + r=2, + ).t() + directed_pairs = torch.cat([pairs, pairs.flip(0)], dim=1) + edge_chunks.append(directed_pairs) + bridge_chunks.append( + torch.full( + (directed_pairs.size(1),), + edge_id, + dtype=torch.long, + device=device, + ) + ) + + if not edge_chunks: + return empty_edge_index, empty_bridge_index + return torch.cat(edge_chunks, dim=1), torch.cat(bridge_chunks) + + def high_adjacency_edges_with_bridges(incidence_1, incidence_2): + """Build high-adjacency tuple edges and edge bridges. + + Parameters + ---------- + incidence_1 : torch.Tensor or None + Sparse vertex-edge incidence matrix. + incidence_2 : torch.Tensor or None + Sparse edge-face incidence matrix. + + Returns + ------- + tuple[torch.Tensor, torch.Tensor] + Tuple edge index and aligned rank-0 bridge indices. + """ + if incidence_1 is None or incidence_2 is None: + return shared_cell_edges(high_indices), empty_bridge_index + + incidence_1 = incidence_1.coalesce() + incidence_2 = incidence_2.coalesce() + incidence_1_indices = incidence_1.indices() + incidence_2_indices = incidence_2.indices() + + tuple_lookup = { + (int(low_id), int(high_id)): int(tuple_id) + for tuple_id, (low_id, high_id) in enumerate( + zip( + low_indices.tolist(), + high_indices.tolist(), + strict=True, + ) + ) + } + edges_by_vertex = {} + for vertex_id, edge_id in zip( + incidence_1_indices[0].tolist(), + incidence_1_indices[1].tolist(), + strict=True, + ): + edges_by_vertex.setdefault(vertex_id, []).append(edge_id) + + faces_by_edge = {} + for edge_id, face_id in zip( + incidence_2_indices[0].tolist(), + incidence_2_indices[1].tolist(), + strict=True, + ): + faces_by_edge.setdefault(edge_id, []).append(face_id) + + edge_chunks = [] + bridge_chunks = [] + for vertex_id in low_indices.unique().tolist(): + edge_ids = edges_by_vertex.get(vertex_id, []) + if not edge_ids: + continue + face_ids = sorted( + { + face_id + for edge_id in edge_ids + for face_id in faces_by_edge.get(edge_id, []) + } + ) + tuple_group = [ + tuple_lookup[(vertex_id, face_id)] + for face_id in face_ids + if (vertex_id, face_id) in tuple_lookup + ] + if len(tuple_group) < 2: + continue + pairs = torch.combinations( + torch.tensor(tuple_group, dtype=torch.long, device=device), + r=2, + ).t() + directed_pairs = torch.cat([pairs, pairs.flip(0)], dim=1) + edge_chunks.append(directed_pairs) + bridge_chunks.append( + torch.full( + (directed_pairs.size(1),), + vertex_id, + dtype=torch.long, + device=device, + ) + ) + + if not edge_chunks: + return empty_edge_index, empty_bridge_index + return torch.cat(edge_chunks, dim=1), torch.cat(bridge_chunks) + + ( + edge_index_low_adjacency, + bridge_index_low_adjacency, + ) = low_adjacency_edges_with_bridges(incidence_1, incidence_2) + + ( + edge_index_high_adjacency, + bridge_index_high_adjacency, + ) = high_adjacency_edges_with_bridges(incidence_1, incidence_2) + + return { + "edge_index_low_adjacency": edge_index_low_adjacency, + "edge_index_high_adjacency": edge_index_high_adjacency, + "edge_index_incidence": edge_index_incidence, + "bridge_index_low_adjacency": bridge_index_low_adjacency, + "bridge_index_high_adjacency": bridge_index_high_adjacency, + }