Artificial Intelligence in Drug Discovery: How Machine Learning is Speeding Up Development Based on active 2025-2026 research - shows you're aware of where pharma is heading. I decide to write an article on these topic
machine learning drug discovery 2025
generative AI molecular design clinical trials
AI drug discovery breakthroughs 2025 2026 clinical trials machine learning pharma
PMID: 40547666
PMID: 42491104
https://intuitionlabs.ai/articles/ai-drug-development-pipeli…
Generate a professional presentation (PPTX) on this article for investor or stakeholder briefing
mkdir -p /tmp/workspace/ai-drug-discovery-pptx && ls /tmp/workspace/
~/ai-drug-discovery-pptx/build_deck.py
"""
AI in Drug Discovery — Investor/Stakeholder Briefing Deck
Professional 16:9 presentation, dark-blue corporate theme
"""
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.shapes import MSO_CONNECTOR
from io import BytesIO
# ── Palette ─────────────────────────────────────────────────────────────────
NAVY = RGBColor(0x0A, 0x1F, 0x44) # slide background dark
BLUE = RGBColor(0x00, 0x5B, 0xB5) # accent bar / shapes
TEAL = RGBColor(0x00, 0xB4, 0xD8) # highlight accent
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_GRAY = RGBColor(0xE8, 0xF0, 0xFE)
MID_GRAY = RGBColor(0xA0, 0xB4, 0xCC)
GOLD = RGBColor(0xFF, 0xC3, 0x00)
DARK_TEXT = RGBColor(0x0D, 0x1B, 0x2A)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6] # fully blank — we place everything
# ── Helper Functions ─────────────────────────────────────────────────────────
def add_bg(slide, color=NAVY):
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = color
def add_rect(slide, x, y, w, h, fill_color, line_color=None, line_width=Pt(0)):
shp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h)
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = line_width
else:
shp.line.fill.background()
shp.shadow.inherit = False
return shp
def add_rounded_rect(slide, x, y, w, h, fill_color, line_color=None, line_width=Pt(0)):
shp = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h)
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = line_width
else:
shp.line.fill.background()
shp.shadow.inherit = False
return shp
def txb(slide, text, x, y, w, h, size=18, bold=False, color=WHITE,
align=PP_ALIGN.LEFT, italic=False, font="Calibri", wrap=True, valign=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = valign
tf.margin_left = 0
tf.margin_right = 0
tf.margin_top = 0
tf.margin_bottom= 0
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = font
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic= italic
run.font.color.rgb = color
return tf
def add_multiline_txb(slide, lines, x, y, w, h, size=14, bold_first=False,
color=WHITE, line_spacing=None, font="Calibri"):
"""lines = list of (text, bold, color_override_or_None)"""
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = 0
tf.margin_right = 0
tf.margin_top = 0
tf.margin_bottom= 0
for i, entry in enumerate(lines):
if isinstance(entry, str):
text, bold, col = entry, (i == 0 and bold_first), color
else:
text, bold, col = entry
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
if line_spacing:
from pptx.util import Pt as _Pt
from pptx.oxml.ns import qn
from lxml import etree
pPr = p._pPr if p._pPr is not None else p._p.get_or_add_pPr()
run = p.add_run()
run.text = text
run.font.name = font
run.font.size = Pt(size)
run.font.bold = bold
run.font.color.rgb = col if col else color
return tf
def add_divider(slide, y, color=BLUE, thickness=Pt(2)):
ln = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT,
Inches(0.5), y, Inches(12.833), y)
ln.line.color.rgb = color
ln.line.width = thickness
def stat_card(slide, x, y, w, h, number, label, sublabel="",
card_color=BLUE, num_color=GOLD, lbl_color=WHITE):
add_rounded_rect(slide, x, y, w, h, card_color)
# number
txb(slide, number, x + Inches(0.15), y + Inches(0.12),
w - Inches(0.3), Inches(0.85),
size=32, bold=True, color=num_color, align=PP_ALIGN.CENTER)
# label
txb(slide, label, x + Inches(0.1), y + Inches(0.95),
w - Inches(0.2), Inches(0.5),
size=13, bold=True, color=lbl_color, align=PP_ALIGN.CENTER, wrap=True)
if sublabel:
txb(slide, sublabel, x + Inches(0.1), y + Inches(1.45),
w - Inches(0.2), Inches(0.35),
size=10, color=MID_GRAY, align=PP_ALIGN.CENTER, wrap=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 1 — Cover
# ─────────────────────────────────────────────────────────────────────────────
s1 = prs.slides.add_slide(blank)
add_bg(s1, NAVY)
# Left accent bar
add_rect(s1, Inches(0), Inches(0), Inches(0.12), H, BLUE)
# Top accent line
add_rect(s1, Inches(0.12), Inches(0), W - Inches(0.12), Inches(0.06), TEAL)
# Big title
txb(s1, "Artificial Intelligence\nin Drug Discovery",
Inches(0.8), Inches(1.2), Inches(8.5), Inches(2.8),
size=52, bold=True, color=WHITE, font="Calibri Light")
# Subtitle
txb(s1, "How Machine Learning is Speeding Up\nPharmaceutical Development",
Inches(0.8), Inches(4.0), Inches(8.0), Inches(1.2),
size=22, bold=False, color=TEAL, font="Calibri Light")
# Divider
add_rect(s1, Inches(0.8), Inches(5.3), Inches(4.0), Inches(0.05), GOLD)
# Tag line
txb(s1, "Investor & Stakeholder Briefing | July 2026",
Inches(0.8), Inches(5.5), Inches(7.0), Inches(0.45),
size=14, color=MID_GRAY)
# Right side — decorative molecule node graphic (circles)
circle_data = [
(Inches(10.0), Inches(1.5), Inches(1.2), BLUE),
(Inches(11.5), Inches(2.8), Inches(0.9), TEAL),
(Inches(9.6), Inches(3.5), Inches(0.7), RGBColor(0x1A, 0x3A, 0x6C)),
(Inches(11.2), Inches(4.5), Inches(1.0), BLUE),
(Inches(10.5), Inches(5.6), Inches(0.6), TEAL),
(Inches(9.2), Inches(5.1), Inches(0.45), GOLD),
(Inches(12.0), Inches(1.2), Inches(0.5), GOLD),
]
for cx, cy, cr, cc in circle_data:
shp = s1.shapes.add_shape(MSO_SHAPE.OVAL, cx, cy, cr, cr)
shp.fill.solid(); shp.fill.fore_color.rgb = cc
shp.line.fill.background(); shp.shadow.inherit = False
# Connector lines between circles
def connect(slide, x1, y1, x2, y2, color=BLUE, w=Pt(1.5)):
ln = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, x1, y1, x2, y2)
ln.line.color.rgb = color; ln.line.width = w
connect(s1, Inches(10.6), Inches(2.1), Inches(11.95), Inches(3.25), BLUE)
connect(s1, Inches(11.95), Inches(3.25), Inches(10.3), Inches(3.85), TEAL)
connect(s1, Inches(10.3), Inches(3.85), Inches(11.7), Inches(5.0), BLUE)
connect(s1, Inches(11.7), Inches(5.0), Inches(10.8), Inches(5.93), TEAL)
connect(s1, Inches(10.8), Inches(5.93), Inches(9.65), Inches(5.37), GOLD)
connect(s1, Inches(9.65), Inches(5.37), Inches(9.95), Inches(4.0), MID_GRAY)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 2 — The Problem
# ─────────────────────────────────────────────────────────────────────────────
s2 = prs.slides.add_slide(blank)
add_bg(s2, NAVY)
add_rect(s2, Inches(0), Inches(0), Inches(0.12), H, BLUE)
txb(s2, "The Problem AI Set Out to Solve",
Inches(0.4), Inches(0.2), Inches(11.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s2, Inches(0.4), Inches(0.95), Inches(5.5), Inches(0.05), TEAL)
# Three pain-point cards
pain = [
("10-15 Years", "Average time from lab to pharmacy shelf", BLUE),
("$1-2 Billion", "Average cost per approved drug", RGBColor(0x1A, 0x52, 0x9E)),
("~90% Failure", "Of candidates fail in clinical trials", RGBColor(0x0D, 0x3D, 0x7A)),
]
for i, (num, lab, col) in enumerate(pain):
stat_card(s2, Inches(0.4 + i * 4.2), Inches(1.2), Inches(3.9), Inches(2.1),
num, lab, card_color=col, num_color=GOLD)
# Two challenge boxes
challenges = [
("Chemical Space Too Vast",
"~10\u2076\u2070 possible drug-like molecules — impossible to screen manually. "
"AI explores this space at machine speed."),
("Late-Stage Failures Are Costly",
"Most failures discovered after years of investment. "
"ML identifies toxicity, off-targets, and poor bioavailability before synthesis."),
]
for i, (title, body) in enumerate(challenges):
bx = add_rounded_rect(s2, Inches(0.4 + i * 6.45), Inches(3.5), Inches(6.1), Inches(3.5),
RGBColor(0x0F, 0x2D, 0x5A), line_color=TEAL, line_width=Pt(1.2))
txb(s2, title,
Inches(0.7 + i * 6.45), Inches(3.65), Inches(5.5), Inches(0.55),
size=16, bold=True, color=TEAL)
txb(s2, body,
Inches(0.7 + i * 6.45), Inches(4.25), Inches(5.5), Inches(2.5),
size=13, color=LIGHT_GRAY, wrap=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 3 — Market Snapshot 2025-2026
# ─────────────────────────────────────────────────────────────────────────────
s3 = prs.slides.add_slide(blank)
add_bg(s3, NAVY)
add_rect(s3, Inches(0), Inches(0), Inches(0.12), H, TEAL)
txb(s3, "Market Snapshot: 2025–2026",
Inches(0.4), Inches(0.2), Inches(11.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s3, Inches(0.4), Inches(0.95), Inches(5.0), Inches(0.05), GOLD)
# 6 KPI stat cards in 2 rows
kpis = [
("173+", "AI-originated drug\nprograms in the clinic", "Up from ~24 in late 2023"),
("$4.5B", "AI drug discovery\nmarket size (2025)", "→ $12.5B by 2034"),
("80-90%", "Phase I success rate\nfor AI molecules", "vs. 52% historical avg."),
("30%", "New drug programs\nincorporate AI", "2026 industry estimate"),
("$60-110B", "Potential annual savings\nfor pharma (McKinsey)", "Generative AI across value chain"),
("2026-27", "Projected first\nFDA approval", "~60% probability"),
]
cols = 3
for i, (num, lab, sub) in enumerate(kpis):
row = i // cols
col = i % cols
stat_card(s3,
Inches(0.4 + col * 4.28), Inches(1.2 + row * 2.85),
Inches(4.0), Inches(2.55),
num, lab, sub,
card_color=BLUE if row == 0 else RGBColor(0x0D, 0x3D, 0x7A),
num_color=GOLD)
# Bottom note
txb(s3, "Sources: IntuitionLabs 2026 | McKinsey | Fortune Business Insights | PubMed literature (2025-2026)",
Inches(0.4), Inches(7.05), Inches(12.0), Inches(0.35),
size=9, color=MID_GRAY, italic=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 4 — Core Technologies
# ─────────────────────────────────────────────────────────────────────────────
s4 = prs.slides.add_slide(blank)
add_bg(s4, NAVY)
add_rect(s4, Inches(0), Inches(0), Inches(0.12), H, BLUE)
txb(s4, "Core Technologies Powering the Revolution",
Inches(0.4), Inches(0.2), Inches(12.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s4, Inches(0.4), Inches(0.95), Inches(6.0), Inches(0.05), TEAL)
techs = [
("Deep Learning\n& Transformers",
"Treat molecules as 'language' — generate novel candidates with desired profiles. "
"Backbone of generative molecule design platforms."),
("Graph Neural\nNetworks (GNNs)",
"Model atoms as nodes, bonds as edges. Used for binding affinity, "
"ADMET property prediction, and drug-drug interaction modeling."),
("AlphaFold 3\n& Structure AI",
"Solved the protein-folding problem. Opens thousands of previously "
"undruggable targets. Enables structure-based drug design without X-ray crystallography."),
("Generative AI &\nDe Novo Design",
"Diffusion models and LLMs design molecules from scratch. "
"Active exploration of chemical space — not limited to known compound libraries."),
("Reinforcement\nLearning (RL)",
"RL agents optimize molecules iteratively. Production-ready RL for scientific agents "
"emerged in 2025-2026 as a genuine advance in automated discovery workflows."),
("ML Toxicity\nPrediction",
"Predict DILI, cardiotoxicity (hERG), and genotoxicity in silico — before any synthesis. "
"Cuts late-stage attrition dramatically. (Bai et al., Adv Sci 2025)"),
]
# 2 rows × 3 cols
for i, (title, body) in enumerate(techs):
row = i // 3
col = i % 3
bx_x = Inches(0.35 + col * 4.32)
bx_y = Inches(1.2 + row * 2.9)
add_rounded_rect(s4, bx_x, bx_y, Inches(4.1), Inches(2.7),
RGBColor(0x0F, 0x2D, 0x5A), line_color=TEAL, line_width=Pt(0.8))
# number badge
badge = s4.shapes.add_shape(MSO_SHAPE.OVAL, bx_x + Inches(0.15), bx_y + Inches(0.12),
Inches(0.4), Inches(0.4))
badge.fill.solid(); badge.fill.fore_color.rgb = TEAL
badge.line.fill.background(); badge.shadow.inherit = False
txb(s4, str(i + 1), bx_x + Inches(0.17), bx_y + Inches(0.12),
Inches(0.36), Inches(0.38), size=12, bold=True, color=NAVY,
align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
txb(s4, title, bx_x + Inches(0.65), bx_y + Inches(0.12),
Inches(3.3), Inches(0.65), size=13, bold=True, color=TEAL)
txb(s4, body, bx_x + Inches(0.18), bx_y + Inches(0.82),
Inches(3.7), Inches(1.78), size=11, color=LIGHT_GRAY, wrap=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 5 — Case Studies
# ─────────────────────────────────────────────────────────────────────────────
s5 = prs.slides.add_slide(blank)
add_bg(s5, NAVY)
add_rect(s5, Inches(0), Inches(0), Inches(0.12), H, GOLD)
txb(s5, "Landmark Case Studies",
Inches(0.4), Inches(0.2), Inches(11.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s5, Inches(0.4), Inches(0.95), Inches(4.5), Inches(0.05), GOLD)
cases = [
("Insilico Medicine\n(Rentosertib / IPF)",
"First fully AI-designed drug (target ID + molecule design) to show Phase IIa proof-of-concept.\n"
"Target: TNIK kinase — found by PandaOmics AI, missed by traditional methods.\n"
"Cost: ~$6M vs. $100-200M traditional | Timeline: 18 months vs. 6-8 years.\n"
"Published in Nature Medicine. Now in pivotal Phase III.",
GOLD),
("Recursion\nPharmaceuticals",
"Automated biological OS: millions of cellular imaging experiments per week.\n"
"ML extracts phenotypic disease patterns at scale.\n"
"13+ programs in clinical development across oncology, rare disease, neuroscience.\n"
"Phase II miss in 2025 — reminder that AI doesn't eliminate clinical risk.",
TEAL),
("Big Pharma\nPartnerships 2026",
"Eli Lilly + Chai Discovery | GSK + Noetik | Pfizer + Boltz\n"
"Sanofi company-wide 'digital twin' initiative | Roche AI clinical data mining.\n"
"Eli Lilly opened its ML platform to external biotech partners (Sep 2025).\n"
"Collectively worth hundreds of millions — AI is now core R&D infrastructure.",
BLUE),
]
for i, (title, body, accent) in enumerate(cases):
bx_x = Inches(0.35 + i * 4.32)
add_rounded_rect(s5, bx_x, Inches(1.15), Inches(4.1), Inches(5.85),
RGBColor(0x0F, 0x2D, 0x5A), line_color=accent, line_width=Pt(1.5))
add_rect(s5, bx_x, Inches(1.15), Inches(4.1), Inches(0.08), accent)
txb(s5, title, bx_x + Inches(0.2), Inches(1.28),
Inches(3.7), Inches(0.9), size=14, bold=True, color=accent, wrap=True)
txb(s5, body, bx_x + Inches(0.2), Inches(2.2),
Inches(3.7), Inches(4.5), size=11.5, color=LIGHT_GRAY, wrap=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 6 — Drug Discovery Pipeline with AI
# ─────────────────────────────────────────────────────────────────────────────
s6 = prs.slides.add_slide(blank)
add_bg(s6, NAVY)
add_rect(s6, Inches(0), Inches(0), Inches(0.12), H, BLUE)
txb(s6, "AI Across the Drug Discovery Pipeline",
Inches(0.4), Inches(0.2), Inches(12.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s6, Inches(0.4), Inches(0.95), Inches(6.5), Inches(0.05), TEAL)
stages = [
("Target\nIdentification", "AI mines genomics,\nomics & literature\nto find novel targets", BLUE),
("Hit\nDiscovery", "Generative AI designs\ncandidates; GNNs\npredict binding", RGBColor(0x00, 0x7A, 0xC1)),
("Lead\nOptimization", "RL agents iterate\non ADMET, selectivity\n& synthesizability", RGBColor(0x00, 0x9A, 0xD0)),
("Preclinical\nTesting", "ML toxicity models\npredict failure\nbefore animal studies", TEAL),
("Clinical\nTrials", "AI stratifies patients,\noptimizes sites,\ncreates synthetic arms", RGBColor(0x00, 0x96, 0x88)),
("Regulatory\n& Approval", "FDA CDER AI Pilot;\nFirst approval\nprojected 2026-27", RGBColor(0x00, 0x70, 0x64)),
]
box_w = Inches(1.95)
box_h = Inches(3.5)
start_x = Inches(0.35)
for i, (stage, desc, col) in enumerate(stages):
bx = start_x + i * (box_w + Inches(0.08))
# Top box (stage name)
add_rounded_rect(s6, bx, Inches(1.15), box_w, Inches(1.0), col)
# Stage number circle
circ = s6.shapes.add_shape(MSO_SHAPE.OVAL, bx + Inches(0.77), Inches(0.7), Inches(0.45), Inches(0.45))
circ.fill.solid(); circ.fill.fore_color.rgb = GOLD
circ.line.fill.background(); circ.shadow.inherit = False
txb(s6, str(i + 1), bx + Inches(0.79), Inches(0.72),
Inches(0.41), Inches(0.41), size=14, bold=True, color=NAVY,
align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
txb(s6, stage, bx + Inches(0.08), Inches(1.2),
box_w - Inches(0.16), Inches(0.9), size=12, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, wrap=True, valign=MSO_ANCHOR.MIDDLE)
# Description box
add_rounded_rect(s6, bx, Inches(2.3), box_w, Inches(2.2),
RGBColor(0x0F, 0x2D, 0x5A), line_color=col, line_width=Pt(0.8))
txb(s6, desc, bx + Inches(0.1), Inches(2.4),
box_w - Inches(0.2), Inches(2.0), size=11, color=LIGHT_GRAY,
align=PP_ALIGN.CENTER, wrap=True, valign=MSO_ANCHOR.MIDDLE)
# Arrow (not after last)
if i < len(stages) - 1:
arr_x = bx + box_w + Inches(0.0)
arr_y = Inches(1.6)
add_rect(s6, arr_x, arr_y, Inches(0.08), Inches(0.25), TEAL)
# Timeline comparison
add_rect(s6, Inches(0.35), Inches(4.75), Inches(12.65), Inches(0.06), RGBColor(0x1A, 0x3A, 0x6C))
txb(s6, "Traditional timeline: 10–15 years | AI-accelerated timeline: 4–7 years (preclinical compressed 30–40%)",
Inches(0.4), Inches(4.85), Inches(12.0), Inches(0.5),
size=13, color=GOLD, bold=True, align=PP_ALIGN.CENTER)
txb(s6, "AI compresses target ID → preclinical by 30–40%. Clinical phases remain biologically constrained.",
Inches(0.4), Inches(5.4), Inches(12.0), Inches(0.45),
size=11.5, color=MID_GRAY, align=PP_ALIGN.CENTER)
# Source
txb(s6, "Sources: Drug Target Review 2026 | Ferreira & Carneiro, ACS Omega 2025 | Oliveira et al., J Pharm Anal 2026",
Inches(0.4), Inches(7.05), Inches(12.0), Inches(0.35),
size=9, color=MID_GRAY, italic=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 7 — AI Beyond Discovery: Clinical Trials
# ─────────────────────────────────────────────────────────────────────────────
s7 = prs.slides.add_slide(blank)
add_bg(s7, NAVY)
add_rect(s7, Inches(0), Inches(0), Inches(0.12), H, TEAL)
txb(s7, "AI in Clinical Trials: Beyond Discovery",
Inches(0.4), Inches(0.2), Inches(12.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s7, Inches(0.4), Inches(0.95), Inches(5.5), Inches(0.05), GOLD)
apps = [
("Patient Stratification",
"ML on genomics and EHR identifies responders upfront — smaller, faster trials with better signal.",
"🎯"),
("Recruitment Acceleration",
"NLP prescreening of medical records improved enrollment speed ~25% in cardiovascular trial pilots.",
"📈"),
("Drug Repurposing",
"Models trained on approved drugs + disease pathways identify new indications — fastest path to clinic.",
"♻️"),
("Synthetic Control Arms",
"ML on historical data builds virtual placebo arms — reduces patient burden and trial size requirements.",
"🔬"),
("Regulatory AI",
"FDA CDER AI Pilot launched 2025. First AI tool qualified for use in clinical trials: December 2025.",
"✅"),
("Safety Monitoring",
"Real-time ML on trial data detects safety signals and adverse event patterns earlier than traditional review.",
"🛡️"),
]
for i, (title, body, icon) in enumerate(apps):
row = i // 2
col = i % 2
bx_x = Inches(0.35 + col * 6.5)
bx_y = Inches(1.2 + row * 1.95)
add_rounded_rect(s7, bx_x, bx_y, Inches(6.2), Inches(1.75),
RGBColor(0x0F, 0x2D, 0x5A), line_color=TEAL, line_width=Pt(0.8))
txb(s7, icon + " " + title, bx_x + Inches(0.2), bx_y + Inches(0.12),
Inches(5.8), Inches(0.45), size=14, bold=True, color=TEAL, wrap=True)
txb(s7, body, bx_x + Inches(0.2), bx_y + Inches(0.6),
Inches(5.8), Inches(1.05), size=11.5, color=LIGHT_GRAY, wrap=True)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 8 — Risks & Realities (Balanced View)
# ─────────────────────────────────────────────────────────────────────────────
s8 = prs.slides.add_slide(blank)
add_bg(s8, NAVY)
add_rect(s8, Inches(0), Inches(0), Inches(0.12), H, RGBColor(0xFF, 0x60, 0x0A))
txb(s8, "The Balanced Picture: Risks & Realities",
Inches(0.4), Inches(0.2), Inches(12.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s8, Inches(0.4), Inches(0.95), Inches(6.0), Inches(0.05), RGBColor(0xFF, 0x60, 0x0A))
# Two columns: Strengths | Challenges
col_titles = ["What AI Demonstrably Delivers", "What AI Cannot (Yet) Fix"]
col_colors = [TEAL, RGBColor(0xFF, 0x60, 0x0A)]
strengths = [
"30–40% compression of early discovery timelines",
"Preclinical candidate dev: 13–18 months (vs. 3–4 yrs)",
"80–90% Phase I success for AI-originated molecules",
"Novel target identification in weeks (vs. years)",
"In silico toxicity screening before synthesis",
"173+ programs in clinical development (2026)",
]
challenges = [
"Clinical phase timelines unchanged — biology is hard",
"Phase II/III failures still common (Recursion 2025)",
"Model interpretability: black-box predictions limit trust",
"Data quality: inconsistent training sets = poor generalization",
"No FDA-approved AI-designed drug yet (as of July 2026)",
"Smaller AI biotechs face existential funding pressure",
]
for ci, (items, ctitle, ccolor) in enumerate(zip([strengths, challenges], col_titles, col_colors)):
cx = Inches(0.4 + ci * 6.5)
add_rounded_rect(s8, cx, Inches(1.15), Inches(6.1), Inches(0.65),
ccolor if ci == 0 else RGBColor(0xBF, 0x40, 0x00))
txb(s8, ctitle, cx + Inches(0.15), Inches(1.2),
Inches(5.8), Inches(0.55), size=14, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
for j, item in enumerate(items):
iy = Inches(1.9 + j * 0.83)
icon_col = TEAL if ci == 0 else RGBColor(0xFF, 0x60, 0x0A)
add_rounded_rect(s8, cx, iy, Inches(6.1), Inches(0.72),
RGBColor(0x0F, 0x2D, 0x5A), line_color=icon_col, line_width=Pt(0.5))
prefix = "✓ " if ci == 0 else "⚠ "
txb(s8, prefix + item, cx + Inches(0.2), iy + Inches(0.08),
Inches(5.7), Inches(0.56), size=12, color=LIGHT_GRAY, wrap=True,
valign=MSO_ANCHOR.MIDDLE)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 9 — What to Watch: 12-18 Month Outlook
# ─────────────────────────────────────────────────────────────────────────────
s9 = prs.slides.add_slide(blank)
add_bg(s9, NAVY)
add_rect(s9, Inches(0), Inches(0), Inches(0.12), H, GOLD)
txb(s9, "What to Watch: 12–18 Month Outlook",
Inches(0.4), Inches(0.2), Inches(12.0), Inches(0.75),
size=30, bold=True, color=WHITE)
add_rect(s9, Inches(0.4), Inches(0.95), Inches(5.0), Inches(0.05), GOLD)
watchlist = [
("1", "First FDA Approval",
"Insilico's rentosertib in pivotal trials. Projected ~60% probability of first AI-designed drug approval "
"in 2026-2027. A watershed moment for the entire sector."),
("2", "Phase III Readouts",
"Multiple AI-designed programs entering pivotal trials in 2026. "
"Success at scale is the field's defining test — watch Insilico and Recursion closely."),
("3", "Biology Foundation Models",
"LLMs trained on protein sequences, omics, and chemical data are converging. "
"Chai Discovery, Isomorphic Labs (DeepMind), and EvolutionaryScale in active development."),
("4", "Regulatory Framework",
"FDA and EMA actively developing AI-specific drug approval guidance. "
"Clear compliance requirements will unlock larger industry adoption."),
("5", "AI-Designed Biologics",
"Move from small molecules into antibodies, ADCs, cell therapies, and RNA medicines. "
"AI methods for antibody optimization now reviewed in MAbs 2025 and Trends Pharmacol Sci 2025."),
]
for i, (num, title, body) in enumerate(watchlist):
iy = Inches(1.15 + i * 1.21)
# Number badge
circ = s9.shapes.add_shape(MSO_SHAPE.OVAL, Inches(0.4), iy + Inches(0.18),
Inches(0.65), Inches(0.65))
circ.fill.solid(); circ.fill.fore_color.rgb = GOLD
circ.line.fill.background(); circ.shadow.inherit = False
txb(s9, num, Inches(0.42), iy + Inches(0.18),
Inches(0.61), Inches(0.65), size=18, bold=True, color=NAVY,
align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
# Content
add_rounded_rect(s9, Inches(1.2), iy, Inches(11.7), Inches(1.05),
RGBColor(0x0F, 0x2D, 0x5A), line_color=TEAL, line_width=Pt(0.6))
txb(s9, title, Inches(1.4), iy + Inches(0.05),
Inches(3.2), Inches(0.45), size=14, bold=True, color=TEAL)
txb(s9, body, Inches(4.65), iy + Inches(0.1),
Inches(8.1), Inches(0.85), size=11.5, color=LIGHT_GRAY, wrap=True,
valign=MSO_ANCHOR.MIDDLE)
add_rect(s9, Inches(4.5), iy + Inches(0.18), Inches(0.04), Inches(0.65), TEAL)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 10 — Key Takeaways / Closing
# ─────────────────────────────────────────────────────────────────────────────
s10 = prs.slides.add_slide(blank)
add_bg(s10, NAVY)
add_rect(s10, Inches(0), Inches(0), Inches(0.12), H, BLUE)
# Large left block
add_rect(s10, Inches(0.12), Inches(0), Inches(5.8), H, RGBColor(0x0A, 0x2A, 0x5C))
txb(s10, "Key Takeaways",
Inches(0.4), Inches(0.3), Inches(5.2), Inches(0.7),
size=28, bold=True, color=WHITE)
add_rect(s10, Inches(0.4), Inches(1.0), Inches(3.5), Inches(0.05), GOLD)
takeaways = [
"AI has compressed early drug discovery timelines\nby 30-40% — and the economics are transformational.",
"173+ AI programs in the clinic. Phase I success\nrate of 80-90% vs. 52% historically.",
"2025 was the inflection year. 2026-27 brings the\nfirst potential FDA-approved AI-discovered drug.",
"Every major pharma company now treats AI\nas core R&D infrastructure — not optional.",
"Clinical biology remains hard. AI amplifies human\nscience; it does not replace it.",
]
for i, t in enumerate(takeaways):
iy = Inches(1.2 + i * 1.12)
circ = s10.shapes.add_shape(MSO_SHAPE.OVAL, Inches(0.4), iy, Inches(0.35), Inches(0.35))
circ.fill.solid(); circ.fill.fore_color.rgb = TEAL
circ.line.fill.background(); circ.shadow.inherit = False
txb(s10, t, Inches(0.88), iy - Inches(0.03),
Inches(4.95), Inches(1.0), size=12, color=LIGHT_GRAY, wrap=True)
# Right column — closing quote + contact area
txb(s10, '"The question is no longer whether machine\nlearning will change drug discovery —\nit already has."',
Inches(6.5), Inches(1.5), Inches(6.4), Inches(2.0),
size=19, bold=False, italic=True, color=WHITE, font="Calibri Light")
add_rect(s10, Inches(6.3), Inches(1.5), Inches(0.05), Inches(2.0), GOLD)
txb(s10, "— AI in Drug Discovery Report, July 2026",
Inches(6.5), Inches(3.55), Inches(6.0), Inches(0.45),
size=11, color=MID_GRAY, italic=True)
# Call to action box
add_rounded_rect(s10, Inches(6.3), Inches(4.3), Inches(6.6), Inches(2.7),
BLUE)
txb(s10, "For More Information",
Inches(6.6), Inches(4.45), Inches(6.0), Inches(0.55),
size=16, bold=True, color=WHITE)
txb(s10,
"Full research sources available on PubMed:\n"
"• Ferreira & Carneiro, ACS Omega 2025 (PMID: 40547666)\n"
"• Oliveira et al., J Pharm Anal 2026 (PMID: 42491104)\n"
"• Bai et al., Adv Sci 2025 (PMID: 39899688)\n"
"• Vecchietti et al., MAbs 2025 (PMID: 40677216)",
Inches(6.6), Inches(5.05), Inches(6.0), Inches(1.8),
size=11, color=LIGHT_GRAY, wrap=True)
# Bottom bar
add_rect(s10, Inches(0), H - Inches(0.4), W, Inches(0.4), RGBColor(0x07, 0x16, 0x30))
txb(s10, "AI in Drug Discovery | Investor & Stakeholder Briefing | July 2026 | Confidential",
Inches(0.5), H - Inches(0.38), Inches(12.0), Inches(0.35),
size=9, color=MID_GRAY, italic=True)
# ─────────────────────────────────────────────────────────────────────────────
# Save
# ─────────────────────────────────────────────────────────────────────────────
output_path = "/tmp/workspace/ai-drug-discovery-pptx/AI_Drug_Discovery_Investor_Briefing_2026.pptx"
buf = BytesIO()
prs.save(buf)
with open(output_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {output_path}")
print(f"Slides: {len(prs.slides)}")
cd /tmp/workspace/ai-drug-discovery-pptx && python build_deck.py 2>&1
python -c " from pptx import Presentation prs = Presentation('/tmp/workspace/ai-drug-discovery-pptx/AI_Drug_Discovery_Investor_Briefing_2026.pptx') print(f'Total slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame: t = shape.text_frame.text.strip() if t: texts.append(t[:60].replace(chr(10), ' ')) print(f'Slide {i}: {\" | \".join(texts[:3])}') "
AI Drug Discovery Investor Briefing 2026
Presentation · PPTX
| # | Slide | Contents |
|---|---|---|
| 1 | Cover | Title, subtitle, date tag, decorative molecule network graphic |
| 2 | The Problem | 3 stat cards (10-15 yrs, $1-2B, 90% failure) + 2 challenge callout boxes |
| 3 | Market Snapshot 2025-2026 | 6 KPI cards — 173+ programs, $4.5B market, 80-90% Phase I success, $60-110B savings potential |
| 4 | Core Technologies | 6 numbered cards — Deep Learning, GNNs, AlphaFold, Generative AI, Reinforcement Learning, Toxicity ML |
| 5 | Landmark Case Studies | Insilico Medicine/Rentosertib, Recursion Pharmaceuticals, Big Pharma Partnerships 2026 |
| 6 | Discovery Pipeline | 6-stage visual pipeline (Target ID → Approval) with AI role per stage + timeline comparison |
| 7 | AI in Clinical Trials | 6 application boxes — stratification, recruitment, repurposing, synthetic controls, FDA regulatory, safety monitoring |
| 8 | Risks & Realities | Two-column balanced view: 6 strengths vs. 6 challenges — honest for investor scrutiny |
| 9 | 12-18 Month Outlook | 5 watchlist items — First FDA approval, Phase III readouts, Foundation Models, Regulation, Biologics |
| 10 | Key Takeaways | 5 bullet takeaways + closing quote + PubMed source references |