| # CS3319 Project 2 — System architecture (D2) |
| # Layered view of the two-stage stacking system + the shared infrastructure |
| # (deterministic split, feature cache, two load_module shared libraries). |
| # Render: d2 architecture.d2 ../svg/architecture.svg |
|
|
| direction: down |
|
|
| classes: { |
| layer_data: { style.fill: "#eef4fb"; style.stroke: "#3b6ea8"; style.stroke-width: 1 } |
| layer_split: { style.fill: "#fff4e6"; style.stroke: "#d98c00"; style.stroke-width: 1 } |
| layer_stage1: { style.fill: "#eafaf0"; style.stroke: "#1e8449"; style.stroke-width: 1 } |
| layer_contrib: { style.fill: "#fdecea"; style.stroke: "#c0392b"; style.stroke-width: 2 } |
| layer_stage2: { style.fill: "#f3eafd"; style.stroke: "#6c3baa"; style.stroke-width: 1 } |
| layer_decide: { style.fill: "#e8f8f8"; style.stroke: "#117a8b"; style.stroke-width: 1 } |
| layer_out: { style.fill: "#e9ecef"; style.stroke: "#495057"; style.stroke-width: 1 } |
| shared: { style.stroke-dash: 4; style.fill: "#f7f7f7"; style.stroke: "#888888" } |
| } |
|
|
| Data Layer: { |
| style.fill: "#fbfcfe" |
| shape: rectangle |
| bipartite train: "bipartite_train\n682,421 author→paper" {class: layer_data; shape: page} |
| co-author: "author_file\n9,663 edges" {class: layer_data; shape: page} |
| citation: "paper_file\n327,113 edges" {class: layer_data; shape: page} |
| use: "feature.pkl\n79,937×512 USE" {class: layer_data; shape: page} |
| test: "bipartite_test\n2,047,262 pairs" {class: layer_data; shape: page} |
| } |
|
|
| Deterministic Split: "make_notebook_style_split\nseed=202 · 90/10\n→ 136,484 pairs (1:1)" { |
| class: layer_split |
| shape: hexagon |
| } |
|
|
| Stage-1 Suite: { |
| style.fill: "#f6fdf8" |
| shape: rectangle |
| LightGCN: "LightGCN ensemble\nBPR + hard neg" {class: layer_stage1} |
| BPR-MF: "BPR-MF (dim 256)" {class: layer_stage1} |
| Content: "Content mean-cos\n+ rich (18-d)" {class: layer_stage1} |
| Random Walk: "7× DeepWalk/Node2Vec\n+ aggregate" {class: layer_stage1} |
| Explicit Graph: "Explicit graph / meta-path\n18-d + rank 4-d" {class: layer_stage1} |
| High-order: "High-order citation propagation\nH_k=R·C^k ; G_k=S·R·C^k\nundir 24-d + dir 45-d" {class: layer_contrib} |
| } |
|
|
| Stage-2 Meta-learner: { |
| style.fill: "#faf7fe" |
| shape: rectangle |
| Feature vector: "259-dim feature vector\n(feature_cache)" {class: layer_stage2; shape: cylinder} |
| LightGBM: "LightGBM\n5-fold OOF · best_f1" {class: layer_stage2} |
| } |
|
|
| Decision: "Rank cutoff top 50%\n+ force train/test-known = 1" { |
| class: layer_decide |
| shape: diamond |
| } |
|
|
| Output: "Submission CSV (Index, Predicted)\npublic F1 = 0.96626 | val F1 = 0.966874" { |
| class: layer_out |
| shape: document |
| } |
|
|
| Shared Infrastructure: { |
| class: shared |
| shape: package |
| style.fill: "#f2f2f2" |
| lib1: "train_val_lgcn_ensemble.py\n(data · split · best_f1)\nloaded by ~12 scripts" |
| lib2: "stack_rank_calibration.py\n(explicit features · rank)\nloaded by ~12 scripts" |
| cache: "cache-or-compute\nval_*.npy · *_oof.npy · *.npz" |
| note: "No utils.py — scripts reuse via\nimportlib load_module()" {shape: text} |
| } |
|
|
| Data Layer -> Deterministic Split |
| Deterministic Split -> Stage-1 Suite.LightGCN |
| Deterministic Split -> Stage-1 Suite.BPR-MF |
| Deterministic Split -> Stage-1 Suite.Content |
| Deterministic Split -> Stage-1 Suite.Random Walk |
| Deterministic Split -> Stage-1 Suite.Explicit Graph |
| Deterministic Split -> Stage-1 Suite.High-order |
|
|
| Stage-1 Suite.LightGCN -> Stage-2 Meta-learner.Feature vector: score+rank |
| Stage-1 Suite.BPR-MF -> Stage-2 Meta-learner.Feature vector: bpr |
| Stage-1 Suite.Content -> Stage-2 Meta-learner.Feature vector: content |
| Stage-1 Suite.Random Walk -> Stage-2 Meta-learner.Feature vector: 7×11+agg |
| Stage-1 Suite.Explicit Graph -> Stage-2 Meta-learner.Feature vector: explicit+rank |
| Stage-1 Suite.High-order -> Stage-2 Meta-learner.Feature vector: undir24+dir45 |
|
|
| Stage-2 Meta-learner.Feature vector -> Stage-2 Meta-learner.LightGBM |
| Stage-2 Meta-learner.LightGBM -> Decision |
| Data Layer.test -> Decision: test pairs |
| Decision -> Output |
|
|
| Shared Infrastructure.lib1 <-> Stage-1 Suite: load_module |
| Shared Infrastructure.lib2 <-> Stage-1 Suite: load_module |
|
|