qbiocode.apps.quvine.baselines.gcn_mf module#
GCN-MF: Graph Convolutional Network with Matrix Factorization
A baseline method for disease gene prioritization that combines: 1. Graph Convolutional Networks (GCN) for learning node representations 2. Matrix Factorization for capturing latent features
Reference: - Kipf & Welling (2017). Semi-Supervised Classification with Graph Convolutional Networks - Matrix factorization approaches for biological network analysis
Summary#
Classes:
Single Graph Convolutional Layer. |
|
GCN-MF: Graph Convolutional Network with Matrix Factorization. |
|
QuVINE GCN-MF: GCN-MF with precomputed quantum-calibrated features. |
Functions:
Generate baseline graph filter embeddings (WITHOUT quantum calibration). |
|
Generate baseline GCN-MF embeddings (WITHOUT quantum calibration). |
|
Generate QuVINE Heat+GCN-MF (HGCNMF) embeddings. |
|
Generate QuVINE Polynomial+GCN-MF (PGCNMF) embeddings. |
|
Generate QuVINE GCN-MF embeddings (Heat or Poly variant). |
|
Normalize adjacency matrix: D^(-1/2) * A * D^(-1/2) |
|
Precompute quantum-calibrated diffusion OFFLINE (before training). |
|
Train GCN-MF model. |
Reference#
- class GCNLayer(in_features, out_features, bias=True)[source]#
Bases:
ModuleSingle Graph Convolutional Layer.
- class GCNMF(n_nodes, input_dim, hidden_dim, output_dim, mf_dim=64, n_layers=2, dropout=0.5)[source]#
Bases:
ModuleGCN-MF: Graph Convolutional Network with Matrix Factorization.
Architecture: 1. GCN layers for learning graph-based representations 2. Matrix factorization component for latent features 3. Fusion of GCN and MF representations
- __init__(n_nodes, input_dim, hidden_dim, output_dim, mf_dim=64, n_layers=2, dropout=0.5)[source]#
Initialize GCN-MF model.
- Parameters:
n_nodes – Number of nodes in the graph
input_dim – Input feature dimension
hidden_dim – Hidden layer dimension
output_dim – Output dimension (number of classes)
mf_dim – Matrix factorization embedding dimension
n_layers – Number of GCN layers
dropout – Dropout rate
- normalize_adjacency(adj)[source]#
Normalize adjacency matrix: D^(-1/2) * A * D^(-1/2)
- Parameters:
adj – Adjacency matrix (scipy sparse or numpy array)
- Returns:
Normalized adjacency matrix
- precompute_quantum_diffusion(X, L, diffusion_type='heat', t_star=None, poly_coeffs=None)[source]#
Precompute quantum-calibrated diffusion OFFLINE (before training).
This function should be called ONCE before training to compute diffused features. The result is then passed to QuVINEGCNMF during training.
- Parameters:
X – Original node features [N, input_dim] (numpy array or torch tensor)
L – Laplacian matrix (scipy sparse or numpy array)
diffusion_type – ‘heat’ or ‘poly’
t_star – Calibrated heat kernel time parameter (for heat diffusion)
poly_coeffs – Calibrated polynomial coefficients (for polynomial diffusion)
- Returns:
Diffused features [N, input_dim] (torch tensor)
- Return type:
X_diffused
Example
>>> # Offline: Compute diffusion once >>> X_diffused_heat = precompute_quantum_diffusion(X, L, 'heat', t_star=0.5) >>> X_diffused_poly = precompute_quantum_diffusion(X, L, 'poly', poly_coeffs=coeffs) >>> >>> # Online: Use in training (no diffusion computation) >>> model = QuVINEGCNMF(n_nodes, input_dim, hidden_dim, output_dim) >>> output = model(X_diffused_heat, adj) # Fast!
- class QuVINEGCNMF(n_nodes, input_dim, hidden_dim, output_dim, mf_dim=64, n_layers=2, dropout=0.5)[source]#
Bases:
GCNMFQuVINE GCN-MF: GCN-MF with precomputed quantum-calibrated features.
DESIGN PHILOSOPHY: - Diffusion is computed ONCE offline (before training) - Diffused features are passed as input - No CPU conversion or diffusion computation during training - Scalable and efficient for large graphs
This model expects precomputed diffused features as input, combining: 1. Precomputed quantum-calibrated diffusion (offline) 2. GCN layers for learning representations (online) 3. Matrix factorization for latent features (online)
- __init__(n_nodes, input_dim, hidden_dim, output_dim, mf_dim=64, n_layers=2, dropout=0.5)[source]#
Initialize QuVINE GCN-MF model.
- Parameters:
n_nodes – Number of nodes
input_dim – Input feature dimension (should match diffused features)
hidden_dim – Hidden layer dimension
output_dim – Output dimension
mf_dim – Matrix factorization dimension
n_layers – Number of GCN layers
dropout – Dropout rate
Note
This model expects precomputed diffused features as input. Compute diffusion offline using:
X_diffused = apply_quantum_diffusion(X, L, t_star, poly_coeffs)
Then pass X_diffused to forward().
- forward(x, adj, node_indices=None)[source]#
Forward pass with precomputed diffused features.
- Parameters:
x – PRECOMPUTED diffused features [N, input_dim] (computed offline before training)
adj – Normalized adjacency matrix [N, N]
node_indices – Optional node indices
- Returns:
Output predictions [N, output_dim]
Note
x should be the result of offline diffusion: x = exp(-t*L) @ X_original (heat kernel) or x = polynomial_filter(L, coeffs) @ X_original (polynomial)
- get_embeddings(x, adj)[source]#
Get node embeddings from precomputed diffused features.
- Parameters:
x – PRECOMPUTED diffused features [N, input_dim] (computed offline before training)
adj – Normalized adjacency matrix
- Returns:
Node embeddings
Note
x should already be diffused features from offline computation. No diffusion is applied here - it’s done offline!
- train_gcn_mf(model, x, y, adj, train_mask, val_mask, epochs=200, lr=0.01, weight_decay=0.0005, patience=20)[source]#
Train GCN-MF model.
- Parameters:
model – GCN-MF model
x – Node features
y – Labels
adj – Normalized adjacency matrix
train_mask – Training mask
val_mask – Validation mask
epochs – Number of training epochs
lr – Learning rate
weight_decay – Weight decay for regularization
patience – Early stopping patience
- Returns:
Dictionary with training history
- generate_quvine_gcnmf_embedding(G, q_targets, embedding_dim=128, diffusion_type='heat', t_star=None, poly_coeffs=None, K=4, ridge=1e-06, hidden_dim=64, mf_dim=64, n_layers=2, epochs=200, lr=0.01, weight_decay=0.0005, normalize_laplacian=True, random_state=42)[source]#
Generate QuVINE GCN-MF embeddings (Heat or Poly variant).
WORKFLOW: 1. Calibrate diffusion parameters using quantum walks (if not provided) 2. Precompute diffused features OFFLINE 3. Train GCN-MF model with diffused features 4. Extract final embeddings
This is a HIGH-LEVEL wrapper that combines: - QuVINE quantum filter calibration (from quantum_filters.py) - Offline diffusion precomputation - GCN-MF training - Embedding extraction
- Parameters:
G – NetworkX graph
q_targets – List of quantum walk targets for calibration Format: [{‘nodes’: […], ‘center’: int, ‘pQ’: array}, …]
embedding_dim – Final embedding dimension
diffusion_type – ‘heat’ or ‘poly’
t_star – Pre-calibrated heat kernel time (optional, will calibrate if None)
poly_coeffs – Pre-calibrated polynomial coefficients (optional)
K – Polynomial degree (for poly diffusion)
ridge – Ridge regularization for polynomial calibration
hidden_dim – GCN hidden dimension
mf_dim – Matrix factorization dimension
n_layers – Number of GCN layers
epochs – Training epochs
lr – Learning rate
weight_decay – Weight decay for regularization
normalize_laplacian – Whether to normalize Laplacian
random_state – Random seed
- Returns:
Node embeddings [N, embedding_dim] metadata: Dictionary with calibration info and training history
- Return type:
embeddings
Example
>>> from qbiocode.apps.quvine.baselines.gcn_mf import generate_quvine_gcnmf_embedding >>> >>> # Generate QuVINE GCN-MF (Heat) embeddings >>> embeddings_heat, meta_heat = generate_quvine_gcnmf_embedding( ... G, q_targets, embedding_dim=128, diffusion_type='heat' ... ) >>> >>> # Generate QuVINE GCN-MF (Poly) embeddings >>> embeddings_poly, meta_poly = generate_quvine_gcnmf_embedding( ... G, q_targets, embedding_dim=128, diffusion_type='poly', K=4 ... )
- generate_qcaliber_gcnmf_heat_embedding(G, q_targets, embedding_dim=128, t_star=None, **kwargs)[source]#
Generate QuVINE Heat+GCN-MF (HGCNMF) embeddings.
Convenience wrapper for heat kernel variant.
- Parameters:
G – NetworkX graph
q_targets – Quantum walk targets for calibration
embedding_dim – Embedding dimension
t_star – Pre-calibrated time parameter (optional)
**kwargs – Additional arguments for generate_qcaliber_gcnmf_embedding
- Returns:
Node embeddings [N, embedding_dim] metadata: Calibration and training info
- Return type:
embeddings
- generate_qcaliber_gcnmf_poly_embedding(G, q_targets, embedding_dim=128, poly_coeffs=None, K=4, ridge=1e-06, **kwargs)[source]#
Generate QuVINE Polynomial+GCN-MF (PGCNMF) embeddings.
Convenience wrapper for polynomial filter variant.
- Parameters:
G – NetworkX graph
q_targets – Quantum walk targets for calibration
embedding_dim – Embedding dimension
poly_coeffs – Pre-calibrated coefficients (optional)
K – Polynomial degree
ridge – Ridge regularization
**kwargs – Additional arguments for generate_qcaliber_gcnmf_embedding
- Returns:
Node embeddings [N, embedding_dim] metadata: Calibration and training info
- Return type:
embeddings
- generate_baseline_gcnmf_embedding(G, embedding_dim=128, hidden_dim=64, mf_dim=64, n_layers=2, epochs=200, lr=0.01, weight_decay=0.0005, random_state=42, device='cpu')[source]#
Generate baseline GCN-MF embeddings (WITHOUT quantum calibration).
This serves as a classical baseline to compare against QuVINE methods. Uses standard GCN-MF without any quantum-calibrated diffusion.
- Parameters:
G (
Graph) – NetworkX graphembedding_dim (
int) – Final embedding dimensionhidden_dim (
int) – GCN hidden dimensionmf_dim (
int) – Matrix factorization dimensionn_layers (
int) – Number of GCN layersepochs (
int) – Training epochslr (
float) – Learning rateweight_decay (
float) – L2 regularizationrandom_state (
int) – Random seed
- Return type:
ndarray- Returns:
Node embeddings [N, embedding_dim]
Example
>>> import networkx as nx >>> from qbiocode.apps.quvine.baselines.gcn_mf import generate_baseline_gcnmf_embedding >>> >>> G = nx.karate_club_graph() >>> embeddings = generate_baseline_gcnmf_embedding(G, embedding_dim=128) >>> print(embeddings.shape) # (34, 128)
- generate_baseline_filter_embedding_wrapper(G, filter_type='heat', t=1.0, K=4, embedding_dim=128, normalize=True, random_state=42)[source]#
Generate baseline graph filter embeddings (WITHOUT quantum calibration).
Wrapper for the baseline filter function in quantum_filters.py. This serves as a classical baseline to compare against QuVINE methods.
- Parameters:
G (
Graph) – NetworkX graphfilter_type (
str) – Type of filter (‘heat’ or ‘poly’)t (
float) – Time parameter for heat kernel (if filter_type=’heat’)K (
int) – Polynomial degree (if filter_type=’poly’)embedding_dim (
int) – Embedding dimensionnormalize (
bool) – Whether to normalize Laplacianrandom_state (
int) – Random seed
- Return type:
ndarray- Returns:
Node embeddings [N, embedding_dim]
Example
>>> import networkx as nx >>> from qbiocode.apps.quvine.baselines.gcn_mf import generate_baseline_filter_embedding_wrapper >>> >>> G = nx.karate_club_graph() >>> >>> # Heat kernel baseline >>> embeddings_heat = generate_baseline_filter_embedding_wrapper( ... G, filter_type='heat', t=1.0, embedding_dim=128 ... ) >>> >>> # Polynomial filter baseline >>> embeddings_poly = generate_baseline_filter_embedding_wrapper( ... G, filter_type='poly', K=4, embedding_dim=128 ... )