import gradio as gr
import plotly.graph_objects as go
import pandas as pd
import json
# ═══════════════════════════════════════════════════════════════
# PRE-COMPUTED NETWORK DATA (from GraphCoherence analyses)
# ═══════════════════════════════════════════════════════════════
NETWORKS = {
"Asthma Th2": {
"nodes": 40, "edges": 49, "fi": 63.3, "lambda2": 0.028, "eps_z": -0.32,
"bridges": 24, "bridges_pct": 49, "pre_fragile": 15, "solid": 3, "triangles": 7,
"archetype": "Fragile (bridge-dominated)",
"description": "Alarmin-driven Th2 pathway → JAK/STAT → effectors (IgE/mast cell, eosinophils, NF-κB). Near-disconnected architecture with 49% bridges.",
"liquefaction": {"edges": 2, "target_fi": 81, "efficiency": "3.5×", "targets": "IL4R—TYK2, JAK1—STAT6"},
"drugs": [
{"name": "Tezepelumab", "target": "TSLP—CRLF2", "edges": 1, "af": 1, "pct": 100, "note": "Most upstream AF — phenotype-independent"},
{"name": "Mepolizumab", "target": "IL5—IL5RA", "edges": 1, "af": 1, "pct": 100, "note": "Optimal for eosinophilic (BEC > 300)"},
{"name": "Omalizumab", "target": "IgE—FcεRI", "edges": 1, "af": 1, "pct": 100, "note": "Optimal for allergic (high IgE)"},
{"name": "Dupilumab", "target": "IL4R complex", "edges": 4, "af": 2, "pct": 50, "note": "Broad coverage, partial redundancy"},
{"name": "Benralizumab", "target": "IL5RA—CSF2RB", "edges": 2, "af": 0, "pct": 0, "note": "Both edges protected — needs ADCC mechanism"},
],
"biomarkers": "BEC (eosinophils), FeNO, total IgE, ± TSLP"
},
"IPF": {
"nodes": 28, "edges": 40, "fi": 67.5, "lambda2": 0.252, "eps_z": 0.23,
"bridges": 6, "bridges_pct": 15, "pre_fragile": 11, "solid": 2, "triangles": 8,
"archetype": "Fragile (triangular sparsity)",
"description": "TGF-β/SMAD canonical + non-canonical, RTK pathways (PDGF/FGF/VEGF), RAS-MAPK, PI3K-AKT. Well-connected but minimal triangular protection.",
"liquefaction": {"edges": 2, "target_fi": 92, "efficiency": "5.0×", "targets": "SMAD2—SMAD3, PIK3CA—SRC"},
"drugs": [
{"name": "Nintedanib", "target": "PDGFR/FGFR/VEGFR", "edges": 12, "af": 8, "pct": 67, "note": "Structural carpet-bombing — 5 edges in top 15 criticality"},
{"name": "Pirfenidone", "target": "TGF-β/SMAD3", "edges": 2, "af": 1, "pct": 50, "note": "1 AF upstream + 1 protected SMAD edge"},
{"name": "Pamrevlumab", "target": "SMAD4—CTGF", "edges": 1, "af": 1, "pct": 100, "note": "⚠ AF but terminal dead-end — Phase 3 FAILED"},
],
"biomarkers": "No validated biomarker for drug selection — TCGE fills this gap"
},
"NSCLC": {
"nodes": 26, "edges": 44, "fi": 50.0, "lambda2": 0.369, "eps_z": -0.60,
"bridges": 6, "bridges_pct": 14, "pre_fragile": 17, "solid": 5, "triangles": 12,
"archetype": "Resilient (triangular redundancy)",
"description": "5 RTK drivers (EGFR, ALK, ROS1, MET, RET), RAS-MAPK, PI3K-AKT, immune checkpoint (PD-L1/PD-1), VEGF. Highest connectivity and redundancy.",
"liquefaction": {"edges": 2, "target_fi": 81, "efficiency": "4.5×", "targets": "SHC1—GRB2, EGFR—MET"},
"drugs": [
{"name": "Osimertinib", "target": "EGFR complex", "edges": 5, "af": 0, "pct": 0, "note": "⚠ ALL EGFR edges triangulated → resistance predicted"},
{"name": "Sotorasib", "target": "KRAS targets", "edges": 3, "af": 1, "pct": 33, "note": "Only KRAS—PIK3CA is AF (#1 criticality)"},
{"name": "Alectinib", "target": "ALK complex", "edges": 4, "af": 2, "pct": 50, "note": "Better structural profile than osimertinib"},
{"name": "Capmatinib", "target": "MET complex", "edges": 4, "af": 0, "pct": 0, "note": "⚠ MET as triangulated as EGFR"},
{"name": "Pembrolizumab", "target": "PD-L1—PD-1", "edges": 1, "af": 1, "pct": 100, "note": "Immune axis — AF, orthogonal to RTK resistance"},
{"name": "Bevacizumab", "target": "VEGFA—KDR", "edges": 1, "af": 1, "pct": 100, "note": "Anti-angiogenic — AF, peripheral"},
],
"biomarkers": "EGFR/ALK/KRAS/ROS1/RET mutation panel, PD-L1 expression"
},
"Cystic Fibrosis": {
"nodes": 39, "edges": 45, "fi": 80.0, "lambda2": 0.087, "eps_z": 0.18,
"bridges": 11, "bridges_pct": 24, "pre_fragile": 9, "solid": 0, "triangles": 3,
"archetype": "Hyper-fragile (hub-spoke)",
"description": "CFTR dysfunction → β-catenin degradation → NF-κB activation → TLR4/TLR5 innate immunity → cytokine cascade → Pseudomonas interaction. Zero solid edges.",
"liquefaction": {"edges": 2, "target_fi": 93, "efficiency": "2.0×", "targets": "CFTR—CTNNB1, CTNNB1—GSK3B"},
"drugs": [
{"name": "Trikafta", "target": "CFTR restoration", "edges": 3, "af_note": "2/3 AF", "af": 2, "pct": 67, "note": "Anti-liquefaction — restores the only protective triangle (CFTR/CTNNB1/SRC)"},
],
"biomarkers": "Sweat chloride, CFTR mutation status (F508del)"
},
"COPD": {
"nodes": 39, "edges": 49, "fi": 93.9, "lambda2": 0.178, "eps_z": -0.07,
"bridges": 14, "bridges_pct": 29, "pre_fragile": 3, "solid": 0, "triangles": 1,
"archetype": "Ultra-fragile (linear cascades)",
"description": "Oxidative stress → NF-κB → neutrophilic inflammation → protease/anti-protease → NLRP3 inflammasome → mucus → corticosteroid resistance → remodeling. Single triangle.",
"liquefaction": {"edges": 1, "target_fi": 100, "efficiency": "5.0×", "targets": "MAPK14—NFKB1"},
"drugs": [
{"name": "Corticosteroids", "target": "HDAC2—GR—NF-κB", "edges": 2, "af": 2, "pct": 100, "note": "⚠ Both AF but ROS sabotages HDAC2 upstream — resistance explained"},
{"name": "Roflumilast", "target": "PDE4B—PRKAR1A", "edges": 1, "af": 1, "pct": 100, "note": "Single AF edge — no cascade, explains modest efficacy"},
],
"biomarkers": "BEC (eosinophilic vs neutrophilic phenotype), AAT levels"
},
}
GRADIENT_ORDER = ["NSCLC", "Asthma Th2", "IPF", "Cystic Fibrosis", "COPD"]
COLORS = {"NSCLC": "#1D4ED8", "Asthma Th2": "#0D9488", "IPF": "#D97706", "Cystic Fibrosis": "#7C3AED", "COPD": "#DC2626"}
# ═══════════════════════════════════════════════════════════════
# APP FUNCTIONS
# ═══════════════════════════════════════════════════════════════
def get_overview():
"""Generate the gradient comparison chart + table."""
# Bar chart
fig = go.Figure()
for name in GRADIENT_ORDER:
n = NETWORKS[name]
fig.add_trace(go.Bar(
x=[name], y=[n["fi"]],
marker_color=COLORS[name],
text=[f'{n["fi"]}%'], textposition='outside',
name=name, showlegend=False
))
fig.update_layout(
title="Fragility Index Gradient Across Respiratory Diseases",
yaxis_title="Fragility Index (%)",
yaxis_range=[0, 105],
template="plotly_white",
height=400,
font=dict(family="Inter, sans-serif"),
margin=dict(t=60, b=40),
)
# Response labels
responses = {
"NSCLC": "Systematic resistance",
"Asthma Th2": "One biologic suffices",
"IPF": "Slows, doesn't stop",
"Cystic Fibrosis": "Trikafta transforms",
"COPD": "Treatment-refractory"
}
fig.update_xaxes(ticktext=[f"{n}
{responses[n]}" for n in GRADIENT_ORDER],
tickvals=GRADIENT_ORDER)
# Summary table
rows = []
for name in GRADIENT_ORDER:
n = NETWORKS[name]
rows.append({
"Disease": name,
"N / E": f'{n["nodes"]} / {n["edges"]}',
"FI (%)": n["fi"],
"λ₂": n["lambda2"],
"Bridges": f'{n["bridges"]} ({n["bridges_pct"]}%)',
"Solid": n["solid"],
"Archetype": n["archetype"].split(" (")[0],
"Drugs": len(n["drugs"]),
})
df = pd.DataFrame(rows)
return fig, df
def get_network_detail(disease_name):
"""Generate detailed analysis for a single network."""
if disease_name not in NETWORKS:
return "Select a disease", "", "", ""
n = NETWORKS[disease_name]
# Metrics summary
metrics = f"""## {disease_name} — Structural Profile
| Metric | Value |
|--------|-------|
| Nodes / Edges | {n['nodes']} / {n['edges']} |
| Fragility Index | **{n['fi']}%** |
| Algebraic connectivity (λ₂) | {n['lambda2']} |
| Spectral entropy position (EPS_z) | {n['eps_z']:+.2f} |
| Bridges | {n['bridges']} ({n['bridges_pct']}%) |
| Pre-fragile edges | {n['pre_fragile']} |
| Solid edges | {n['solid']} |
| Triangles | {n['triangles']} |
| **Archetype** | **{n['archetype']}** |
### Description
{n['description']}
### Relevant Biomarkers
{n['biomarkers']}
### Liquefaction
{n['liquefaction']['edges']} targeted edge(s) → FI = {n['liquefaction']['target_fi']}% ({n['liquefaction']['efficiency']} more efficient than random)
Targets: **{n['liquefaction']['targets']}**
"""
# Drug table
drug_rows = []
for d in n["drugs"]:
af_color = "🟢" if d["pct"] == 100 else "🟡" if d["pct"] > 0 else "🔴"
drug_rows.append({
"Drug": d["name"],
"Target": d["target"],
"Edges": d["edges"],
"AF": d["af"],
"AF %": f'{af_color} {d["pct"]}%',
"Structural Assessment": d["note"],
})
drug_df = pd.DataFrame(drug_rows)
# Drug AF chart
fig = go.Figure()
for d in n["drugs"]:
color = "#059669" if d["pct"] == 100 else "#D97706" if d["pct"] > 0 else "#DC2626"
fig.add_trace(go.Bar(
x=[d["name"]], y=[d["pct"]],
marker_color=color,
text=[f'{d["pct"]}%'], textposition='outside',
showlegend=False
))
fig.update_layout(
title=f"Drug Structural Profiles — {disease_name}",
yaxis_title="Always-Fragile Targets (%)",
yaxis_range=[0, 115],
template="plotly_white",
height=350,
font=dict(family="Inter, sans-serif"),
margin=dict(t=60, b=40),
)
return metrics, drug_df, fig
# ═══════════════════════════════════════════════════════════════
# GRADIO INTERFACE
# ═══════════════════════════════════════════════════════════════
HEADER_MD = """
# 🫁 Structural Network Medicine — Pneumology
**Why some drugs work, others don't — and topology explains the difference.**
This explorer presents structural fragility analyses of 5 respiratory disease signaling networks,
covering 21 approved drugs. Each drug's molecular targets are mapped to the network topology to determine
whether they hit structurally irreplaceable interactions (always-fragile) or redundant ones (solidified).
The **Fragility Index (FI)** = fraction of always-fragile edges. Higher FI → more vulnerable network → monotherapy more likely to work.
> 🔬 Full analysis engine: [cognitive-engineering.dev](https://cognitive-engineering.dev)
> 📄 Method: [Zenodo 10.5281/zenodo.19045028](https://doi.org/10.5281/zenodo.19045028)
"""
FOOTER_MD = """
---
### Want to analyze YOUR network?
This explorer shows pre-computed results for 5 respiratory diseases.
To run structural analysis on your own signaling network:
👉 **[cognitive-engineering.dev](https://cognitive-engineering.dev)** — upload a network, get FI + criticality + liquefaction in minutes.
📧 hello@cognitive-engineering.dev
*© 2026 Cognitive Engineering — Switzerland*
"""
with gr.Blocks(
title="Structural Network Medicine",
theme=gr.themes.Soft(primary_hue="teal", neutral_hue="slate"),
css="footer {display: none !important;}"
) as app:
gr.Markdown(HEADER_MD)
with gr.Tab("📊 FI Gradient"):
gr.Markdown("### The Structural Gradient Across Respiratory Diseases")
gr.Markdown("NSCLC (50%) → Asthma (63%) → IPF (68%) → CF (80%) → COPD (94%)")
overview_chart = gr.Plot()
overview_table = gr.Dataframe()
app.load(fn=get_overview, outputs=[overview_chart, overview_table])
with gr.Tab("🔬 Disease Explorer"):
gr.Markdown("### Select a disease to explore its structural profile and drug mapping")
disease_dropdown = gr.Dropdown(
choices=list(NETWORKS.keys()),
value="Asthma Th2",
label="Disease Network"
)
detail_md = gr.Markdown()
drug_table = gr.Dataframe(label="Drug Structural Profiles")
drug_chart = gr.Plot()
disease_dropdown.change(
fn=get_network_detail,
inputs=[disease_dropdown],
outputs=[detail_md, drug_table, drug_chart]
)
app.load(
fn=lambda: get_network_detail("Asthma Th2"),
outputs=[detail_md, drug_table, drug_chart]
)
with gr.Tab("💊 Drug Comparison"):
gr.Markdown("### All 21 drugs ranked by structural efficacy")
def get_all_drugs():
rows = []
for disease, n in NETWORKS.items():
for d in n["drugs"]:
emoji = "🟢" if d["pct"] == 100 else "🟡" if d["pct"] > 0 else "🔴"
rows.append({
"Disease": disease,
"Drug": d["name"],
"Edges targeted": d["edges"],
"Always-fragile": d["af"],
"AF %": d["pct"],
"Profile": emoji,
"Assessment": d["note"],
})
df = pd.DataFrame(rows).sort_values("AF %", ascending=False)
return df
all_drugs = gr.Dataframe()
app.load(fn=get_all_drugs, outputs=[all_drugs])
with gr.Tab("ℹ️ About"):
gr.Markdown("""
### About This Project
**Structural Network Medicine** applies the Theory of Emergent Global Constraints (TCGE) to disease
signaling networks. For each molecular interaction in a pathway, we compute the number of triangular
bypass routes (tri(e)). An interaction with tri(e) = 0 is **always-fragile** — blocking it permanently
cuts the signal with no structural compensation possible.
**The Fragility Index (FI)** is the fraction of always-fragile edges in the network. It predicts
the therapeutic response class:
| FI Range | Archetype | Clinical Pattern | Example |
|----------|-----------|-----------------|---------|
| > 90% | Ultra-fragile | Treatment-refractory | COPD |
| ≥ 80% | Hyper-fragile | Structural restoration transforms outcome | CF + Trikafta |
| 60-70% | Fragile | Monotherapy works | Asthma, IPF |
| ≈ 50% | Resilient | Combination required | NSCLC |
### Platform
The full analysis engine (GraphCoherence) is available at [cognitive-engineering.dev](https://cognitive-engineering.dev).
Upload any signaling network in JSON format to get: FI, edge criticality ranking, spectral analysis,
bridge detection, and structural liquefaction simulation.
### Publications
- Venti DM (2026). "Protein regulatory architectures segregate into two topological regimes."
*Under review, Communications Biology.* [Zenodo DOI: 10.5281/zenodo.19045028](https://doi.org/10.5281/zenodo.19045028)
- Venti DM (2026). "Triangular solidification: local motif redundancy drives a sharp structural
transition in complex networks." [Zenodo DOI: 10.5281/zenodo.19163066](https://doi.org/10.5281/zenodo.19163066)
### Contact
David Martin — Cognitive Engineering, Switzerland
📧 hello@cognitive-engineering.dev
🌐 [cognitive-engineering.dev](https://cognitive-engineering.dev)
""")
gr.Markdown(FOOTER_MD)
if __name__ == "__main__":
app.launch()