Skip to content

ADD: PINA-Topo Topological Diagnostics for FNOs#828

Open
Vrinda12-tech wants to merge 2 commits into
mathLab:masterfrom
Vrinda12-tech:feature/topology-monitor
Open

ADD: PINA-Topo Topological Diagnostics for FNOs#828
Vrinda12-tech wants to merge 2 commits into
mathLab:masterfrom
Vrinda12-tech:feature/topology-monitor

Conversation

@Vrinda12-tech

Copy link
Copy Markdown

Summary

This PR introduces PINA-Topo, a non-invasive, optional topological diagnostic toolbox for Fourier Neural Operators (FNOs). It provides a TopologyMonitor callback that tracks Betti numbers ($\beta_0$, $\beta_1$) during validation, detecting structural hallucinations (ghost islands) that standard pixel-wise MSE loss completely misses.

Why this matters

FNOs are spectrally accurate but topologically blind. By truncating high frequencies (n_modes), they smooth out sharp features, often generating non-physical disconnected components in fluid simulations. This toolbox gives engineers real-time visibility into the structural health of their models, enabling fail-fast debugging and saving valuable GPU hours.

Technical & Architectural Challenges Overcome

Integrating data-driven sequential loaders into PINA’s physics-informed/condition-based infrastructure presented several strict constraint bottlenecks that required deep structural workarounds:

  1. PINA Condition-Aggregator Realignment: Resolved an internal unpacking crash (dict(data)) within ConditionAggregatorMixin by engineering a custom pina_collate processing strategy. This wraps raw batched data streams directly into key-value maps expected by the compiler.
  2. Strict LabelTensor Key Synchronization: Debugged and corrected an elusive AttributeError regarding raw tensor variable extraction by dynamically synchronizing the dictionary lookup keys (x, u) directly with the SupervisedProblem variable definitions inside the data collator pipeline.
  3. Coordinate-Space Homology Bridge: Implemented structural spatial tensor permutations (B, H, W, C) -> (B, C, H, W) within the prediction gathering hooks to allow GUDHI's cubical complex routines to trace fluid boundary layers without interfering with the FNO's native execution parameters.

Changes

  • pina/topology/: Core topological backend (GUDHI CubicalComplex, Profiler, Monitor).
  • pina/callbacks/: Lazy loader for TopologyMonitor.
  • tests/test_gudhi_backend.py: Structural verification smoke tests.
  • tutorials/tutorial_topology.ipynb: Production-grade tutorial demonstrating the monitor on 2D Darcy Flow.
  • test_monitor.py: End-to-end test validation script.

Design Decisions

  • GUDHI only: Morphological pixel fallbacks were intentionally removed due to calculation inaccuracies on continuous neural operator spatial fields.
  • Fail-fast Execution: Explicit initialization errors are raised if the GUDHI library is missing from the host machine to prevent silent tracking failures.
  • Zero-cost Integration: Engineered as a completely non-invasive module; if the callback is not explicitly imported or registered by the user, it incurs absolute zero computational overhead on PINA's operational footprint.

Testing

  • tests/test_gudhi_backend.py passes cleanly.
  • test_monitor.py executes successfully on the Darcy dataset across the 5-epoch test profile.

Related Issue

Closes #826

- Implements TopologyMonitor (Lightning callback) for Betti numbers (β₀, β₁).
- GUDHI CubicalComplex backend with persistence filtering.
- Lazy-loaded profiler with state consistency.
- Tutorial notebook and smoke tests.
- Closes mathLab#826
@Vrinda12-tech Vrinda12-tech marked this pull request as ready for review July 13, 2026 13:04
@Vrinda12-tech Vrinda12-tech requested a review from a team as a code owner July 13, 2026 13:04
Copilot AI review requested due to automatic review settings July 13, 2026 13:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds PINA-Topo, introducing topological diagnostics (Betti numbers) for Fourier Neural Operator outputs via a TopologyMonitor Lightning callback backed by a lazy-loaded GUDHI profiler/backend.

Changes:

  • Adds a GUDHI-based topology backend and a TopologicalProfiler with lazy backend initialization.
  • Introduces a TopologyMonitor callback to compute/log Betti statistics during validation.
  • Adds tutorial + test/demo scripts intended to show end-to-end usage.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
pina/topology/monitor.py New Lightning callback for periodic validation-time topology checks + logging/alerts.
pina/topology/profiler.py New profiler wrapper that lazy-loads the backend and exposes a simple compute() API.
pina/topology/backends/gudhi_backend.py New GUDHI CubicalComplex backend computing β₀/β₁ over batches.
pina/topology/backends/base.py New backend interface + TopologyResult dataclass.
pina/topology/backends/__init__.py Exposes topology backend symbols.
pina/callbacks/__init__.py Adds a lazy-loader entrypoint for TopologyMonitor.
tests/test_gudhi_backend.py Adds a backend smoke test (currently targets a missing backend).
test_monitor.py Adds an integration script (currently named like a pytest test and runs on import).
tutorials/tutorial_topology.ipynb Adds a notebook tutorial demonstrating data collation and monitoring on Darcy Flow.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pina/topology/monitor.py Outdated
import torch
import logging
import warnings
from pytorch_lightning import Callback, Trainer, LightningModule
Comment thread pina/topology/monitor.py Outdated
result.beta_1_mean > self.threshold_beta_1)

if trigger_beta_0 or trigger_beta_1:
alert = self._generate_alert(result)
Comment thread pina/topology/monitor.py Outdated
if result.beta_1_max is not None:
pl_module.log("topology/beta_1_max", float(result.beta_1_max), sync_dist=True)

def _generate_alert(self, result: TopologyResult) -> str:
Comment thread pina/topology/monitor.py Outdated
Comment on lines +141 to +144
msg = (
f"\n{'='*60}\n"
f"[TOPOLOGY ALERT] Epoch: {self._current_epoch}\n"
)
Comment thread pina/topology/backends/base.py Outdated
Comment on lines +6 to +9
@dataclass
class TopologyResult:
beta_0_mean: float
beta_1_mean: Optional[float] = None # Can be None if backend doesn't support β₁
Comment thread pina/callbacks/__init__.py Outdated
Comment on lines +4 to +7
def TopologyMonitor(*args, **kwargs):
"""Lazy loader for TopologyMonitor to avoid import overhead."""
from pina.topology.monitor import TopologyMonitor as _TopologyMonitor
return _TopologyMonitor(*args, **kwargs) No newline at end of file
Comment thread tests/test_gudhi_backend.py Outdated
Comment on lines +4 to +6
import torch
from pina.topology.backends.morphological_backend import MorphologicalBackend

Comment thread test_monitor.py
from pina.problem.zoo import SupervisedProblem
from pina import Trainer, LabelTensor
from pina.topology.monitor import TopologyMonitor

Comment thread test_monitor.py
input_batch = batch[0].to(pl_module.device)
pred = pl_module.model(input_batch)
return pred.permute(0, 3, 1, 2)
except:
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzEAAAGGCAYAAABLxg9kAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMAFJREFUeJzt3XtYlHX+//HXAHKUgyKoqAGiqWBfLU231NDKTC0rS8tDqWGZ5lfr2uzorroHD2nf7TK/mlZrlttJ7XBltZmltbXfzHJd1zyUKGaaigcQBVGG+/eHPyZHEJDPncPHno/r4upi5n597vc92My8uGcGj+M4jgAAAADAEkGBHgAAAAAAzgUlBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAA52T48OFKSUnxu8zj8Wjy5Mmu7aN79+7q3r27a+vhwkKJAQAAOM2LL74oj8dT4dejjz7q2y4lJUUej0f//d//XW6N1atXy+PxaOnSpeWu+/bbbzV06FA1adJEYWFhSkpK0pAhQ/Ttt99Wa76cnBy/mYKDg3XRRRfplltu0fr162t83IGwadMmTZ48WTk5OYEeBZYJCfQAAAAAtdEf/vAHpaam+l3Wtm3bcts999xzeuyxx5SUlFTlmm+++aYGDRqk+vXrKysrS6mpqcrJydELL7ygpUuX6rXXXtMtt9xSrfkGDRqkPn36yOv1avPmzZo3b54++OADffnll2rfvn211nBTUVGRQkLO7anlpk2bNGXKFHXv3r3cmZ0VK1a4OB0uNJQYAACACvTu3VsdO3asdJuMjAxt3bpV06dP1+zZsyvdNjs7W3feeaeaN2+uzz77TAkJCb7rxo8fr27duunOO+/Uhg0b1Lx58yrnu+yyyzR06FDf9126dFG/fv00b948zZ8/v8LMsWPHFBUVVeXaNREeHu7qeqGhoa6uhwsLLycDAACooZSUFN1111167rnntGfPnkq3nTlzpgoLC7VgwQK/AiNJDRo00Pz583Xs2DE9+eSTNZrl6quvliTt2LFD0s8vi/v00081ZswYJSYmqmnTpr7tP/jgA3Xr1k1RUVGKjo5W3759K3xJ29tvv622bdsqPDxcbdu21VtvvVXh/it6T8zu3buVlZWlpKQkhYWFKTU1VaNHj9aJEyf04osvasCAAZKkHj16+F4et3r1akkVvydm//79ysrKUsOGDRUeHq527dpp0aJFftuUvdxu1qxZWrBggdLS0hQWFqbLL79ca9eurfbtidqNMzEAAAAVyM/P14EDB/wua9CgQbntnnjiCb300ktVno159913lZKSom7dulV4/VVXXaWUlBS99957NZo3OztbkhQfH+93+ZgxY5SQkKDf//73OnbsmCTp5Zdf1rBhw9SrVy/NmDFDhYWFmjdvnrp27ap//etfvpd2rVixQrfeeqvS09M1bdo0HTx4UCNGjPArQ2ezZ88ederUSXl5ebr33nvVunVr7d69W0uXLlVhYaGuuuoqjRs3TrNnz9bjjz+uNm3aSJLvv2cqKipS9+7dtW3bNo0dO1apqalasmSJhg8frry8PI0fP95v+1deeUUFBQUaNWqUPB6PnnzySfXv31/bt29XnTp1zum2RS3kAAAAwGfhwoWOpAq/TpecnOz07dvXcRzHGTFihBMeHu7s2bPHcRzHWbVqlSPJWbJkieM4jpOXl+dIcm666aZK992vXz9HknPkyJGzbrNjxw5HkjNlyhQnNzfX2bt3r7N69Wrn0ksvdSQ5y5Yt8zuOrl27OiUlJb58QUGBExcX59xzzz1+6+7du9eJjY31u7x9+/ZO48aNnby8PN9lK1ascCQ5ycnJfnlJzqRJk3zf33XXXU5QUJCzdu3acsdQWlrqOI7jLFmyxJHkrFq1qtw2mZmZTmZmpu/7p59+2pHkLF682HfZiRMnnCuuuMKpW7eu7zYru33i4+OdQ4cO+bZ95513HEnOu+++W25fsA8vJwMAAKjA//7v/+qjjz7y+zqbiRMnqqSkRNOnT6/w+oKCAklSdHR0pfssu/7IkSNVzjdp0iQlJCSoUaNG6t69u7KzszVjxgz179/fb7t77rlHwcHBvu8/+ugj5eXladCgQTpw4IDvKzg4WJ07d9aqVaskST/99JPWr1+vYcOGKTY21pfv2bOn0tPTK52ttLRUb7/9tm688cYK31fk8XiqPL4zvf/++2rUqJEGDRrku6xOnToaN26cjh49qk8//dRv+9tvv1316tXzfV92Bmz79u3nvG/UPrycDAAAoAKdOnWq8o39ZZo3b64777xTCxYs8PsY5jJl5aSszJxNdcuOJN17770aMGCAgoKCFBcXp4yMDIWFhZXb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l17qdOjQocqZMzMzndatW/t+Xps3b3bGjRvnSHJuvPFG33aSnKCgIOfbb7/1y2dlZTmNGzd2Dhw44Hf5HXfc4cTGxvp+/jfddJOTkZFR6SyxsbHO/fffX+k2ycnJzrBhwyo8jtNvy1WrVjmSnObNm/v9GywtLXVatmzp9OrVyyktLfVdXlhY6KSmpjo9e/asdP8A8GtQ9tiVm5vrbN++3Xn22WedmJgY56KLLnKKioqM1i573Krqq6LHx8rMnDnTkeTs2LHDaL5f8tgzMzOrdewVPc6dbu3atY4k56WXXip33YQJExxJzvHjx41mRe3DmRgXlL0kp6LfEnTv3l3//ve/fd/PnDlTDz30kN82Z54deP/99xUcHKxx48b5Xf7b3/5WS5cu1QcffKCxY8fWaNb77rvP7/tu3brprbfe0pEjRxQTE+P7bcWZ+37ggQf8Xupk6sw53FbRcb788svVym7ZssX3kjXp1Onyvn37lntJWGZmptLT033fO46jZcuWaeDAgXIcRwcOHPBd16tXL7322mtat26dunTpori4OP34449au3atLr/88grniIuL05o1a7Rnzx4lJSVVa/aqDBs2TBEREb7v169fr++//14TJ07UwYMH/ba95ppr9PLLL6u0tJT3zQDA/9ejRw/t3LlT0qkPtAkLC/O7/umnn9Ybb7whj8ej7t27609/+lOlL7t6+OGH/d6HeTanv5wrUCo79jVr1mjUqFHasmWL7rjjjgpf6n6mp556SocPH65yu6oeA4uKiiSp3M9Cku+9qkVFRRVeD3tRYlxQ9vrTo0ePlrtu/vz5Kigo0L59+yq8kwoJCVHTpk39Ltu5c6eSkpLKva617BO+yu5AauL014pKP98pHj58WDExMdq5c6eCgoKUlpbmt12rVq1qvM+KpKamurre6cLDw/1KiHTqOKtzRymdep/Jc889J4/Ho/DwcLVs2VKJiYnltjvzGHJzc5WXl6cFCxZowYIFFa69f/9+SdIjjzyilStXqlOnTmrRooWuu+46DR48WF26dPFt++STT2rYsGFq1qyZOnTooD59+uiuu+5S8+bNq3UcFTlz5u+//17SqXJzNvn5+bXiwRMAaoMXXnhBOTk5WrFihR599FF98803ev311yWdeiK/ePFiffHFFwoNDdVNN92kN998U7feeutZ10tPT/f7hVhtVtmxp6am6tVXX9Wrr76qH374oVrrdejQwZW5yn45V1xcXO66spfqnf4LPFwYKDEuiI2NVePGjbVx48Zy15W9R+Zsn9MeFhZW499yn+03O5W9gT04OLjCy51zeF+KGyq6M/F4PBXOca5vyD/bMVZXVFSUrr322iq3O/MYyv6OzNChQ89aCsreu9OmTRtt3bpVy5cv19///nctW7ZMc+fO1e9//3vfx0cPHDjQd6ZsxYoVmjlzpmbMmKE333xTvXv3llT5v4GKboezzTxz5ky1b9++wrX446EA8LNrrrlGkpSVlaWMjAxNmjRJ48eP15VXXun7Uwtlv/EfNGiQ3nvvvUpLTH5+vu9MQmVCQ0NVv359dw6ihio79sTERCUmJp7Tc5pDhw7pxIkTVW4XERFR6fuByj5Q6aeffip33U8//aT69etzFuYCRIlxSd++ffX888/rq6++Mn4jdHJyslauXKmCggK/szFlH3NY9ndmyn47npeX55c3OVOTnJys0tJSZWdn+519OR9/mbdevXravn17ucvPPJ7a9Gkopyv7NDev11utEhQVFaXbb79dt99+u06cOKH+/fvrz3/+sx577DHf6e/GjRtrzJgxGjNmjPbv36/LLrtMf/7zn30lpl69euV+/tKp26w6Z2zKzrjFxMRUa2YAwM+uuuoqSdKePXsknTrbfvp9b4MGDXxn4M9m/PjxWrRoUZX7yszM/EX+yHNNnXnsNdG/f399+umnVW43bNiwSl+e1qRJEyUkJOjrr78ud91XX3111l/SwW680N0lDz/8sCIjI3X33Xdr37595a4/lzMdffr0kdfr1Zw5c/wu/8tf/iKPx+N7AhsTE6MGDRros88+89tu7ty5NTiCU8rWnj17tt/lTz/9dI3XrK60tDRt2bLF76/r/vvf/y73Ub+RkZGSype3QAsODtatt96qZcuWVXhW7vTjOvP9J6GhoUpPT5fjODp58qS8Xq/y8/P9tklMTFRSUpLf6fK0tDR9+eWXfr/JWr58uXbt2lWtmTt06KC0tDTNmjWrwpdD8peOAeBnGzZs8Pv+q6++kvTzL4QSExP97jdzc3MrfDny6R5++GF99NFHVX499dRTLh/Nuanq2GviqaeeqtaxP/zww1Wudeutt5Z7/Pv444/13XffacCAATWeEbUXZ2Jc0rJlS73yyisaNGiQWrVqpSFDhqhd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",
- Moved core logic to pina/_src/topology/ (PINA internal pattern)
- Fixed all imports to use absolute pina._src paths
- Updated public API (pina/topology/__init__.py)
- Added GudhiBackend to public exports for testing
- Fixed test file to use the public API
- All smoke tests pass
@Vrinda12-tech Vrinda12-tech requested a review from Copilot July 13, 2026 16:56

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: Topological Monitor for FNOs (PINA-Topo)

2 participants