import gradio as gr from pyvis.network import Network def generate_roadmap_graph(): # Initialize Gephi-style network net = Network(height="600px", width="100%", bgcolor="#222222", font_color="white", directed=True, cdn_resources="remote") # CANCER TYPES (Source AICR: https://www.aicr.org/cancer-survival/cancer-type/?gad_source=1&gad_campaignid=22658424638&gbraid=0AAAAAD7w6z5hHTX4za7nDWOtKRdbNMRuV&gclid=CjwKCAjwyYPOBhBxEiwAgpT8P2G1tNaVGtsO1_pPa7LEQPodGeLjikzeUSjNNIEc88kTudSWEn3OtBoCabkQAvD_BwE) # Blue Nodes aicr_list = [ "Bladder", "Breast", "Cervical", "Colorectal", "Endometrial", "Esophageal", "Gallbladder", "Kidney", "Liver", "Lung", "Mouth, Pharynx, Larynx", "Nasopharyngeal", "Ovarian", "Pancreatic", "Prostate", "Skin", "Stomach" ] for i, name in enumerate(aicr_list): net.add_node(i, label=name, color="#3399ff", size=25, shape="dot", title=f"AICR Type: {name}") # DETECTION STAGES # Diamond nodes represent diagnostic journey stages = { 100: "Stage 0-1 (Localized)", 101: "Stage 2-3 (Regional)", 102: "Stage 4 (Advanced/Metastatic)" } for node_id, label in stages.items(): # Green for early detection, Red for late color = "#99ff66" if node_id == 100 else "#ff6666" net.add_node(node_id, label=label, color=color, size=35, shape="diamond") # TREATMENTS & COST CATEGORIES # Triangle nodes representing the economic and clinical response treatments = { 200: "Curative Surgery", 201: "Standard Chemotherapy", 202: "Precision Immunotherapy", 203: "Palliative/Supportive Care" } costs = { 200: "High Initial Cost (Lower Long-term)", 201: "Recurring Moderate-High Cost", 202: "Very High Cost (Advanced Care)", 203: "Supportive Maintenance Cost" } for node_id, label in treatments.items(): net.add_node(node_id, label=label, color="#ffcc00", size=30, shape="triangle", title=f"Cost Category: {costs[node_id]}") # CONNECTIONS Here # Connect every Cancer Type to the "Localized" Stage to show the starting point for i in range(len(aicr_list)): net.add_edge(i, 100, color="grey", alpha=0.3) net.add_edge(i, 101, color="grey", alpha=0.3) net.add_edge(i, 102, color="grey", alpha=0.3) # Logic-based clinical pathways # Stage 0-1 -> Surgery (High survival) net.add_edge(100, 200, weight=5, color="#00ffcc", title="Primary Curative Route") # Stage 2-3 -> Chemo/Surgery net.add_edge(101, 201, weight=5, color="#ffcc00") # Stage 4 -> Immunotherapy/Palliative (Highest cost burden) net.add_edge(102, 202, weight=5, color="#ffcc00") net.add_edge(102, 203, weight=5, color="#ffcc00") # Gephi-style Bouncy Physics net.set_options(""" var options = { "physics": { "forceAtlas2Based": { "gravitationalConstant": -80, "springLength": 100, "springConstant": 0.05 }, "solver": "forceAtlas2Based" } } """) net.save_graph("roadmap.html") with open("roadmap.html", 'r', encoding='utf-8') as f: html_content = f.read() # WRAP IN IFRAME: Prevent JS from being blocked or clashing with Gradio iframe_html = f""" """ return iframe_html # Gradio Tab Component with gr.Blocks() as roadmap_page: gr.Markdown("## 🌐 Oncology Interaction Network") gr.Markdown("An interactive visualization of the AICR cancer types, their progression stages, and the resulting treatment/cost pathways.") gr.Markdown(""" > ### ⚠️ Disclaimer: Non-Exhaustive Model > This visualization is a research-oriented roadmap and is **not inclusive of all cancer types, rare subtypes, or every available treatment protocol.** > Relationships shown are simplified for architectural visualization of clinical-economic trends and should not be used for medical decision-making. """) gr.HTML(value=generate_roadmap_graph()) gr.Markdown(""" ### 📈 Improvements & Future Iterations * **Demographic Gaps:** Future nodes could visualize specific survival disparities in men vs women and different age demographics. * **Cost-Stage Correlation:** Visualizing how economic burden shifts from "one-time" surgical costs in early stages to "continuous" high-cost in metastatic stages. * **Inclusive Data:** Ensuring rare types like Nasopharyngeal have the same depth of data as common types like Lung or Skin. """)