torchdeltaflow 0.2.3.dev23__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. torchdeltaflow-0.2.5/.github/workflows/publish.yml +175 -0
  2. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/PKG-INFO +3 -3
  3. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/README.md +2 -2
  4. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/pyproject.toml +5 -4
  5. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/torchdeltaflow.egg-info/PKG-INFO +3 -3
  6. torchdeltaflow-0.2.5/torchdeltaflow.egg-info/scm_version.json +8 -0
  7. torchdeltaflow-0.2.3.dev23/.github/workflows/publish.yml +0 -78
  8. torchdeltaflow-0.2.3.dev23/torchdeltaflow.egg-info/scm_version.json +0 -8
  9. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/.github/workflows/ci.yml +0 -0
  10. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/.github/workflows/docs.yml +0 -0
  11. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/.gitignore +0 -0
  12. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/CHANGELOG.md +0 -0
  13. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/CITATION.cff +0 -0
  14. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/CODE_OF_CONDUCT.md +0 -0
  15. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/CONTRIBUTING.md +0 -0
  16. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/LICENSE +0 -0
  17. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/MANIFEST.in +0 -0
  18. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/benchmarks/README.md +0 -0
  19. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/__init__.py +0 -0
  20. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/__init__.py +0 -0
  21. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base.py +0 -0
  22. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_coupling.py +0 -0
  23. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_equilibrium_field.py +0 -0
  24. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_equilibrium_interpolant.py +0 -0
  25. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_interpolant.py +0 -0
  26. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_loss.py +0 -0
  27. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_solver.py +0 -0
  28. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/core/base_velocity_field.py +0 -0
  29. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/datasets/__init__.py +0 -0
  30. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/datasets/radiograph.py +0 -0
  31. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/__init__.py +0 -0
  32. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/base.py +0 -0
  33. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/equilibrium.py +0 -0
  34. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/linear.py +0 -0
  35. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/ot.py +0 -0
  36. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/schrodinger_bridge.py +0 -0
  37. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/interpolants/variance_preserving.py +0 -0
  38. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/inverse/__init__.py +0 -0
  39. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/inverse/likelihood.py +0 -0
  40. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/inverse/operators.py +0 -0
  41. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/inverse/tweedie.py +0 -0
  42. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/losses/__init__.py +0 -0
  43. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/losses/conditional_flow_matching.py +0 -0
  44. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/losses/delta_alignment.py +0 -0
  45. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/losses/equilibrium_matching.py +0 -0
  46. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/losses/flow_matching.py +0 -0
  47. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/models/__init__.py +0 -0
  48. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/models/backbone.py +0 -0
  49. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/models/dit.py +0 -0
  50. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/models/ema.py +0 -0
  51. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/models/projector.py +0 -0
  52. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/samplers/__init__.py +0 -0
  53. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/samplers/euler.py +0 -0
  54. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/solvers/__init__.py +0 -0
  55. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/solvers/euler.py +0 -0
  56. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/solvers/gradient_descent.py +0 -0
  57. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/solvers/heun.py +0 -0
  58. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/solvers/posterior_solver.py +0 -0
  59. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/trainer/__init__.py +0 -0
  60. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/trainer/coupling.py +0 -0
  61. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/trainer/data.py +0 -0
  62. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/trainer/loop.py +0 -0
  63. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/utils/__init__.py +0 -0
  64. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/utils/numerical.py +0 -0
  65. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/deltaflow/utils/ot.py +0 -0
  66. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/core.md +0 -0
  67. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/datasets.md +0 -0
  68. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/index.md +0 -0
  69. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/interpolants.md +0 -0
  70. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/inverse.md +0 -0
  71. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/losses.md +0 -0
  72. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/models.md +0 -0
  73. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/samplers.md +0 -0
  74. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/solvers.md +0 -0
  75. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/trainer.md +0 -0
  76. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/api/utils.md +0 -0
  77. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/algorithm-comparison/comparison.gif +0 -0
  78. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/algorithm-comparison/comparison.png +0 -0
  79. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/algorithm-comparison/trajectories_comparison.png +0 -0
  80. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/css/extra.css +0 -0
  81. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/equilibrium-matching/energy_landscape.png +0 -0
  82. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/equilibrium-matching/eqm_sampling.gif +0 -0
  83. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/equilibrium-matching/gd_snapshots.png +0 -0
  84. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/equilibrium-matching/gd_trajectories.png +0 -0
  85. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/favicon.ico +0 -0
  86. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/favicon.png +0 -0
  87. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/guidance-alignment/features.png +0 -0
  88. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/inverse-posterior/inverse_posterior.gif +0 -0
  89. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/inverse-posterior/inverse_posterior.png +0 -0
  90. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/js/mathjax.js +0 -0
  91. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/landmark-detection/landmark_detection.png +0 -0
  92. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/logo.svg +0 -0
  93. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/minibatch-ot/minibatch_ot.gif +0 -0
  94. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/minibatch-ot/minibatch_ot.png +0 -0
  95. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/sampling-flow/flow.gif +0 -0
  96. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/sampling-flow/snapshots.png +0 -0
  97. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/sampling-flow/trajectories.png +0 -0
  98. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/sampling-flow/velocity_field.png +0 -0
  99. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/schrodinger-bridge/bridge_paths.gif +0 -0
  100. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/schrodinger-bridge/bridge_paths.png +0 -0
  101. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/schrodinger-bridge/sb_flow.gif +0 -0
  102. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/schrodinger-bridge/sb_snapshots.png +0 -0
  103. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/assets/schrodinger-bridge/sb_trajectories.png +0 -0
  104. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/concepts/architecture.md +0 -0
  105. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/contributing.md +0 -0
  106. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/examples.md +0 -0
  107. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/getting-started/installation.md +0 -0
  108. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/getting-started/quickstart.md +0 -0
  109. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/guides/delta-alignment.md +0 -0
  110. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/guides/flow-matching.md +0 -0
  111. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/guides/inverse-problems.md +0 -0
  112. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/guides/training.md +0 -0
  113. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/docs/index.md +0 -0
  114. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/00-foundations/01-linear-interpolant/main.py +0 -0
  115. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/10-sampling/01-euler-flow/main.py +0 -0
  116. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/10-sampling/02-equilibrium-matching/main.py +0 -0
  117. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/20-training/01-flow-matching/main.py +0 -0
  118. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/20-training/02-delta-alignment/main.py +0 -0
  119. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/20-training/03-conditional-dit/main.py +0 -0
  120. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/30-inverse/01-posterior/main.py +0 -0
  121. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/01-landmark-viz/main.py +0 -0
  122. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/02-sampling-flow-viz/main.py +0 -0
  123. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/03-minibatch-ot-viz/main.py +0 -0
  124. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/04-inverse-posterior-viz/main.py +0 -0
  125. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/05-schrodinger-bridge-viz/main.py +0 -0
  126. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/06-algorithm-comparison/main.py +0 -0
  127. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/07-landmark-detection/main.py +0 -0
  128. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/08-guidance-alignment-pretraining/main.py +0 -0
  129. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/09-equilibrium-matching-viz/main.py +0 -0
  130. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/examples/90-showcase/README.md +0 -0
  131. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/mkdocs.yml +0 -0
  132. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/overrides/main.html +0 -0
  133. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/requirements-docs.txt +0 -0
  134. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/requirements.txt +0 -0
  135. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/setup.cfg +0 -0
  136. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/__init__.py +0 -0
  137. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/conftest.py +0 -0
  138. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_coupling.py +0 -0
  139. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_dit.py +0 -0
  140. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_equilibrium.py +0 -0
  141. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_interpolants.py +0 -0
  142. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_interpolants_new.py +0 -0
  143. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_inverse.py +0 -0
  144. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_losses.py +0 -0
  145. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_models.py +0 -0
  146. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_samplers.py +0 -0
  147. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_solvers.py +0 -0
  148. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/tests/test_trainer.py +0 -0
  149. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/torchdeltaflow.egg-info/SOURCES.txt +0 -0
  150. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/torchdeltaflow.egg-info/dependency_links.txt +0 -0
  151. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/torchdeltaflow.egg-info/requires.txt +0 -0
  152. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/torchdeltaflow.egg-info/scm_file_list.json +0 -0
  153. {torchdeltaflow-0.2.3.dev23 → torchdeltaflow-0.2.5}/torchdeltaflow.egg-info/top_level.txt +0 -0
@@ -0,0 +1,175 @@
1
+ name: publish
2
+
3
+ # Automated tagging and release for torchdeltaflow.
4
+ #
5
+ # On every merge to main this pipeline cuts a new release:
6
+ #
7
+ # 1. update-tag derives the next semantic version from the latest tag and the
8
+ # merge-commit message (include "#major" or "#minor" to bump those
9
+ # components, otherwise the patch component bumps), then creates and pushes
10
+ # the "vX.Y.Z" tag. The tag is the single source of truth for the version,
11
+ # setuptools_scm derives the package version from it (distance 0 -> clean
12
+ # PEP 440 release, e.g. v0.2.3 -> "0.2.3").
13
+ #
14
+ # 2. release checks out that tag, builds and validates the sdist + wheel,
15
+ # runs the test suite, verifies the built version matches the tag, publishes
16
+ # to PyPI, and opens a GitHub Release whose notes come from the matching
17
+ # CHANGELOG.md section (falling back to GitHub's generated notes).
18
+ #
19
+ # Because the tag is pushed with the workflow's GITHUB_TOKEN, it does not
20
+ # recursively trigger this workflow, so there is no separate tag-push trigger.
21
+ # Use "Run workflow" (workflow_dispatch) to cut a release manually.
22
+ #
23
+ # Authentication uses a PyPI API token stored as the repository secret
24
+ # PYPI_API_TOKEN. Create the token at https://pypi.org/manage/account/token/
25
+ # (scope it to the torchdeltaflow project), then add it under
26
+ # Settings > Secrets and variables > Actions as PYPI_API_TOKEN.
27
+
28
+ on:
29
+ push:
30
+ branches: [main]
31
+ workflow_dispatch:
32
+
33
+ permissions:
34
+ contents: write
35
+
36
+ jobs:
37
+ update-tag:
38
+ runs-on: ubuntu-latest
39
+ outputs:
40
+ new_tag: ${{ steps.create_tag.outputs.new_tag }}
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+ with:
44
+ # Need the full history and all tags to find the latest version.
45
+ fetch-depth: 0
46
+ fetch-tags: true
47
+
48
+ - name: Determine version bump from commit message
49
+ id: bump
50
+ run: |
51
+ message=$(git log -1 --pretty=%B)
52
+ if echo "$message" | grep -qiE '#major'; then
53
+ echo "type=major" >> "$GITHUB_OUTPUT"
54
+ elif echo "$message" | grep -qiE '#minor'; then
55
+ echo "type=minor" >> "$GITHUB_OUTPUT"
56
+ else
57
+ echo "type=patch" >> "$GITHUB_OUTPUT"
58
+ fi
59
+
60
+ - name: Compute and push the next tag
61
+ id: create_tag
62
+ run: |
63
+ latest_tag=$(git tag --list 'v*' --sort=-v:refname | head -n 1)
64
+ bump=${{ steps.bump.outputs.type }}
65
+
66
+ if [ -z "$latest_tag" ]; then
67
+ new_tag="v0.1.0"
68
+ else
69
+ version=${latest_tag#v}
70
+ IFS='.' read -r major minor patch <<< "$version"
71
+ case "$bump" in
72
+ major) major=$((major + 1)); minor=0; patch=0 ;;
73
+ minor) minor=$((minor + 1)); patch=0 ;;
74
+ patch) patch=$((patch + 1)) ;;
75
+ esac
76
+ new_tag="v${major}.${minor}.${patch}"
77
+ fi
78
+
79
+ if git rev-parse "$new_tag" >/dev/null 2>&1; then
80
+ echo "Tag $new_tag already exists, skipping tag creation."
81
+ else
82
+ git config user.name "github-actions[bot]"
83
+ git config user.email "github-actions[bot]@users.noreply.github.com"
84
+ git tag -a "$new_tag" -m "Release $new_tag"
85
+ git push origin "$new_tag"
86
+ fi
87
+
88
+ echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
89
+ echo "Release tag: ${new_tag}"
90
+
91
+ release:
92
+ needs: update-tag
93
+ runs-on: ubuntu-latest
94
+ environment:
95
+ name: pypi
96
+ url: https://pypi.org/project/torchdeltaflow/
97
+ steps:
98
+ - uses: actions/checkout@v4
99
+ with:
100
+ # Check out the freshly created tag so setuptools_scm resolves the
101
+ # version to the tag exactly (distance 0, no ".devN").
102
+ ref: ${{ needs.update-tag.outputs.new_tag }}
103
+ fetch-depth: 0
104
+ fetch-tags: true
105
+
106
+ - uses: actions/setup-python@v5
107
+ with:
108
+ python-version: "3.12"
109
+
110
+ - name: Build sdist and wheel
111
+ run: |
112
+ python -m pip install --upgrade pip build
113
+ python -m build
114
+
115
+ - name: Check distributions
116
+ run: |
117
+ python -m pip install --upgrade twine
118
+ python -m twine check dist/*
119
+
120
+ - name: Verify built version matches the tag
121
+ run: |
122
+ tag="${{ needs.update-tag.outputs.new_tag }}"
123
+ expected="${tag#v}"
124
+ built=$(ls dist/*.whl | sed -E 's#.*/torchdeltaflow-([^-]+)-.*#\1#')
125
+ echo "Tag version: ${expected}"
126
+ echo "Built version: ${built}"
127
+ if [ "$built" != "$expected" ]; then
128
+ echo "::error::Built version ${built} does not match tag ${expected}."
129
+ exit 1
130
+ fi
131
+
132
+ - name: Run tests
133
+ run: |
134
+ pip install -e ".[dev]"
135
+ pytest --cov=deltaflow
136
+
137
+ - name: Publish to PyPI
138
+ uses: pypa/gh-action-pypi-publish@release/v1
139
+ with:
140
+ password: ${{ secrets.PYPI_API_TOKEN }}
141
+ # A manual re-run against an already-published version should be a
142
+ # no-op rather than a hard failure.
143
+ skip-existing: true
144
+
145
+ - name: Extract release notes from CHANGELOG.md
146
+ env:
147
+ RELEASE_TAG: ${{ needs.update-tag.outputs.new_tag }}
148
+ run: |
149
+ awk -v ver="${RELEASE_TAG#v}" '
150
+ $0 ~ ("^## \\[" ver "\\]") {found=1; next}
151
+ /^## \[/ {found=0}
152
+ found
153
+ ' CHANGELOG.md > release_body.md
154
+ echo "Release notes for ${RELEASE_TAG}:"
155
+ cat release_body.md
156
+
157
+ - name: Create GitHub Release
158
+ uses: actions/github-script@v7
159
+ env:
160
+ RELEASE_TAG: ${{ needs.update-tag.outputs.new_tag }}
161
+ with:
162
+ script: |
163
+ const fs = require('fs');
164
+ let body = '';
165
+ try { body = fs.readFileSync('release_body.md', 'utf8').trim(); } catch {}
166
+ await github.rest.repos.createRelease({
167
+ owner: context.repo.owner,
168
+ repo: context.repo.repo,
169
+ tag_name: process.env.RELEASE_TAG,
170
+ name: process.env.RELEASE_TAG,
171
+ body: body,
172
+ draft: false,
173
+ prerelease: false,
174
+ generate_release_notes: true,
175
+ });
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: torchdeltaflow
3
- Version: 0.2.3.dev23
3
+ Version: 0.2.5
4
4
  Summary: Flow matching, mini-batch optimal transport coupling, and posterior sampling for inverse problems in PyTorch
5
5
  Author-email: Phrugsa Limbunlom <phrugsa.lim@gmail.com>
6
6
  Maintainer-email: Phrugsa Limbunlom <phrugsa.lim@gmail.com>
@@ -81,7 +81,7 @@ Dynamic: license-file
81
81
 
82
82
  <p align="center">
83
83
  <a href="https://pypi.org/project/torchdeltaflow/" target="_blank" title="PyPI version">
84
- <img alt="PyPI" src="https://img.shields.io/pypi/v/torchdeltaflow?style=flat-square&color=7a5cc0">
84
+ <img alt="PyPI" src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftorchdeltaflow%2Fjson&query=%24.info.version&prefix=v&label=pypi&style=flat-square&color=7a5cc0&cacheSeconds=300">
85
85
  </a>
86
86
  <a href="https://github.com/phrugsa-limbunlom/deltaflow/blob/main/LICENSE" target="_blank" title="License">
87
87
  <img alt="License" src="https://img.shields.io/github/license/phrugsa-limbunlom/deltaflow?style=flat-square&color=3f9e73">
@@ -93,7 +93,7 @@ Dynamic: license-file
93
93
  <img alt="GitHub Stars" src="https://img.shields.io/github/stars/phrugsa-limbunlom/deltaflow?style=social">
94
94
  </a>
95
95
  <a href="https://deepwiki.com/phrugsa-limbunlom/deltaflow" target="_blank" title="Ask DeepWiki">
96
- <img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg">
96
+ <img alt="Ask DeepWiki" src="https://img.shields.io/badge/Ask-DeepWiki-155e63?style=flat-square">
97
97
  </a>
98
98
  <a href="https://github.com/phrugsa-limbunlom/deltaflow/actions/workflows/ci.yml" target="_blank" title="Build Status">
99
99
  <img alt="Build Status" src="https://img.shields.io/github/actions/workflow/status/phrugsa-limbunlom/deltaflow/ci.yml?branch=main&style=flat-square&label=build&color=3f9e73">
@@ -4,7 +4,7 @@
4
4
 
5
5
  <p align="center">
6
6
  <a href="https://pypi.org/project/torchdeltaflow/" target="_blank" title="PyPI version">
7
- <img alt="PyPI" src="https://img.shields.io/pypi/v/torchdeltaflow?style=flat-square&color=7a5cc0">
7
+ <img alt="PyPI" src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftorchdeltaflow%2Fjson&query=%24.info.version&prefix=v&label=pypi&style=flat-square&color=7a5cc0&cacheSeconds=300">
8
8
  </a>
9
9
  <a href="https://github.com/phrugsa-limbunlom/deltaflow/blob/main/LICENSE" target="_blank" title="License">
10
10
  <img alt="License" src="https://img.shields.io/github/license/phrugsa-limbunlom/deltaflow?style=flat-square&color=3f9e73">
@@ -16,7 +16,7 @@
16
16
  <img alt="GitHub Stars" src="https://img.shields.io/github/stars/phrugsa-limbunlom/deltaflow?style=social">
17
17
  </a>
18
18
  <a href="https://deepwiki.com/phrugsa-limbunlom/deltaflow" target="_blank" title="Ask DeepWiki">
19
- <img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg">
19
+ <img alt="Ask DeepWiki" src="https://img.shields.io/badge/Ask-DeepWiki-155e63?style=flat-square">
20
20
  </a>
21
21
  <a href="https://github.com/phrugsa-limbunlom/deltaflow/actions/workflows/ci.yml" target="_blank" title="Build Status">
22
22
  <img alt="Build Status" src="https://img.shields.io/github/actions/workflow/status/phrugsa-limbunlom/deltaflow/ci.yml?branch=main&style=flat-square&label=build&color=3f9e73">
@@ -103,10 +103,11 @@ include = ["deltaflow*"]
103
103
  # Auto-derive the version from the nearest git tag (e.g. v0.1.0 -> 0.1.0).
104
104
  # Falls back to "0.0.0.dev0" only when the tree has no tags at all.
105
105
  fallback_version = "0.0.0.dev0"
106
- # Drop the "+g<hash>" local segment. PyPI rejects local versions, so the
107
- # continuous-deployment publish on every merge (which builds an untagged
108
- # commit) needs a clean PEP 440 dev version like "0.2.3.dev4" instead of
109
- # "0.2.3.dev4+g1a2b3c4". Tagged releases are unaffected (distance 0, no .devN).
106
+ # Drop the "+g<hash>" local segment. PyPI rejects local versions, so any
107
+ # untagged build (e.g. a local editable install between releases) still yields
108
+ # a clean PEP 440 dev version like "0.2.3.dev4" instead of "0.2.3.dev4+g1a2b3c4".
109
+ # Released builds are unaffected (the publish workflow checks out the fresh tag,
110
+ # so distance is 0 and the version is exactly the tag, e.g. "0.2.3").
110
111
  local_scheme = "no-local-version"
111
112
 
112
113
  [tool.pytest.ini_options]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: torchdeltaflow
3
- Version: 0.2.3.dev23
3
+ Version: 0.2.5
4
4
  Summary: Flow matching, mini-batch optimal transport coupling, and posterior sampling for inverse problems in PyTorch
5
5
  Author-email: Phrugsa Limbunlom <phrugsa.lim@gmail.com>
6
6
  Maintainer-email: Phrugsa Limbunlom <phrugsa.lim@gmail.com>
@@ -81,7 +81,7 @@ Dynamic: license-file
81
81
 
82
82
  <p align="center">
83
83
  <a href="https://pypi.org/project/torchdeltaflow/" target="_blank" title="PyPI version">
84
- <img alt="PyPI" src="https://img.shields.io/pypi/v/torchdeltaflow?style=flat-square&color=7a5cc0">
84
+ <img alt="PyPI" src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftorchdeltaflow%2Fjson&query=%24.info.version&prefix=v&label=pypi&style=flat-square&color=7a5cc0&cacheSeconds=300">
85
85
  </a>
86
86
  <a href="https://github.com/phrugsa-limbunlom/deltaflow/blob/main/LICENSE" target="_blank" title="License">
87
87
  <img alt="License" src="https://img.shields.io/github/license/phrugsa-limbunlom/deltaflow?style=flat-square&color=3f9e73">
@@ -93,7 +93,7 @@ Dynamic: license-file
93
93
  <img alt="GitHub Stars" src="https://img.shields.io/github/stars/phrugsa-limbunlom/deltaflow?style=social">
94
94
  </a>
95
95
  <a href="https://deepwiki.com/phrugsa-limbunlom/deltaflow" target="_blank" title="Ask DeepWiki">
96
- <img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg">
96
+ <img alt="Ask DeepWiki" src="https://img.shields.io/badge/Ask-DeepWiki-155e63?style=flat-square">
97
97
  </a>
98
98
  <a href="https://github.com/phrugsa-limbunlom/deltaflow/actions/workflows/ci.yml" target="_blank" title="Build Status">
99
99
  <img alt="Build Status" src="https://img.shields.io/github/actions/workflow/status/phrugsa-limbunlom/deltaflow/ci.yml?branch=main&style=flat-square&label=build&color=3f9e73">
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.2.5",
3
+ "distance": 0,
4
+ "node": "gf7dc8b792306282cbae861b76c144ae5e8de0dd8",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-10"
8
+ }
@@ -1,78 +0,0 @@
1
- name: publish
2
-
3
- # Publishes torchdeltaflow to PyPI in two cases:
4
- #
5
- # 1. A version tag (e.g. v0.2.2) is pushed -> a stable release. The version is
6
- # derived from the tag by setuptools_scm, so the tag is the single source
7
- # of truth. To cut a release, run:
8
- #
9
- # git tag v0.2.2
10
- # git push origin v0.2.2
11
- #
12
- # 2. A pull request is merged into main -> a dev pre-release. setuptools_scm
13
- # derives a clean PEP 440 version from the commit distance to the last tag
14
- # (e.g. "0.2.3.dev4"), which is unique per merge. "skip-existing" below
15
- # guards against the rare case where the same version was already uploaded.
16
- #
17
- # Authentication uses a PyPI API token stored as the repository secret
18
- # PYPI_API_TOKEN. Create the token at https://pypi.org/manage/account/token/
19
- # (scope it to the torchdeltaflow project), then add it under
20
- # Settings > Secrets and variables > Actions as PYPI_API_TOKEN.
21
-
22
- on:
23
- push:
24
- tags:
25
- - "v*"
26
- pull_request:
27
- branches: [main]
28
- types: [closed]
29
-
30
- permissions:
31
- contents: read
32
-
33
- jobs:
34
- build:
35
- # Run for pushed version tags, or when a PR is actually merged (not just
36
- # closed). Plain "closed" without merge must not publish.
37
- if: github.event_name == 'push' || github.event.pull_request.merged == true
38
- runs-on: ubuntu-latest
39
- steps:
40
- - uses: actions/checkout@v4
41
- with:
42
- # setuptools_scm needs the full history and tags to derive the version.
43
- fetch-depth: 0
44
- fetch-tags: true
45
- - uses: actions/setup-python@v5
46
- with:
47
- python-version: "3.12"
48
- - name: Build sdist and wheel
49
- run: |
50
- python -m pip install --upgrade pip build
51
- python -m build
52
- - name: Check distributions
53
- run: |
54
- python -m pip install --upgrade twine
55
- python -m twine check dist/*
56
- - uses: actions/upload-artifact@v4
57
- with:
58
- name: dist
59
- path: dist/
60
-
61
- publish:
62
- needs: build
63
- runs-on: ubuntu-latest
64
- environment:
65
- name: pypi
66
- url: https://pypi.org/project/torchdeltaflow/
67
- steps:
68
- - uses: actions/download-artifact@v4
69
- with:
70
- name: dist
71
- path: dist/
72
- - name: Publish to PyPI
73
- uses: pypa/gh-action-pypi-publish@release/v1
74
- with:
75
- password: ${{ secrets.PYPI_API_TOKEN }}
76
- # Merge builds may reproduce an existing dev version if no new commits
77
- # changed the distance to the last tag. Skip rather than fail.
78
- skip-existing: true
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.2.2",
3
- "distance": 23,
4
- "node": "g4c5cb0771ac699dc6e2ce98f687c796d7fab95bb",
5
- "dirty": false,
6
- "branch": "main",
7
- "node_date": "2026-10-10"
8
- }