Back to projects
IBM x UNSA Two-Track Winner (1 of 5, vs 600+ participants)

Pandexis

IBM x UNSA two-track winning epidemic simulator that pairs a four-layer SEIR/Monte Carlo engine with a fault-tolerant RAG LLM explainer, proving that scientific models can be honest about uncertainty at demo time.

The Problem

During an outbreak scenario, public-health responders and non-technical stakeholders need region-level spread forecasts with explicit uncertainty, not black-box predictions. Existing tools either skip the uncertainty quantification or require an epidemiologist to interpret the output.

My Role

Project lead and #1 of 5 contributors. Owned the pandemic modelling core: the vectorized SEIR simulation, mobility-driven spread formulas implemented from research papers, and the polar-view visualisation.

The Approach

  • Built a four-layer simulation stack: a region-indexed SEIR model with mobility coupling, Monte Carlo uncertainty bands for 30-60 day forecasts, and a RAG retrieval layer over epidemiology papers backing every /lookup call.
  • Designed a fault-tolerant 3-provider LLM fallback chain (IBM watsonx Granite chat -> Claude Haiku -> deterministic template) so the /explain endpoint never fails open during a live demo or real query.
  • Deployed the FastAPI backend on IBM Cloud VPC/VSI (Toronto region) using IBM Z/LinuxONE infrastructure, with Granite embeddings powering the RAG index and a MapLibre GL JS + Next.js frontend surfacing the country/region risk map.
  • Shipped 104 automated tests (73 backend, 31 frontend) wired to CI/CD auto-deploy, enforcing regression coverage across the simulation math, the fallback chain, and the API surface.

Key Decisions

  • Chose a deterministic SEIR + Monte Carlo approach over a pure ML model so uncertainty bands are traceable to actual parameters (transmission rate, mobility weight) rather than opaque learned weights, which made the output defensible to judges and stakeholders.
  • Built the 3-provider fallback (Granite -> Claude -> template) rather than a single LLM dependency because IBM watsonx Granite was a new-to-me enterprise stack under a hackathon timeline. The template fallback guaranteed a coherent explanation even if both cloud providers rate-limited, which is the same defensive design I would apply to any production AI system.
  • Reported uncertainty bands explicitly in the UI instead of surfacing a single point forecast, accepting that wider bands look less confident in exchange for being honest about model limits. That trade-off is the same one that matters in financial or risk-modelling contexts where overconfidence has a real cost.

Impact & Results

  • Won two tracks as project lead against 600+ participants from a 10,000+ applicant pool at IBM x UNSA.
  • 104 automated tests (73 backend + 31 frontend) on CI/CD gave the team a regression net across the simulation math and LLM fallback chain throughout the build.

The Stack

PythonFastAPINext.jsMapLibre GL JSIBM watsonx GraniteGranite EmbeddingsClaude HaikuRAGIBM Cloud VPC/VSIIBM Z/LinuxONECI/CD (GitHub Actions)

What I Learned

  • Ramping on IBM Z/LinuxONE and watsonx Granite from zero during a hackathon sprint taught me that the fastest way to learn an unfamiliar enterprise stack is to wire it behind an abstraction (the fallback chain) so the rest of the system can keep moving while I figure out the new API.
  • Writing 104 tests during a hackathon felt like overhead at first, but it actually let me refactor the SEIR core mid-sprint without breaking the API contract. I would make that call again on any project where the simulation math is load-bearing.
  • The polar-view section I owned showed me that communicating uncertainty visually, uncertainty bands on a map, is a product decision as much as a technical one. A correct forecast that users cannot read is not useful.