ADD: PINA-Topo Topological Diagnostics for FNOs#828
Open
Vrinda12-tech wants to merge 2 commits into
Open
Conversation
- 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
There was a problem hiding this comment.
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
TopologicalProfilerwith lazy backend initialization. - Introduces a
TopologyMonitorcallback 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.
| import torch | ||
| import logging | ||
| import warnings | ||
| from pytorch_lightning import Callback, Trainer, LightningModule |
| result.beta_1_mean > self.threshold_beta_1) | ||
|
|
||
| if trigger_beta_0 or trigger_beta_1: | ||
| alert = self._generate_alert(result) |
| 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 on lines
+141
to
+144
| msg = ( | ||
| f"\n{'='*60}\n" | ||
| f"[TOPOLOGY ALERT] Epoch: {self._current_epoch}\n" | ||
| ) |
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 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 on lines
+4
to
+6
| import torch | ||
| from pina.topology.backends.morphological_backend import MorphologicalBackend | ||
|
|
| from pina.problem.zoo import SupervisedProblem | ||
| from pina import Trainer, LabelTensor | ||
| from pina.topology.monitor import TopologyMonitor | ||
|
|
| 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/13XffacCAATWeEbUXZ2Jc0rJlS73yyisaNGiQWrVqpSFDhqhdu3ZyHEc7duzQK6+8oqCgoHLvf6nIjTfeqB49euiJJ55QTk6O2rVrpxUrVuidd97RAw884HeHMXLkSE2fPl0jR45Ux44d9dlnn+m7776r8XG0b99egwYN0ty5c5Wfn68rr7xSH3/8sbZt21bjNavr7rvv1v/8z/+oV69eysrK0v79+/Xss88qIyPD9+EJ0qnTyunp6Xr99dd18cUXq379+mrbtq3vj28F0vTp07Vq1Sp17txZ99xzj9LT03Xo0CGtW7dOK1eu1KFDhyRJ1113nRo1aqQuXbqoYcOG2rx5s+bMmaO+ffsqOjpaeXl5atq0qW677Ta1a9dOdevW1cqVK7V27Vq/B7KRI0dq6dKluv766zVw4EBlZ2dr8eLF1X5QCQoK0vPPP6/evXsrIyNDI0aMUJMmTbR7926tWrVKMTExevfdd3+R2woAbHPDDTdo9OjRSk9P16ZNmzR37lx169bN95v+Pn36aOzYsRo/frxCQ0P1yiuvVPqeQ8nd98Tk5+frmWeekSTfLwDnzJmjuLg4xcXF+X0o0PDhw7Vo0SLt2LHD97fYKlPVsdeEW++JkaTHH39cS5YsUY8ePTR+/HgdPXpUM2fO1CWXXKIRI0a4th/UIgH8ZLQL0rZt25zRo0c7LVq0cMLDw52IiAindevWzn333eesX7/eb9thw4Y5UVFRFa5TUFDgPPjgg05SUpJTp04dp2XLls7MmTP9PgbXcU59FG5WVpYTGxvrREdHOwMHDnT2799/1o9Yzs3N9csvXLiw3EcwFhUVOePGjXPi4+OdqKgo58Ybb3R27drl6kcsnzlHmcWLFzvNmzd3QkNDnfbt2zsffvhhuY9YdhzH+ec//+l06NDBCQ0N9ZvrbLdp2X6rkpmZWeVHHzvOqY9YPtvHH+/bt8+5//77nWbNmjl16tRxGjVq5FxzzTXOggULfNvMnz/fueqqq5z4+HgnLCzMSUtLcyZMmODk5+c7juM4xcXFzoQJE5x27do50dHRTlRUlNOuXTtn7ty55fb31FNPOU2aNHHCwsKcLl26OF9//fVZP2J5yZIlFc78r3/9y+nfv79vnuTkZGfgwIHOxx9/XOVtAQAXurLHkAkTJjjNmzd3wsPDnebNmzujR48u93g2a9Ysp3Pnzs4VV1zhPPLII47X6z1vc5b96YWKvs58HL311ludiIgI5/Dhw5WuWd1jz87OdtLS0px69eo50dHRTlpamvPJJ5/8Akd5dhs3bnSuu+46JzIy0omLi3OGDBni7N2797zOgPPH4zjn+R3dAAAAFpk8ebKmTJmi3NxcNWjQINDjuKJhw4a66667NHPmzEq3uxCPHRcG3hMDAADwK/Ltt9+qqKhIjzzySKBHAWqM98QAAAD8ipz5XlPARpyJAQAAAGAV3hMDAAAAwCqciQEAAABgFUoMAAAAAKtQYgAAAABYpdqfTjbZ4zHa0Y1G6VM6tDRcINMw39EwL0mGf5w2t2Ndo/w3pgNI+trwhvinrgzo/iUp99OLzBb40nAA07wkbTTMb3NhBn1vmM8JcF6SdhulHWeyCzPg12i34o3yTR45ZD5Ef7P4us5tjPJv6WazAST9R5cY5S/VeqN8Z60xykvSAZn9/ZX1am+UL1SkUV6S9qixUT5HqUb59vqXUV6S+up9o7zp8xtJevqbx8wWeNtwANPnFpL0ttlzA8ep3hN+zsQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqIYEe4JwEB3oAFxje4l7DG6HEhRvRdAbj/Xtd2H9JgPNuqA0zGLsgDgKokSZ/OGSUn/yk+Qy9Ddfo/MZmo3z8gANmA0jKVgujfCttNco3ecvs5yhJijKL97ruQ6N8oSLMBpD0k5KM8p+pm1G+h1Yb5SXp8vc3GuWv6bPSeIZdHZoZ5ZdpqNkAKWZxSdKXLV1YpGqciQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsEnK+dlTHjUXO27RnEezCGobH4DUcwuvCjVisMMN8qFH+xHGzvCTpuOV5SSpxYQ0AgZNpFh/pwghNp5jl/z2gpVH+K3U2G0DSF7rSKN9R3xjl7+r3klFekkqCzR7b/6FuRvlCRRrlJWmXmhnl16iTUb7IhWNI7LPPKO/Gv+cPj/UyW2Cb4QAbDfOStNeFNaqBMzEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALBKyAW3o8oEG+bdOAjDNYoVapQvVITZAJKKDNcoUqRRvvCoWV6SdDTA+eOGeVfWcFwYItBKAj0AEDBNr3ZhkfZm8QJFG+W/VkezASTtUjOjfDPtMsofCI43ykuS1/DJgenPIU9xRnnJ/Odgmk9VjlHejRm2qYXxDEf3NjBbIMd0AMO8JIW7sEY1cCYGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWCQn0AOfEdNpA5yUpzCx+wnCBIkWaDSCp0HCNAkUb5UuPmh+Djluel6SSgC8g6aQLa5iw6y4M8BNuFnfWm4/gWWKWb9Zvl1E+RTlmA0gqVqhRvoWyjfLN9+w1yrshL2mTUX6fEo1n8CrYKJ+nOKN8muHPUZIuLV5vlD8aZvb8RpLapn1tlN/Y/XKzAdx4WG3hwhrVwJkYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCohgR7AKsEurGF4ixcqMqD5WjHDUY9ZXpKOGuaPBzjvyhonXRiixIU1gF8pw/99SrzmI9S5yCyfpzijfIGizQZwwQmFGuVPRrk0iAHT29GNn4PpGoWKCGhekvLC4ozyJS48UfSarmH6sOxGMzhP7YIzMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsEpIoAewihu3VphZ/IRCA5qXpCJFGOULDfM6ahZ3ZQ3TfIlh3pU13BjC1EnDfG04BqCGPjWLr8k3H6HrQbN8tAqM8g10wGwASQcVb5SPUJFRvs4xo7gkyQk3X8NEiLzGawQbruE1fJLlxjGE6oTxGtY77sIabjxPqwbOxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCoh52tHJbVmEQMu3Fonw8zyxTJboFCRZgO4sEZRseEMR83ikqTjhnnTf4um+3djBp10YQg31gB+pfLN4v9xYYSu683yzXfsNconpu43G0DSHiUZ5aNVYDaA+SHIY/j8Iqn+HqN8pArNBpBUoGijfEPtM8onuvCDSNhh9gSjRWq28QxpMltjc0q62QBbws3ykhRnvkR1cCYGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsErI+drRyfO1o8qct6M9O6/hDCcUapQvNsy7sUbxccMZjpvFXVnDNF9imAdgv+/N4q48pBkucrK+WX6PGpstIGmPkozyeYozGyDeLC5JCjaLu/HYbipY3oDmXRFlFi9QtPEIxmscCDfL7zWLS5J+dGGNauBMDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArBIS6AGsEmy+hDfErDd6DYfwuvAjP6EwsxlKDGcoMYsDQK1wyCzuyl2h4d1xUd06RvmDamA2gKR9SjTK5ynOKH8yxiguSfIa/hxMH5eD5TUbwIU1QlVslA8zzEuSY/hzKFC08QwHFW+2QI7hABsN85K014U1qoEzMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsEpIoAfAuSlRsFHea5h3g7ck8DOoJNADAPjVa2sWj/7UhRkCfF9YqAjjNfaroVE+RylG+V2xjYzykhSmE0b5AkUb5YPlNcq7IcRwBtPnR5Jk+vTEjdsx4D8Li54fcSYGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsEpIoAewigu3ljck2HwRywWHeI3ypW78qzVdI9B5V9SpJWuYqBU3JFAz4WbxGDdmqG8W3xOcZJTPVguzASRtPdjKKJ8Uv8co/x/9l1FeksJUbJTfoRSjfJzyjPKSVKC6RvlihRnlTxjmJelEuNnv9k1vA0nKU5zZAgcMBzhumD+POBMDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrhAR6gPPqAjha7wVwEMEhJUb5k27cBOGGedMZasMxHHdjCNM16rgwA2Cpo2bxk27MEGsW36VmRvkcpZgNIOnklhij/J4uSUb5/Uo0yrshR6lG+STtMZ7Bq2DjNUxEq8B4jaiDpUb5yKQi4xmMHTfMu/I00zHMe6q1FWdiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKuEBHqAcxLoaV3Yf0lwsPkiARYsr1E+JMQsr3CzuCtr1A1wXjI/huMRLgxhuoZpvo5hHgigS8ziKW7MkGQWP6B4o/w+b0OzASRpm1l8a+tWZruPb2E2gKRQFRvls5VmlC80vi82t1+JRvkCRZsPYfZjULwOGI8Qpzyj/M4UwwE6GuYlKc/jwiJV40wMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsEhLoAc6rYMO8C7eW13ARr/FBmAtWiVE+NPyE2QDhZnFJUl3L826skedxYYhIw7zp/1S/rrswXGAOmsUPuTHDMTcW+XU7oVDjNUwf2w8rzngGU8HyGuVNj6E2PD8KMbwNJClaBWYLtD1pOEEdw7ykLeZLVAdnYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYJWQ87WjOudrR5UxPdpg8xG8bixiueBgr9kCdV0YwnSNuADn3VjjgAszHI82XCDCMF8r7lmAmtloFl/nwgg995jlo1Vglg82y0vSoaZm+Wbxu4zyaco2G0DSCYUa5XepmVHe9OcoScEye2wvNrwN4nXQKC9J+sEsnpKUYzxCx7CvjfJ7kpOM8tvzMozykqQS8yWqgzMxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFVCrNqR6SKBzksqVqhR3qtg8yEMhchrlA9TsdkA4WZxSVJdy/NurBHnwgx7Iw0XiDDMn7e7MMB9Xczi3Ze4MEOSWXyXmhnlDx6LNxtAkg6YxfO8cWb5YLO8ZP7YXiiz++JQnTDKS+bHcFANjPKm/xYlSbFm8agfSo1HaNZyl1G+geH/ENuPGsVPKXFhjWrgTAwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKwScr52VMeNRcIM88EB3r8LSgwPwmt8I5gLltdsgRDHfIhwj1m+ruH+4wzzbqxhegyuiDDMu3LPAgTGDrP4STdmCDeLJ+kno3xcVJ7ZAJKONk0wyjcM3meUj1aBUV6SihVqlI9TnmH+sFFekooUaZQ3fW4QqUKjvCTj/yeVaD5CREuz4yhQtNkAP5rFJUnrXVijGjgTAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq4QEeoBzYjptuCtTGPEqONAj2C+kxHyN8DqGedP9G+Zrywym/0+WRBouYPhzBALpY7P4ShdG6LrZLN9Q+4zy6dpkNoCkgo7RRvkO+sYw/7VRXpLyFGeU9xreGTfQAaO8JB02PIYIFRrl++h9o7wk6UvDfBvzERp0OWiUD5bXbICNZnFJ0jYX1qgGzsQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq1BiAAAAAFiFEgMAAADAKpQYAAAAAFahxAAAAACwCiUGAAAAgFUoMQAAAACsQokBAAAAYBVKDAAAAACrUGIAAAAAWIUSAwAAAMAqlBgAAAAAVgkJ9ADnJDjA+68Ft5a3NgwRaCFeFxap48IaBtz4MZquURtmKHFhBsBS3/+nqVF+8vs/Gs/waZ9ORvmxmmOU3zj/cqP8qUXM4otvuMcov75Xe7MBJBUr1Cifva+FUT6uQZ5RXpK8JWZP0vJ/bGiU/yktySgvSWNmzDXKnzD8OUrSdD1ilN84w/D/qeVm8VMmn5c8Z2IAAAAAWIUSAwAAAMAqlBgAAAAAVqHEAAAAALAKJQYAAACAVSgxAAAAAKxCiQEAAABgFUoMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVj+M4TqCHAAAAAIDq4kwMAAAAAKtQYgAAAABYhRIDAAAAwCqUGAAAAABWocQAAAAAsAolBgAAAIBVKDEAAAAArEKJAQAAAGAVSgwAAAAAq/w/sNmFTgfdpv8AAAAASUVORK5CYII=", |
- 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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR introduces PINA-Topo, a non-invasive, optional topological diagnostic toolbox for Fourier Neural Operators (FNOs). It provides a$\beta_0$ , $\beta_1$ ) during validation, detecting structural hallucinations (ghost islands) that standard pixel-wise MSE loss completely misses.
TopologyMonitorcallback that tracks Betti numbers (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:
dict(data)) withinConditionAggregatorMixinby engineering a custompina_collateprocessing strategy. This wraps raw batched data streams directly into key-value maps expected by the compiler.AttributeErrorregarding raw tensor variable extraction by dynamically synchronizing the dictionary lookup keys (x,u) directly with theSupervisedProblemvariable definitions inside the data collator pipeline.(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 forTopologyMonitor.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
Testing
tests/test_gudhi_backend.pypasses cleanly.test_monitor.pyexecutes successfully on the Darcy dataset across the 5-epoch test profile.Related Issue
Closes #826