| import sys |
| import os |
| from pptx import Presentation |
| from pptx.util import Inches, Pt |
| from pptx.dml.color import RGBColor |
| from pptx.enum.shapes import MSO_SHAPE |
| from pptx.enum.text import PP_ALIGN |
|
|
| def create_slide(prs): |
| |
| blank_layout = prs.slide_layouts[6] |
| slide = prs.slides.add_slide(blank_layout) |
| |
| |
| background = slide.background |
| fill = background.fill |
| fill.solid() |
| fill.fore_color.rgb = RGBColor(10, 16, 26) |
| return slide |
|
|
| def add_header(slide, title_text, subtitle_text=""): |
| |
| title_box = slide.shapes.add_textbox(Inches(0.8), Inches(0.4), Inches(11.7), Inches(0.8)) |
| tf = title_box.text_frame |
| tf.word_wrap = True |
| tf.margin_left = tf.margin_top = tf.margin_right = tf.margin_bottom = 0 |
| p = tf.paragraphs[0] |
| p.text = title_text.upper() |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(28) |
| p.font.bold = True |
| p.font.color.rgb = RGBColor(0, 212, 255) |
| |
| |
| if subtitle_text: |
| sub_box = slide.shapes.add_textbox(Inches(0.8), Inches(1.1), Inches(11.7), Inches(0.5)) |
| tf_sub = sub_box.text_frame |
| tf_sub.word_wrap = True |
| tf_sub.margin_left = tf_sub.margin_top = tf_sub.margin_right = tf_sub.margin_bottom = 0 |
| p_sub = tf_sub.paragraphs[0] |
| p_sub.text = subtitle_text |
| p_sub.font.name = "Segoe UI" |
| p_sub.font.size = Pt(14) |
| p_sub.font.color.rgb = RGBColor(140, 150, 170) |
| |
| |
| line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(0.8), Inches(1.6), Inches(11.733), Inches(0.02)) |
| line.fill.solid() |
| line.fill.fore_color.rgb = RGBColor(30, 41, 59) |
| line.line.fill.background() |
|
|
| def draw_card(slide, left, top, width, height, fill_color, border_color, border_width_pt=1): |
| card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height) |
| card.fill.solid() |
| card.fill.fore_color.rgb = fill_color |
| card.line.color.rgb = border_color |
| card.line.width = Pt(border_width_pt) |
| try: |
| card.adjustments[0] = 0.04 |
| except: |
| pass |
| return card |
|
|
| def add_bullet(tf, bold_prefix, text_content, font_size=13, color=RGBColor(220, 225, 235)): |
| p = tf.add_paragraph() |
| p.space_after = Pt(8) |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(font_size) |
| |
| run_bold = p.add_run() |
| run_bold.text = bold_prefix |
| run_bold.font.bold = True |
| run_bold.font.color.rgb = RGBColor(0, 212, 255) |
| |
| run_text = p.add_run() |
| run_text.text = text_content |
| run_text.font.color.rgb = color |
|
|
| def build_deck(): |
| print("Initializing Elite PowerPoint Presentation Engine...") |
| prs = Presentation() |
| |
| |
| prs.slide_width = Inches(13.333) |
| prs.slide_height = Inches(7.5) |
| |
| |
| COLOR_BG = RGBColor(10, 16, 26) |
| COLOR_CARD = RGBColor(18, 25, 41) |
| COLOR_CYAN = RGBColor(0, 212, 255) |
| COLOR_BLUE = RGBColor(30, 144, 255) |
| COLOR_WHITE = RGBColor(240, 244, 248) |
| COLOR_MUTED = RGBColor(140, 150, 170) |
| COLOR_RED = RGBColor(255, 99, 99) |
| COLOR_GREEN = RGBColor(0, 230, 118) |
|
|
| |
| |
| |
| slide_1 = create_slide(prs) |
| |
| |
| draw_card(slide_1, Inches(1.0), Inches(1.5), Inches(11.333), Inches(4.5), COLOR_CARD, COLOR_CYAN, border_width_pt=2) |
| |
| |
| title_box = slide_1.shapes.add_textbox(Inches(1.5), Inches(2.2), Inches(10.333), Inches(1.5)) |
| tf = title_box.text_frame |
| tf.word_wrap = True |
| p = tf.paragraphs[0] |
| p.alignment = PP_ALIGN.CENTER |
| p.text = "RAILMIND" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(64) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| |
| |
| sub_box = slide_1.shapes.add_textbox(Inches(1.5), Inches(3.6), Inches(10.333), Inches(1.2)) |
| tf_sub = sub_box.text_frame |
| tf_sub.word_wrap = True |
| p_sub = tf_sub.paragraphs[0] |
| p_sub.alignment = PP_ALIGN.CENTER |
| p_sub.text = "Autonomous Decision Grid & Real-Time Telemetry for Indian Railways" |
| p_sub.font.name = "Segoe UI" |
| p_sub.font.size = Pt(20) |
| p_sub.font.color.rgb = COLOR_WHITE |
| |
| p_sub2 = tf_sub.add_paragraph() |
| p_sub2.alignment = PP_ALIGN.CENTER |
| p_sub2.space_before = Pt(8) |
| p_sub2.text = "Delhi Regionals Screening | India's Biggest International Hackathon — Far Away 2026" |
| p_sub2.font.name = "Segoe UI" |
| p_sub2.font.size = Pt(13) |
| p_sub2.font.color.rgb = COLOR_MUTED |
|
|
| |
| |
| |
| slide_2 = create_slide(prs) |
| add_header(slide_2, "The Operational Crisis: Indian Railways", "Why traditional manual scheduling systems drop efficiency under saturation load") |
| |
| |
| draw_card(slide_2, Inches(0.8), Inches(2.0), Inches(3.64), Inches(4.5), COLOR_CARD, COLOR_RED, border_width_pt=1) |
| |
| t1 = slide_2.shapes.add_textbox(Inches(1.0), Inches(2.2), Inches(3.24), Inches(0.6)) |
| t1.text_frame.word_wrap = True |
| p = t1.text_frame.paragraphs[0] |
| p.text = "PUNCTUALITY SHIFT" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_RED |
| |
| v1 = slide_2.shapes.add_textbox(Inches(1.0), Inches(2.8), Inches(3.24), Inches(1.0)) |
| p = v1.text_frame.paragraphs[0] |
| p.text = "73.62%" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(44) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_WHITE |
| |
| d1 = slide_2.shapes.add_textbox(Inches(1.0), Inches(4.0), Inches(3.24), Inches(2.2)) |
| d1.text_frame.word_wrap = True |
| p = d1.text_frame.paragraphs[0] |
| p.text = "Corridor congestion and line saturation have led to a precipitous drop in overall punctuality. When one train halts, the delay cascade transmits across adjacent blocks unchecked." |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(13) |
| p.font.color.rgb = COLOR_MUTED |
| |
| |
| draw_card(slide_2, Inches(4.84), Inches(2.0), Inches(3.64), Inches(4.5), COLOR_CARD, COLOR_RED, border_width_pt=1) |
| |
| t2 = slide_2.shapes.add_textbox(Inches(5.04), Inches(2.2), Inches(3.24), Inches(0.6)) |
| t2.text_frame.word_wrap = True |
| p = t2.text_frame.paragraphs[0] |
| p.text = "HUMAN HEURISTICS" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_RED |
| |
| v2 = slide_2.shapes.add_textbox(Inches(5.04), Inches(2.8), Inches(3.24), Inches(1.0)) |
| p = v2.text_frame.paragraphs[0] |
| p.text = "Manual" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(44) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_WHITE |
| |
| d2 = slide_2.shapes.add_textbox(Inches(5.04), Inches(4.0), Inches(3.24), Inches(2.2)) |
| d2.text_frame.word_wrap = True |
| p = d2.text_frame.paragraphs[0] |
| p.text = "Section controllers currently resolve complex scheduling overlaps and loop holdings using personal bias and mental calculations under extreme stress, creating sub-optimal grid lockouts." |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(13) |
| p.font.color.rgb = COLOR_MUTED |
|
|
| |
| draw_card(slide_2, Inches(8.88), Inches(2.0), Inches(3.64), Inches(4.5), COLOR_CARD, COLOR_RED, border_width_pt=1) |
| |
| t3 = slide_2.shapes.add_textbox(Inches(9.08), Inches(2.2), Inches(3.24), Inches(0.6)) |
| t3.text_frame.word_wrap = True |
| p = t3.text_frame.paragraphs[0] |
| p.text = "CONTROLLABLE LOSS" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_RED |
| |
| v3 = slide_2.shapes.add_textbox(Inches(9.08), Inches(2.8), Inches(3.24), Inches(1.0)) |
| p = v3.text_frame.paragraphs[0] |
| p.text = "27 of 33" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(44) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_WHITE |
| |
| d3 = slide_2.shapes.add_textbox(Inches(9.08), Inches(4.0), Inches(3.24), Inches(2.2)) |
| d3.text_frame.word_wrap = True |
| p = d3.text_frame.paragraphs[0] |
| p.text = "A majority of delay-causing factors on corridors are predictable and controllable, yet they lack real-time digital automation feedback loops to dynamically reroute and optimize dispatching." |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(13) |
| p.font.color.rgb = COLOR_MUTED |
|
|
| |
| |
| |
| slide_3 = create_slide(prs) |
| add_header(slide_3, "RailMind: Autonomous Dispatching Solution", "The closed-loop decision grid that runs predictive graphs and assists controllers") |
| |
| |
| |
| draw_card(slide_3, Inches(0.8), Inches(2.0), Inches(3.64), Inches(4.5), COLOR_CARD, COLOR_CYAN, border_width_pt=1) |
| t1 = slide_3.shapes.add_textbox(Inches(1.0), Inches(2.2), Inches(3.24), Inches(0.6)) |
| p = t1.text_frame.paragraphs[0] |
| p.text = "TELEMETRY INGESTION" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| d1 = slide_3.shapes.add_textbox(Inches(1.0), Inches(2.8), Inches(3.24), Inches(3.5)) |
| tf = d1.text_frame |
| tf.word_wrap = True |
| tf.clear() |
| add_bullet(tf, "GPS Sync: ", "Dynamically tracks active train spatial coordinates and speed profiles.") |
| add_bullet(tf, "Block Status: ", "Monitors section block occupancy states (green, orange, red) in real-time.") |
| add_bullet(tf, "Relational Store: ", "aiosqlite database writes state histories to ensure audit trail continuity.") |
|
|
| |
| draw_card(slide_3, Inches(4.84), Inches(2.0), Inches(3.64), Inches(4.5), COLOR_CARD, COLOR_CYAN, border_width_pt=1) |
| t2 = slide_3.shapes.add_textbox(Inches(5.04), Inches(2.2), Inches(3.24), Inches(0.6)) |
| p = t2.text_frame.paragraphs[0] |
| p.text = "CASCADE PREDICTIONS" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| d2 = slide_3.shapes.add_textbox(Inches(5.04), Inches(2.8), Inches(3.24), Inches(3.5)) |
| tf = d2.text_frame |
| tf.word_wrap = True |
| tf.clear() |
| add_bullet(tf, "NetworkX Graphs: ", "Corridor stations and blocks represented as dynamic nodes and edges.") |
| add_bullet(tf, "BFS Propagation: ", "Performs Breadth-First Searches to model delay transference down the corridor.") |
| add_bullet(tf, "Conflict Warning: ", "Flags future route overlap conflicts up to 60 minutes in advance.") |
|
|
| |
| draw_card(slide_3, Inches(8.88), Inches(2.0), Inches(3.64), Inches(4.5), COLOR_CARD, COLOR_CYAN, border_width_pt=1) |
| t3 = slide_3.shapes.add_textbox(Inches(9.08), Inches(2.2), Inches(3.24), Inches(0.6)) |
| p = t3.text_frame.paragraphs[0] |
| p.text = "EXPLAINABLE RESOLUTION" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| d3 = slide_3.shapes.add_textbox(Inches(9.08), Inches(2.8), Inches(3.24), Inches(3.5)) |
| tf = d3.text_frame |
| tf.word_wrap = True |
| tf.clear() |
| add_bullet(tf, "Optimization: ", "Generates optimal loop-holding options to clear high-priority express routes.") |
| add_bullet(tf, "Confidence Gate: ", "Automated actions execute if confidence > 85%, else escalates to operator.") |
| add_bullet(tf, "Passenger RAC: ", "Forecasts waitlist confirmation chances for passengers delayed in cascades.") |
|
|
| |
| |
| |
| slide_4 = create_slide(prs) |
| add_header(slide_4, "Agentic AI Graph State Machine", "Sequential collaboration pipeline of specialized agents resolving corridor bottlenecks") |
| |
| |
| coords = [ |
| |
| {"name": "Monitor Agent", "desc": "Tracks Live Telemetry & Flags Variance > 20m", "left": 0.8, "top": 2.2}, |
| {"name": "Conflict Detector", "desc": "Scans Physical Corridor block Overlaps", "left": 4.84, "top": 2.2}, |
| {"name": "Cascade Predictor", "desc": "Runs BFS Delay Propagation downstream", "left": 8.88, "top": 2.2}, |
| |
| {"name": "Dispatch Agent", "desc": "Calculates Optimal Loop-Holding Actions", "left": 0.8, "top": 4.7}, |
| {"name": "Notification Agent", "desc": "Runs RAC waitlist calculations", "left": 4.84, "top": 4.7}, |
| {"name": "Audit Agent", "desc": "Seals steps in SHA-256 Block Ledger", "left": 8.88, "top": 4.7} |
| ] |
| |
| for i, c in enumerate(coords): |
| |
| draw_card(slide_4, Inches(c["left"]), Inches(c["top"]), Inches(3.64), Inches(1.8), COLOR_CARD, COLOR_CYAN, border_width_pt=1) |
| |
| |
| tb = slide_4.shapes.add_textbox(Inches(c["left"] + 0.15), Inches(c["top"] + 0.25), Inches(3.34), Inches(1.3)) |
| tf = tb.text_frame |
| tf.word_wrap = True |
| p = tf.paragraphs[0] |
| p.text = c["name"].upper() |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(14) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| |
| p2 = tf.add_paragraph() |
| p2.space_before = Pt(6) |
| p2.text = c["desc"] |
| p2.font.name = "Segoe UI" |
| p2.font.size = Pt(12) |
| p2.font.color.rgb = COLOR_WHITE |
| |
| |
| |
| arrow1 = slide_4.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, Inches(4.5), Inches(2.9), Inches(0.28), Inches(0.2)) |
| arrow1.fill.solid() |
| arrow1.fill.fore_color.rgb = COLOR_BLUE |
| arrow1.line.fill.background() |
| |
| |
| arrow2 = slide_4.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, Inches(8.54), Inches(2.9), Inches(0.28), Inches(0.2)) |
| arrow2.fill.solid() |
| arrow2.fill.fore_color.rgb = COLOR_BLUE |
| arrow2.line.fill.background() |
| |
| |
| arrow3 = slide_4.shapes.add_shape(MSO_SHAPE.DOWN_ARROW, Inches(10.7), Inches(4.1), Inches(0.2), Inches(0.5)) |
| arrow3.fill.solid() |
| arrow3.fill.fore_color.rgb = COLOR_BLUE |
| arrow3.line.fill.background() |
| |
| |
| arrow4 = slide_4.shapes.add_shape(MSO_SHAPE.LEFT_ARROW, Inches(8.54), Inches(5.5), Inches(0.28), Inches(0.2)) |
| arrow4.fill.solid() |
| arrow4.fill.fore_color.rgb = COLOR_BLUE |
| arrow4.line.fill.background() |
| |
| |
| arrow5 = slide_4.shapes.add_shape(MSO_SHAPE.LEFT_ARROW, Inches(4.5), Inches(5.5), Inches(0.28), Inches(0.2)) |
| arrow5.fill.solid() |
| arrow5.fill.fore_color.rgb = COLOR_BLUE |
| arrow5.line.fill.background() |
|
|
| |
| |
| |
| slide_5 = create_slide(prs) |
| add_header(slide_5, "Demo Scenario: NDLS Signal Failure", "Timeline of the 7-step telemetry conflict resolution sequence") |
| |
| |
| steps = [ |
| {"num": "STEP 1-2", "title": "DISRUPTION INGESTION", "detail": "Signal failure at NDLS exit tracks Shatabdi 12002 halted for 35m. ConflictDetector registers path block overlap.", "left": 0.8, "color": COLOR_RED}, |
| {"num": "STEP 3-4", "title": "CASCADE PROPAGATION", "detail": "CascadePredictor runs BFS. Forecasts Coal Freight BOXN-902 blocking NDLS-GZB corridor, projecting a massive +180m delay cascade.", "left": 4.84, "color": COLOR_RED}, |
| {"num": "STEP 5-7", "title": "RESOLUTION & AUDIT", "detail": "DispatchAgent recommends loop holding. Confidence is 78% (< 85% gate). Operator manual override approved and signed in ledger.", "left": 8.88, "color": COLOR_GREEN} |
| ] |
| |
| for s in steps: |
| draw_card(slide_5, Inches(s["left"]), Inches(2.2), Inches(3.64), Inches(4.3), COLOR_CARD, s["color"], border_width_pt=1.5) |
| |
| |
| tb_num = slide_5.shapes.add_textbox(Inches(s["left"] + 0.2), Inches(2.4), Inches(3.24), Inches(0.5)) |
| p_num = tb_num.text_frame.paragraphs[0] |
| p_num.text = s["num"] |
| p_num.font.name = "Segoe UI" |
| p_num.font.size = Pt(18) |
| p_num.font.bold = True |
| p_num.font.color.rgb = s["color"] |
| |
| |
| tb_title = slide_5.shapes.add_textbox(Inches(s["left"] + 0.2), Inches(2.9), Inches(3.24), Inches(0.5)) |
| p_title = tb_title.text_frame.paragraphs[0] |
| p_title.text = s["title"] |
| p_title.font.name = "Segoe UI" |
| p_title.font.size = Pt(14) |
| p_title.font.bold = True |
| p_title.font.color.rgb = COLOR_WHITE |
| |
| |
| tb_detail = slide_5.shapes.add_textbox(Inches(s["left"] + 0.2), Inches(3.5), Inches(3.24), Inches(2.7)) |
| tf_detail = tb_detail.text_frame |
| tf_detail.word_wrap = True |
| p_detail = tf_detail.paragraphs[0] |
| p_detail.text = s["detail"] |
| p_detail.font.name = "Segoe UI" |
| p_detail.font.size = Pt(13) |
| p_detail.font.color.rgb = COLOR_MUTED |
| |
| |
| line1 = slide_5.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(4.44), Inches(4.35), Inches(0.4), Inches(0.02)) |
| line1.fill.solid() |
| line1.fill.fore_color.rgb = COLOR_BLUE |
| line1.line.fill.background() |
| |
| line2 = slide_5.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(8.48), Inches(4.35), Inches(0.4), Inches(0.02)) |
| line2.fill.solid() |
| line2.fill.fore_color.rgb = COLOR_BLUE |
| line2.line.fill.background() |
|
|
| |
| |
| |
| slide_6 = create_slide(prs) |
| add_header(slide_6, "Decoupled Full-Stack Architecture", "Dual production deployment strategy designed for performance and security isolation") |
| |
| |
| draw_card(slide_6, Inches(0.8), Inches(2.0), Inches(5.66), Inches(4.5), COLOR_CARD, COLOR_CYAN, border_width_pt=1) |
| |
| t_left = slide_6.shapes.add_textbox(Inches(1.0), Inches(2.2), Inches(5.26), Inches(0.5)) |
| p = t_left.text_frame.paragraphs[0] |
| p.text = "FRONTEND DASHBOARD CONSOLE (VERCEL)" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| |
| d_left = slide_6.shapes.add_textbox(Inches(1.0), Inches(2.8), Inches(5.26), Inches(3.5)) |
| tf_left = d_left.text_frame |
| tf_left.word_wrap = True |
| tf_left.clear() |
| add_bullet(tf_left, "Interactive Corridor Map: ", "SVG render with flashing delay indicators.") |
| add_bullet(tf_left, "Agent Terminal Stream: ", "Real-time process logs with dynamic tag filters.") |
| add_bullet(tf_left, "Waitlist Solver UI: ", "Waitlist verification interface with visual progress circles.") |
| add_bullet(tf_left, "Zero-Trust Sweeps: ", "Visual matrix scan verifying sealed audit ledger blocks.") |
| add_bullet(tf_left, "Proxy Mappings: ", "vercel.json handles API routes directly to bypass CORS blocks.") |
|
|
| |
| draw_card(slide_6, Inches(6.86), Inches(2.0), Inches(5.66), Inches(4.5), COLOR_CARD, COLOR_BLUE, border_width_pt=1) |
| |
| t_right = slide_6.shapes.add_textbox(Inches(7.06), Inches(2.2), Inches(5.26), Inches(0.5)) |
| p = t_right.text_frame.paragraphs[0] |
| p.text = "BACKEND INTELLIGENCE ENGINE (HUGGING FACE)" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_BLUE |
| |
| d_right = slide_6.shapes.add_textbox(Inches(7.06), Inches(2.8), Inches(5.26), Inches(3.5)) |
| tf_right = d_right.text_frame |
| tf_right.word_wrap = True |
| tf_right.clear() |
| add_bullet(tf_right, "API Web Framework: ", "Python FastAPI serving asynchronous, high-frequency endpoints.") |
| add_bullet(tf_right, "NetworkX Analytics: ", "Direct graph-based evaluation of route bottlenecks.") |
| add_bullet(tf_right, "Data Consistency: ", "SQLite relational database using aiosqlite transactions.") |
| add_bullet(tf_right, "Dockerized Space: ", "Custom Dockerfile exposing server instance on port 7860.") |
| add_bullet(tf_right, "Secured Hashes: ", "Seals controller manual approvals with SHA-256 cryptography.") |
|
|
| |
| |
| |
| slide_7 = create_slide(prs) |
| add_header(slide_7, "Zero-Trust Cryptographic Audit Ledger", "Blockchain-inspired sequential integrity verification protecting grid operations") |
| |
| |
| blocks = [ |
| {"num": "GENESIS BLOCK 001", "action": "NDLS DISRUPTION", "hash": "0000a89d3c5f21ea", "prev": "----------------", "left": 0.8}, |
| {"num": "LEDGER BLOCK 002", "action": "DISPATCH PROPOSE", "hash": "0000ef82c1b2f90d", "prev": "0000a89d3c5f21ea", "left": 4.84}, |
| {"num": "LEDGER BLOCK 003", "action": "OPERATOR APPROVE", "hash": "00009c2af0e5138a", "prev": "0000ef82c1b2f90d", "left": 8.88} |
| ] |
| |
| for b in blocks: |
| draw_card(slide_7, Inches(b["left"]), Inches(2.4), Inches(3.64), Inches(4.0), COLOR_CARD, COLOR_GREEN, border_width_pt=1.5) |
| |
| |
| tb_head = slide_7.shapes.add_textbox(Inches(b["left"] + 0.2), Inches(2.6), Inches(3.24), Inches(0.5)) |
| p = tb_head.text_frame.paragraphs[0] |
| p.text = b["num"] |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_GREEN |
| |
| |
| tb_cont = slide_7.shapes.add_textbox(Inches(b["left"] + 0.2), Inches(3.2), Inches(3.24), Inches(3.0)) |
| tf = tb_cont.text_frame |
| tf.word_wrap = True |
| tf.clear() |
| add_bullet(tf, "Action: ", b["action"], font_size=12) |
| add_bullet(tf, "Prev Hash: ", b["prev"], font_size=12, color=COLOR_MUTED) |
| add_bullet(tf, "Block Hash: ", b["hash"], font_size=12, color=COLOR_WHITE) |
| add_bullet(tf, "Signature: ", "ECDSA Secured", font_size=12, color=COLOR_MUTED) |
| |
| |
| arrow1 = slide_7.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, Inches(4.5), Inches(4.2), Inches(0.28), Inches(0.2)) |
| arrow1.fill.solid() |
| arrow1.fill.fore_color.rgb = COLOR_GREEN |
| arrow1.line.fill.background() |
| |
| arrow2 = slide_7.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, Inches(8.54), Inches(4.2), Inches(0.28), Inches(0.2)) |
| arrow2.fill.solid() |
| arrow2.fill.fore_color.rgb = COLOR_GREEN |
| arrow2.line.fill.background() |
|
|
| |
| |
| |
| slide_8 = create_slide(prs) |
| add_header(slide_8, "Tokyo Grand Finals Roadmap", "Scaling RailMind from a regional pilot to a unified national signaling intelligence") |
| |
| |
| draw_card(slide_8, Inches(0.8), Inches(2.0), Inches(5.66), Inches(4.5), COLOR_CARD, COLOR_MUTED, border_width_pt=1) |
| |
| t_p1 = slide_8.shapes.add_textbox(Inches(1.0), Inches(2.2), Inches(5.26), Inches(0.5)) |
| p = t_p1.text_frame.paragraphs[0] |
| p.text = "PHASE 1: DELHI REGIONALS (CURRENT)" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_MUTED |
| |
| d_p1 = slide_8.shapes.add_textbox(Inches(1.0), Inches(2.8), Inches(5.26), Inches(3.5)) |
| tf_p1 = d_p1.text_frame |
| tf_p1.word_wrap = True |
| tf_p1.clear() |
| add_bullet(tf_p1, "Seeded Database: ", "Relational mapping for the Delhi-Kanpur corridor.") |
| add_bullet(tf_p1, "Interactive Web Console: ", "React client displaying live dispatch recommendations.") |
| add_bullet(tf_p1, "Predictive Simulations: ", "Offline 7-step player mapping delay chains.") |
| add_bullet(tf_p1, "Ledger Sweeps: ", "Local SHA-256 validation routines.") |
|
|
| |
| draw_card(slide_8, Inches(6.86), Inches(2.0), Inches(5.66), Inches(4.5), COLOR_CARD, COLOR_CYAN, border_width_pt=1.5) |
| |
| t_p2 = slide_8.shapes.add_textbox(Inches(7.06), Inches(2.2), Inches(5.26), Inches(0.5)) |
| p = t_p2.text_frame.paragraphs[0] |
| p.text = "PHASE 2: TOKYO GRAND FINALS (SCALE)" |
| p.font.name = "Segoe UI" |
| p.font.size = Pt(16) |
| p.font.bold = True |
| p.font.color.rgb = COLOR_CYAN |
| |
| d_p2 = slide_8.shapes.add_textbox(Inches(7.06), Inches(2.8), Inches(5.26), Inches(3.5)) |
| tf_p2 = d_p2.text_frame |
| tf_p2.word_wrap = True |
| tf_p2.clear() |
| add_bullet(tf_p2, "Real-Time Ingestion: ", "Integrating Kafka streams for live signaling tracks.") |
| add_bullet(tf_p2, "Partitioned Storage: ", "TimescaleDB telemetry engines handling millions of daily updates.") |
| add_bullet(tf_p2, "XGBoost Ticket Models: ", "ML Waitlist probability inference engine trained on seasonal records.") |
| add_bullet(tf_p2, "Kavach Protocol: ", "Direct API endpoints interacting with locomotive warning networks.") |
| add_bullet(tf_p2, "Geographic Clusters: ", "High-availability Kubernetes deployment covering all primary zones.") |
|
|
| |
| script_dir = os.path.dirname(os.path.abspath(__file__)) |
| output_filename = os.path.join(script_dir, "../../railmind_presentation.pptx") |
| prs.save(output_filename) |
| print(f"Presentation successfully created and saved to: {output_filename}") |
|
|
| if __name__ == "__main__": |
| build_deck() |
|
|