ES
← Back to Portfolio
Scientific Machine Learning July 2026

Pulso — Well-Test Diagnostic-Curve Shape Clustering and Attribution

An unsupervised catalogue of flow-behaviour classes ("GeoTypes") for fractured reservoirs: it clusters the SHAPE of pressure-transient Bourdet-derivative curves with DTW k-medoids, attributes each class to the fracture-network descriptors that control it (Random Forest + SHAP), and ships a browser workbench that classifies a user curve against the baked medoids with conformal prediction. It reproduces and extends Kamel Targhi et al. 2026 (Comp. Geosciences 30, 57) on a real 4TU corpus (~4768 curves), then transfers the same shape diagnostic to two real aquifer pumping-test sites, with an explicit caveat that the shape transfers but the physics does not.

Cases
22 baked case studies: simulated DFN/DFM ensembles (GeoDFN, open-DARTS, Warren-Root families), a real 4TU well-test corpus (low/mid/high-perm), and real aquifer field campaigns
Method ladder
Physics: Bourdet derivative + Warren-Root dual-porosity via Stehfest inversion (also the live lane) · unsupervised: DTW k-medoids + MDS + silhouette · attribution: Random Forest + SHAP + permutation + rank-agreement · representations: UMAP, t-SNE, functional PCA, catch22 · learned: InceptionTime, PatchTST, curve autoencoder, embedding (ONNX)
Real data
4TU.ResearchData corpus (DOI 10.4121/8291d285, GPL-3, vault-only): ~4768 dimensionless Bourdet-derivative curves + ~5000 DFN descriptor rows. welltestpy field sites (MIT, Zenodo 4139374): Horkheimer Insel + Lauswiesen. Raw curves never redistributed; only derived artifacts ship
Results (real) and controls
Real 4TU silhouette: low-perm 0.72 (k=2, two classes one rare), mid-perm 0.86, high-perm 0.58. Controls: single-regime 0.137 (correct null), noisy family 0.172 (correct degradation). Lauswiesen field: attribution SKIPPED (only 8 curves), a proof-of-transfer not a study
Learned tier
4 ONNX models in-browser. Test accuracy InceptionTime 0.911 / PatchTST 0.902 is measured against the pipeline own k-medoids labels (k=3), not external ground truth; training-set silhouette there is a weak 0.190, so the net reproduces a weakly-separated clustering rather than a validated class
Compute
Offline lane bakes clustering, attribution and models (Python, seeded, open-DARTS heavy sub-lane). Live lane: a Pyodide physics core (Bourdet + Warren-Root/Stehfest) plus onnxruntime-web for the 4 models. 46 Python tests, 39 docs pages. Static on GitHub Pages
Pulso — Well-Test Diagnostic-Curve Shape Clustering and Attribution — Architecture
#scientific-ml #well-test #pressure-transient #bourdet #warren-root #clustering #dtw #shap #conformal-prediction #onnx #geosciences #reservoir

Business Context

Well-test interpretation is where subsurface uncertainty gets narrowed before expensive decisions (where to drill, whether a fracture network is connected enough to produce). The value of a shape catalogue is that it turns a one-off interpretation into a reusable vocabulary: a new curve is placed against known behaviour classes, and the attribution layer says which fracture-network property most likely drives that behaviour, which in turn tells you what data would most reduce the ambiguity. The same shape-diagnostic idea carries to aquifer pumping tests, but Pulso is explicit that only the shape transfers: aquifer tests are a different physical system, transmissivity and storativity are unknown, so those curves are clustered by shape, not by a physically referenced dimensionless response.

Strategic Value

The honest differentiator is real licensed corpora plus published null and limit results. On the real 4TU curves the clustering is genuinely good (silhouette 0.72 on low-perm, 0.86 on mid-perm), and it is anchored against a single-regime control at 0.137 (the null that shows the method is not inventing structure in noise) and a noisy family at 0.172 (correct degradation). A DARTS analytic validation gate passes on a homogeneous anchor (relative L2 0.0108 against a 0.05 tolerance). Four ONNX models run inference in the browser. But Pulso is careful about what it does not claim: the strong learned-model accuracy (InceptionTime, PatchTST) is against the pipeline own k-medoids labels, not an external ground truth, so it measures how well the net reproduces the clustering, not classification against reality; the training-set silhouette there is weak (0.190). The aquifer transfer is a shape-diagnostic proof on tiny samples, with field attribution skipped where only eight curves exist. It reproduces a 2026 Computational Geosciences paper and extends it, with the negative results kept in.

The Challenge

A well test records how pressure responds when a well is produced or shut in, and the diagnostic Bourdet derivative of that response has a shape that encodes the flow regimes the fluid passed through. In a fractured reservoir the same descriptors that shape the curve (fracture density, connectivity, aperture) are exactly the geological unknowns an operator wants to constrain. The hard part is that these curves are unlabelled: there is no ground-truth "class" to train against, the recurring behaviour types have to be discovered from the shapes themselves, and any claim that a method found real structure has to survive a control where there is no structure to find.

Our Approach

Pulso is a shape-first, unsupervised catalogue. It computes the Bourdet derivative of each pressure-transient response and clusters the curves by shape with DTW k-medoids, selecting k with silhouette and a k-table, embedding with MDS. Each behaviour class is then attributed to the fracture-network descriptors that control it through a Random Forest with SHAP, permutation importance and rank-agreement, recorded per case behind a gate. Curves come from three sources: GeoDFN discrete-fracture-network ensembles and an open-DARTS DFM simulation lane, a real 4TU well-test corpus (~4768 dimensionless Bourdet-derivative curves plus ~5000 DFN descriptor rows), and two real aquifer pumping-test field sites (welltestpy: Horkheimer Insel and Lauswiesen). The classical physics core is a Bourdet derivative plus a Warren-Root dual-porosity model via Stehfest inversion, which is also the Pyodide live-lane engine. Four learned models (InceptionTime, PatchTST, a curve autoencoder and an embedding model) are exported to ONNX and run in the browser; a user pastes a curve and it is classified against the baked medoids with a conformal prediction set.

Key Performance Indicators

KPIBaselineResultImpact
Structure found, and controlledA clustering score with no null to compare againstSilhouette 0.72 (real low-perm) and 0.86 (real mid-perm) against a 0.137 single-regime controlThe null proves the classes are real shape structure, not noise
Real data, not plannedA method demonstrated on simulation only~4768 real Bourdet-derivative curves + ~5000 DFN descriptor rows (4TU) + 2 real aquifer field sites (welltestpy)Reproduces and extends a 2026 Computational Geosciences paper
Validation gateTrust the simulator without a known-answer checkDARTS analytic anchor passes: relative L2 0.0108 against a 0.05 tolerance on a homogeneous caseThe simulation lane is checked against a closed-form answer
In-browser classificationA server inference service4 ONNX models (InceptionTime, PatchTST, autoencoder, embedding) run in the browser; a user curve is classified against baked medoids with conformal predictionAccuracy is against the pipeline own cluster labels, not external ground truth

Architecture

pulso pipeline

pulso pipeline

A shape vocabulary for pressure-transient curves

Pulso is an unsupervised catalogue of flow-behaviour classes (“GeoTypes”) for fractured reservoirs. It takes the diagnostic Bourdet derivative of a pressure-transient (well-test) response, clusters curves by shape with DTW k-medoids, and attributes each behaviour class to the fracture-network descriptors that control it. It reproduces and extends Kamel Targhi et al. 2026 (Computational Geosciences 30, 57). Live at pulso.fasl-work.com.

Real curves, a physics core, and a browser lane

The corpus is real and licensed: a 4TU well-test corpus (~4768 dimensionless Bourdet-derivative curves plus ~5000 DFN descriptor rows, GPL-3, vault-only) alongside simulated GeoDFN and open-DARTS ensembles, for 22 baked case studies. The classical physics core (Bourdet derivative plus a Warren-Root dual-porosity model via Stehfest inversion) is also the Pyodide live-lane engine, and four ONNX models (InceptionTime, PatchTST, a curve autoencoder, an embedding model) classify a user-pasted curve against the baked medoids in the browser with conformal prediction.

The nulls are the point

On the real 4TU curves the clustering is genuinely good: silhouette 0.72 on low-perm and 0.86 on mid-perm. What makes that trustworthy is the control next to it, a single-regime case at 0.137: when there is no structure, the method correctly does not find any, and a noisy family degrades to 0.172 as it should. A DARTS analytic validation gate passes on a homogeneous anchor (relative L2 0.0108 against a 0.05 tolerance), checking the simulation lane against a closed-form answer.

Honest about the limits

Two limits stay on the card. First, the aquifer generalization is a shape-diagnostic transfer only: aquifer pumping tests are a different physical system, transmissivity and storativity are unknown, so those curves are clustered by shape, not by a physically referenced response, and where a field site has only eight curves the attribution is skipped (a proof-of-transfer, not a study). Second, the learned models’ strong test accuracy (InceptionTime 0.911, PatchTST 0.902) is measured against the pipeline own k-medoids cluster labels, not an external ground truth, and the training-set silhouette there is a weak 0.190, so those nets reproduce a weakly-separated clustering rather than classify against reality. The real 4TU low-perm case is k=2 with one rare class, described as two behaviour classes (one rare) rather than a rich catalogue.

Live demo · Source on GitHub

Technology Stack

Python DTW scikit-learn SHAP open-DARTS welltestpy Pyodide ONNX onnxruntime-web TypeScript React Vite KaTeX

In action

A short tour of the live app — the real interface, recorded from the deployed site.

Pulso — Well-Test Diagnostic-Curve Shape Clustering and Attribution in action

Application Screenshots

Pulso — Well-Test Diagnostic-Curve Shape Clustering and Attribution
Pulso — Well-Test Diagnostic-Curve Shape Clustering and Attribution