Prince Savsaviya

I work where simulation meets systems.

Software & ML engineer, M.S. Computer Science from UC Riverside. I ship systems software: an open-source second display for Linux, a Layer-7 load balancer in Go, a streaming geospatial pipeline, and the numerical solvers behind published research. I can tell you which decision in each one was the hard part.

Open to Software Engineering · ML Engineering · Applied AI · Systems
Published in the Journal of Power Sources · GPL v3 maintainer

Selected work

Four more, and what was difficult about each.

Anyone can list what they built. These are the decisions that took the longest to get right.

Wildfire-Twin: streaming geospatial digital twin

Kafka · Spark Structured Streaming · Apache Sedona
IoT sensors→Kafka→Spark Structured Streaming →Sedona spatial join→H3 res-7→DuckDB sink

Real-time fire-risk joins against 11.5M building footprints, indexed with H3 at resolution 7 and landed in a DuckDB analytical sink that keeps the dashboard stable at statewide zoom.

The hard part

The spatial join was the bottleneck, and it wasn't the algorithm: it was the boundary. Moving the join onto native Sedona Java expressions instead of crossing into Python per row cut P95 latency by 91%, from 215s to 18.65s.

KafkaPySparkApache SedonaDuckDBH3Streamlit

Layer-7 load balancer

Go · TypeScript control plane · Apr – Jun 2025
HTTP request→Go net/http LB→ RR / WRR / LeastConn→health check→backend pool

A Layer-7 balancer in Go with Round Robin, Weighted Round Robin and Least Connections, plus a TypeScript control plane for changing weights and circuit-breaker settings while traffic is flowing.

The hard part

Getting the circuit breaker to fail usefully. Ejecting an unhealthy backend immediately just moves its load onto the next one and takes that down too, so the breaker needs a cooldown window before a backend is eligible again. Otherwise a single slow service cascades through the whole pool.

GoTypeScriptDockernet/http

RetrieveX: hybrid search engine

BM25 + dense retrieval over 150k+ drug records
query→BM25 · Elasticsearch+BERT · FAISS →reciprocal rank fusion→Django REST · P95 <200ms

Lexical and dense retrieval run side by side and are merged with reciprocal rank fusion, behind a Django REST API. Three plug-and-play backends: Lucene, Elasticsearch, and BERT/FAISS. The retrieval strategy is swappable rather than baked in.

The hard part

Lexical and semantic scores aren't on a comparable scale, so blending them by score means tuning a weight that only holds for the queries you tuned it on. Fusing by rank instead sidesteps the calibration problem entirely and keeps both backends independently replaceable.

DjangoBERTFAISSElasticsearchPyTorch

Fluid–structure interaction framework

M.S. thesis · FEniCSx · PETSc · MPI
Navier–Stokes (ALE)⇄nonlinear solid →Dirichlet–Neumann + Aitken→ALE mesh motion →<0.5% vs Turek–Hron

A modular pipeline coupling an ALE Navier–Stokes fluid solver, nonlinear solid mechanics and mesh motion, validated across 9 benchmarks (CFD1–3, CSM1–3, FSI1–3) over six refinement levels, with configuration-driven runs and checkpoint restart.

The hard part

Partitioned FSI diverges when the fluid and structure have comparable density: the added-mass effect. Fixed-point iteration simply won't converge. Aitken relaxation adapts the step from the residual history each iteration, which is what makes the FSI2 oscillation stable rather than explosive.

FEniCSxPETScMPIGmshPython
Research

Physics where the data runs out.

Battery degradation data is expensive to collect and sparse at exactly the conditions you care about. A model that only knows the data extrapolates badly there; one that also knows the governing equations does not.

Journal of Power Sources · Vol. 627, 2025 · IF ~8.1

Hybrid PDE–ML model for Li-ion degradation

Physics-informed PDEs combined with Gaussian Process Regression over 200k+ charge cycles, forecasting State of Charge, State of Health and Remaining Useful Life for NCA cells across varying temperature and C-rate, with GPR, Random Forest, SVM, XGBoost and neural networks compared as an ensemble.

↓98%MSE · 10.36 → 0.21
↓86%RMSE · 3.22 → 0.46
↓65%MAE · 0.74 → 0.26
The hard part

Making the physics actually constrain the fit rather than sit alongside it. The PDE terms have to enter where the data is thinnest. Otherwise the ML half simply overrides them and you have a data-only model wearing a physics label.

FSI2 · Turek–Hron benchmark My own solution. A flexible flap shedding a vortex street, sustained rather than damped, which is the behaviour the benchmark exists to test.

Validation, not vibes

The framework is checked against the Turek–Hron benchmarks that everyone in the field reports: the same quantities, the same meshes, published numbers to disagree with.

9benchmarks validated
<0.5%error vs reference
L0–L5refinement levels
Experience

Where I've been.

Mar 2026 – PresentOpen source

Author & maintainer: TethrLink

GPL v3 · Python, GStreamer, PipeWire, Wayland/D-Bus, GTK4, Kotlin
  • Shipped 2.0.0, adding touch: pointer, click, right-click and two-finger scroll injected through GNOME's RemoteDesktop API, which scopes input to the virtual display at the platform level. Coordinates travel normalised to [0,1] with type/length/payload framing, so an unrecognised message is skippable rather than desynchronising an older peer.
  • Built the capture path on Mutter's ScreenCast D-Bus API and PipeWire to create a true virtual monitor rather than a mirror, deriving capture geometry from the tablet's own height and aspect ratio so the shared edge is fully crossable in GNOME and the image is never stretched.
  • Negotiated the H.264 encoder at runtime, hardware first, accepting a candidate only after it genuinely encodes a frame at the real capture size, then cached the winner against a fingerprint of the GStreamer install, cutting startup from ~2.06s cold to ~0.44s warm and re-probing automatically after a driver upgrade.
  • Replaced a hardcoded tether subnet with runtime detection of USB-attached interfaces via /sys/class/net, restricting the server to USB-attached peers and loopback, a boundary that matters far more once reaching the port means controlling the machine, not just seeing it.
  • Packaged for Snap and Debian, and shipped the Jetpack Compose / MediaCodec Android client to the Play Store closed alpha track (Kotlin DSL signing, R8, targetSdk 35).
May 2025 – Mar 2026Riverside, CA

Graduate Researcher

University of California, Riverside
  • Engineered a modular fluid–structure interaction pipeline coupling Navier–Stokes fluid, nonlinear solid mechanics and ALE mesh-motion solvers using FEniCSx, PETSc and MPI.
  • Validated 9 standalone benchmarks (CFD1–3, CSM1–3) to <0.5% error against published references on refined meshes across six refinement levels (L0–L5).
  • Integrated strong Dirichlet–Neumann coupling with Aitken relaxation and adaptive time stepping, reproducing stable FSI1/FSI2 oscillatory behaviour.
  • Automated a configuration-driven reproducibility framework with mesh refinement and checkpoint-based restart.
May 2023 – Dec 2023During B.E.

Research Intern

Adani Institute of Infrastructure Engineering
  • Devised a hybrid PDE–ML model for Li-ion battery degradation, reducing MSE by 98% (10.36 → 0.21), RMSE by 86% (3.22 → 0.46) and MAE by 65% (0.74 → 0.26) by combining physics-informed PDEs with Gaussian Process Regression.
  • Forecast State of Charge, State of Health and Remaining Useful Life for NCA cells under varying temperature and C-rate using an ensemble of GPR, Random Forest, SVM, XGBoost and neural networks.
  • Published in the Journal of Power Sources, Vol. 627, 2025.
Graduated Mar 2026Riverside, CA

M.S. Computer Science

University of California, Riverside · GPA 3.59
  • Thesis: a modular fluid–structure interaction framework validated against the Turek–Hron benchmark suite.
Toolkit

What I reach for.

Highlighted are the ones I've shipped something non-trivial with.

Languages

PythonGoKotlin C++TypeScriptJava

Systems & desktop

GStreamerPipeWireWayland / D-Bus GTK4 + LibadwaitaAndroid SDKJetpack Compose MediaCodecTCP/UDPLinux MPICUDA

Machine learning

PyTorchPhysics-informed MLScikit-learn TensorFlowTransformers / BERTHugging Face Fine-tuningRAGTime-series forecasting Computer visionNLPOptuna

Scientific computing

FEniCSxPETScGmsh NumPy / SciPyFinite elementsALE methods

Data & backend

KafkaPySparkApache Sedona DuckDBFastAPIDjango REST APIsFAISSElasticsearch PostgreSQLMongoDBH3

Infrastructure

DockerGitHub ActionsKubernetes AWS (EKS, EC2, S3)MLflowPrometheus Snap / dpkgHadoop
Get in touch

Tell me what you're building.

Open to roles in Software Engineering, ML Engineering, Applied AI and Systems Development. Whether it's about the research, a TethrLink bug, or a role, my inbox is open.