warpax 1.4.0__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 (233) hide show
  1. warpax-1.4.0/.gitignore +69 -0
  2. warpax-1.4.0/CHANGELOG.md +112 -0
  3. warpax-1.4.0/LICENSE +21 -0
  4. warpax-1.4.0/PKG-INFO +414 -0
  5. warpax-1.4.0/README.md +350 -0
  6. warpax-1.4.0/examples/01_minkowski_sanity.py +44 -0
  7. warpax-1.4.0/examples/02_schwarzschild_verification.py +51 -0
  8. warpax-1.4.0/examples/03_alcubierre_analysis.py +67 -0
  9. warpax-1.4.0/examples/04_warp_drive_comparison.py +113 -0
  10. warpax-1.4.0/examples/05_grid_analysis.py +120 -0
  11. warpax-1.4.0/examples/06_geodesic_through_warp_bubble.py +126 -0
  12. warpax-1.4.0/examples/07_custom_warp_metric.py +422 -0
  13. warpax-1.4.0/examples/08_metric_design.py +179 -0
  14. warpax-1.4.0/examples/09_admissibility_diagnostics.py +97 -0
  15. warpax-1.4.0/examples/10_phase_diagram.py +105 -0
  16. warpax-1.4.0/examples/README.md +79 -0
  17. warpax-1.4.0/pyproject.toml +172 -0
  18. warpax-1.4.0/src/warpax/__init__.py +70 -0
  19. warpax-1.4.0/src/warpax/adm/__init__.py +5 -0
  20. warpax-1.4.0/src/warpax/adm/mass.py +376 -0
  21. warpax-1.4.0/src/warpax/analysis/__init__.py +45 -0
  22. warpax-1.4.0/src/warpax/analysis/comparison.py +255 -0
  23. warpax-1.4.0/src/warpax/analysis/construction_adapter.py +327 -0
  24. warpax-1.4.0/src/warpax/analysis/convergence.py +274 -0
  25. warpax-1.4.0/src/warpax/analysis/extrema.py +147 -0
  26. warpax-1.4.0/src/warpax/analysis/invariant_verification.py +225 -0
  27. warpax-1.4.0/src/warpax/analysis/kinematic_scalars.py +146 -0
  28. warpax-1.4.0/src/warpax/analysis/shift_kinematics.py +147 -0
  29. warpax-1.4.0/src/warpax/analysis/vorticity_type_analytic.py +107 -0
  30. warpax-1.4.0/src/warpax/averaged/__init__.py +28 -0
  31. warpax-1.4.0/src/warpax/averaged/anec.py +452 -0
  32. warpax-1.4.0/src/warpax/averaged/awec.py +197 -0
  33. warpax-1.4.0/src/warpax/benchmarks/__init__.py +14 -0
  34. warpax-1.4.0/src/warpax/benchmarks/alcubierre.py +204 -0
  35. warpax-1.4.0/src/warpax/benchmarks/minkowski.py +64 -0
  36. warpax-1.4.0/src/warpax/benchmarks/schwarzschild.py +133 -0
  37. warpax-1.4.0/src/warpax/bondi/__init__.py +19 -0
  38. warpax-1.4.0/src/warpax/bondi/extract.py +210 -0
  39. warpax-1.4.0/src/warpax/bondi/peeling.py +227 -0
  40. warpax-1.4.0/src/warpax/certify.py +140 -0
  41. warpax-1.4.0/src/warpax/classify/__init__.py +26 -0
  42. warpax-1.4.0/src/warpax/classify/bobrick_martire.py +231 -0
  43. warpax-1.4.0/src/warpax/constraints/__init__.py +23 -0
  44. warpax-1.4.0/src/warpax/constraints/_radial_solve.py +60 -0
  45. warpax-1.4.0/src/warpax/constraints/constraint_solver.py +153 -0
  46. warpax-1.4.0/src/warpax/constraints/residuals.py +307 -0
  47. warpax-1.4.0/src/warpax/constraints/source_consistency.py +68 -0
  48. warpax-1.4.0/src/warpax/constraints/tshell_solver.py +225 -0
  49. warpax-1.4.0/src/warpax/design/__init__.py +64 -0
  50. warpax-1.4.0/src/warpax/design/constraints.py +141 -0
  51. warpax-1.4.0/src/warpax/design/metrics.py +230 -0
  52. warpax-1.4.0/src/warpax/design/objectives.py +199 -0
  53. warpax-1.4.0/src/warpax/design/optimizer.py +278 -0
  54. warpax-1.4.0/src/warpax/design/shape_functions.py +275 -0
  55. warpax-1.4.0/src/warpax/energy_conditions/__init__.py +170 -0
  56. warpax-1.4.0/src/warpax/energy_conditions/_gen_eig_callback.py +111 -0
  57. warpax-1.4.0/src/warpax/energy_conditions/_intervalad.py +231 -0
  58. warpax-1.4.0/src/warpax/energy_conditions/_intervalcurv.py +257 -0
  59. warpax-1.4.0/src/warpax/energy_conditions/_jet.py +232 -0
  60. warpax-1.4.0/src/warpax/energy_conditions/certificate.py +554 -0
  61. warpax-1.4.0/src/warpax/energy_conditions/classification.py +451 -0
  62. warpax-1.4.0/src/warpax/energy_conditions/classification_mpmath.py +430 -0
  63. warpax-1.4.0/src/warpax/energy_conditions/eigenvalue_checks.py +111 -0
  64. warpax-1.4.0/src/warpax/energy_conditions/enclosure.py +963 -0
  65. warpax-1.4.0/src/warpax/energy_conditions/filtering.py +287 -0
  66. warpax-1.4.0/src/warpax/energy_conditions/frame_free.py +423 -0
  67. warpax-1.4.0/src/warpax/energy_conditions/interval_lmi.py +297 -0
  68. warpax-1.4.0/src/warpax/energy_conditions/observer.py +384 -0
  69. warpax-1.4.0/src/warpax/energy_conditions/optimization.py +1282 -0
  70. warpax-1.4.0/src/warpax/energy_conditions/slemma.py +362 -0
  71. warpax-1.4.0/src/warpax/energy_conditions/sweep.py +340 -0
  72. warpax-1.4.0/src/warpax/energy_conditions/types.py +195 -0
  73. warpax-1.4.0/src/warpax/energy_conditions/verifier.py +756 -0
  74. warpax-1.4.0/src/warpax/energy_conditions/worst_observer_analytic.py +194 -0
  75. warpax-1.4.0/src/warpax/geodesics/__init__.py +90 -0
  76. warpax-1.4.0/src/warpax/geodesics/_result_codes.py +66 -0
  77. warpax-1.4.0/src/warpax/geodesics/deviation.py +278 -0
  78. warpax-1.4.0/src/warpax/geodesics/initial_conditions.py +434 -0
  79. warpax-1.4.0/src/warpax/geodesics/integrator.py +306 -0
  80. warpax-1.4.0/src/warpax/geodesics/observables.py +227 -0
  81. warpax-1.4.0/src/warpax/geodesics/symplectic.py +362 -0
  82. warpax-1.4.0/src/warpax/geometry/__init__.py +79 -0
  83. warpax-1.4.0/src/warpax/geometry/adm_split.py +183 -0
  84. warpax-1.4.0/src/warpax/geometry/geometry.py +212 -0
  85. warpax-1.4.0/src/warpax/geometry/grid.py +202 -0
  86. warpax-1.4.0/src/warpax/geometry/invariants.py +175 -0
  87. warpax-1.4.0/src/warpax/geometry/metric.py +269 -0
  88. warpax-1.4.0/src/warpax/geometry/regularity.py +217 -0
  89. warpax-1.4.0/src/warpax/geometry/transitions.py +104 -0
  90. warpax-1.4.0/src/warpax/geometry/types.py +133 -0
  91. warpax-1.4.0/src/warpax/grids/__init__.py +31 -0
  92. warpax-1.4.0/src/warpax/grids/_axisymmetric.py +131 -0
  93. warpax-1.4.0/src/warpax/grids/_clustered.py +213 -0
  94. warpax-1.4.0/src/warpax/grids/_resolution.py +143 -0
  95. warpax-1.4.0/src/warpax/grids/_volume_weights.py +101 -0
  96. warpax-1.4.0/src/warpax/io/__init__.py +27 -0
  97. warpax-1.4.0/src/warpax/io/_interpolated.py +141 -0
  98. warpax-1.4.0/src/warpax/io/_interpolation.py +114 -0
  99. warpax-1.4.0/src/warpax/io/cactus.py +202 -0
  100. warpax-1.4.0/src/warpax/io/einfields.py +179 -0
  101. warpax-1.4.0/src/warpax/io/warpfactory.py +215 -0
  102. warpax-1.4.0/src/warpax/junction/__init__.py +25 -0
  103. warpax-1.4.0/src/warpax/junction/darmois.py +264 -0
  104. warpax-1.4.0/src/warpax/metrics/__init__.py +66 -0
  105. warpax-1.4.0/src/warpax/metrics/_common.py +33 -0
  106. warpax-1.4.0/src/warpax/metrics/_fuchs_legacy.py +254 -0
  107. warpax-1.4.0/src/warpax/metrics/_interp.py +18 -0
  108. warpax-1.4.0/src/warpax/metrics/_tov_scan.py +66 -0
  109. warpax-1.4.0/src/warpax/metrics/fuchs_construction.py +558 -0
  110. warpax-1.4.0/src/warpax/metrics/garattini.py +222 -0
  111. warpax-1.4.0/src/warpax/metrics/lentz.py +172 -0
  112. warpax-1.4.0/src/warpax/metrics/natario.py +268 -0
  113. warpax-1.4.0/src/warpax/metrics/rodal.py +209 -0
  114. warpax-1.4.0/src/warpax/metrics/sshell.py +218 -0
  115. warpax-1.4.0/src/warpax/metrics/sshell_profiles.py +289 -0
  116. warpax-1.4.0/src/warpax/metrics/tshell.py +194 -0
  117. warpax-1.4.0/src/warpax/metrics/tshell_profiles.py +254 -0
  118. warpax-1.4.0/src/warpax/metrics/van_den_broeck.py +154 -0
  119. warpax-1.4.0/src/warpax/metrics/warpshell.py +377 -0
  120. warpax-1.4.0/src/warpax/numerics/__init__.py +12 -0
  121. warpax-1.4.0/src/warpax/numerics/_constants.py +27 -0
  122. warpax-1.4.0/src/warpax/numerics/_grid.py +39 -0
  123. warpax-1.4.0/src/warpax/optimization/__init__.py +65 -0
  124. warpax-1.4.0/src/warpax/optimization/basis.py +152 -0
  125. warpax-1.4.0/src/warpax/optimization/ec_constraints.py +234 -0
  126. warpax-1.4.0/src/warpax/optimization/loss.py +165 -0
  127. warpax-1.4.0/src/warpax/optimization/optimizer.py +164 -0
  128. warpax-1.4.0/src/warpax/optimization/sweep.py +430 -0
  129. warpax-1.4.0/src/warpax/quantum/__init__.py +17 -0
  130. warpax-1.4.0/src/warpax/quantum/ford_roman.py +162 -0
  131. warpax-1.4.0/src/warpax/tov/__init__.py +5 -0
  132. warpax-1.4.0/src/warpax/tov/residuals.py +133 -0
  133. warpax-1.4.0/src/warpax/transport/__init__.py +13 -0
  134. warpax-1.4.0/src/warpax/transport/diagnostics.py +249 -0
  135. warpax-1.4.0/src/warpax/visualization/__init__.py +70 -0
  136. warpax-1.4.0/src/warpax/visualization/_style.py +135 -0
  137. warpax-1.4.0/src/warpax/visualization/alignment_plots.py +108 -0
  138. warpax-1.4.0/src/warpax/visualization/common/__init__.py +75 -0
  139. warpax-1.4.0/src/warpax/visualization/common/_color.py +152 -0
  140. warpax-1.4.0/src/warpax/visualization/common/_conversion.py +351 -0
  141. warpax-1.4.0/src/warpax/visualization/common/_frame_data.py +138 -0
  142. warpax-1.4.0/src/warpax/visualization/common/_physics.py +483 -0
  143. warpax-1.4.0/src/warpax/visualization/common/_scenes.py +371 -0
  144. warpax-1.4.0/src/warpax/visualization/comparison_plots.py +701 -0
  145. warpax-1.4.0/src/warpax/visualization/convergence_plots.py +233 -0
  146. warpax-1.4.0/src/warpax/visualization/direction_fields.py +195 -0
  147. warpax-1.4.0/src/warpax/visualization/geodesic_plots.py +203 -0
  148. warpax-1.4.0/src/warpax/visualization/kinematic_plots.py +290 -0
  149. warpax-1.4.0/src/warpax/visualization/manim/__init__.py +68 -0
  150. warpax-1.4.0/src/warpax/visualization/manim/_boost_arrows.py +608 -0
  151. warpax-1.4.0/src/warpax/visualization/manim/_boost_rapidity_sweep.py +394 -0
  152. warpax-1.4.0/src/warpax/visualization/manim/_eulerian_kinematics.py +406 -0
  153. warpax-1.4.0/src/warpax/visualization/manim/_gif_utils.py +149 -0
  154. warpax-1.4.0/src/warpax/visualization/manim/_heatmap.py +212 -0
  155. warpax-1.4.0/src/warpax/visualization/manim/_image_utils.py +449 -0
  156. warpax-1.4.0/src/warpax/visualization/manim/_kretschmann.py +256 -0
  157. warpax-1.4.0/src/warpax/visualization/manim/_nec_margin.py +371 -0
  158. warpax-1.4.0/src/warpax/visualization/manim/_scene_utils.py +488 -0
  159. warpax-1.4.0/src/warpax/visualization/manim/_split_screen.py +562 -0
  160. warpax-1.4.0/src/warpax/visualization/manim/_surface.py +173 -0
  161. warpax-1.4.0/src/warpax/visualization/manim/_velocity_sweep.py +348 -0
  162. warpax-1.4.0/src/warpax/visualization/manim/_wall_velocity_sweep.py +472 -0
  163. warpax-1.4.0/src/warpax/visualization/phase_diagram.py +357 -0
  164. warpax-1.4.0/src/warpax/visualization/shift_vorticity_plots.py +107 -0
  165. warpax-1.4.0/tests/__init__.py +0 -0
  166. warpax-1.4.0/tests/_gpu_xfail_registry.py +85 -0
  167. warpax-1.4.0/tests/conftest.py +177 -0
  168. warpax-1.4.0/tests/fixtures/alcubierre_optimal_parameters.npy +0 -0
  169. warpax-1.4.0/tests/fixtures/cactus/README.md +47 -0
  170. warpax-1.4.0/tests/fixtures/cactus/generate_minkowski_slice.py +76 -0
  171. warpax-1.4.0/tests/fixtures/cactus/minkowski_slice.h5 +0 -0
  172. warpax-1.4.0/tests/fixtures/einfields/.gitkeep +0 -0
  173. warpax-1.4.0/tests/fixtures/einfields/README.md +33 -0
  174. warpax-1.4.0/tests/fixtures/einfields/generate_minkowski_ckpt.py +58 -0
  175. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/_CHECKPOINT_METADATA +1 -0
  176. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/_METADATA +1 -0
  177. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/d/ab3629d54e5a5471243d8667edd3c853 +0 -0
  178. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/manifest.ocdbt +0 -0
  179. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/ocdbt.process_0/d/acb4584addcd9774607322a256862069 +0 -0
  180. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/ocdbt.process_0/d/d7bc34bbf51467563510082f17ba0b91 +0 -0
  181. warpax-1.4.0/tests/fixtures/einfields/minkowski.ckpt/ocdbt.process_0/manifest.ocdbt +0 -0
  182. warpax-1.4.0/tests/fixtures/golden/fibonacci_pool.npy +0 -0
  183. warpax-1.4.0/tests/fixtures/warpfactory/README.md +45 -0
  184. warpax-1.4.0/tests/fixtures/warpfactory/alcubierre.mat +0 -0
  185. warpax-1.4.0/tests/fixtures/warpshell_classify.npz +0 -0
  186. warpax-1.4.0/tests/test_adm.py +323 -0
  187. warpax-1.4.0/tests/test_asv_benchmarks.py +44 -0
  188. warpax-1.4.0/tests/test_averaged_and_quantum.py +381 -0
  189. warpax-1.4.0/tests/test_benchmarks/__init__.py +0 -0
  190. warpax-1.4.0/tests/test_benchmarks/test_alcubierre.py +77 -0
  191. warpax-1.4.0/tests/test_benchmarks/test_minkowski.py +44 -0
  192. warpax-1.4.0/tests/test_benchmarks/test_schwarzschild.py +85 -0
  193. warpax-1.4.0/tests/test_benchmarks/test_sympy_bridge.py +159 -0
  194. warpax-1.4.0/tests/test_bondi.py +123 -0
  195. warpax-1.4.0/tests/test_bug_hunt_regressions.py +426 -0
  196. warpax-1.4.0/tests/test_certificate.py +272 -0
  197. warpax-1.4.0/tests/test_classification.py +1218 -0
  198. warpax-1.4.0/tests/test_construction_adapter.py +107 -0
  199. warpax-1.4.0/tests/test_curvature_identities.py +236 -0
  200. warpax-1.4.0/tests/test_curvature_scaling.py +121 -0
  201. warpax-1.4.0/tests/test_design.py +558 -0
  202. warpax-1.4.0/tests/test_ec_observer_and_solvers.py +1459 -0
  203. warpax-1.4.0/tests/test_ec_verifier.py +565 -0
  204. warpax-1.4.0/tests/test_enclosure.py +478 -0
  205. warpax-1.4.0/tests/test_extrema.py +42 -0
  206. warpax-1.4.0/tests/test_frame_free.py +300 -0
  207. warpax-1.4.0/tests/test_fuchs_legacy_parity.py +76 -0
  208. warpax-1.4.0/tests/test_fuchs_published_profile.py +88 -0
  209. warpax-1.4.0/tests/test_geodesics.py +1100 -0
  210. warpax-1.4.0/tests/test_geometry.py +761 -0
  211. warpax-1.4.0/tests/test_geometry_extras.py +691 -0
  212. warpax-1.4.0/tests/test_grids_clustered.py +84 -0
  213. warpax-1.4.0/tests/test_interval_lmi.py +133 -0
  214. warpax-1.4.0/tests/test_invariant_verification.py +102 -0
  215. warpax-1.4.0/tests/test_io.py +224 -0
  216. warpax-1.4.0/tests/test_junction.py +173 -0
  217. warpax-1.4.0/tests/test_metrics_garattini.py +116 -0
  218. warpax-1.4.0/tests/test_metrics_warp.py +1243 -0
  219. warpax-1.4.0/tests/test_optimization.py +274 -0
  220. warpax-1.4.0/tests/test_peeling.py +145 -0
  221. warpax-1.4.0/tests/test_physics_validation.py +1449 -0
  222. warpax-1.4.0/tests/test_scripts_json_io.py +85 -0
  223. warpax-1.4.0/tests/test_shift_kinematics.py +78 -0
  224. warpax-1.4.0/tests/test_slemma.py +578 -0
  225. warpax-1.4.0/tests/test_ssv_bound.py +90 -0
  226. warpax-1.4.0/tests/test_sweep.py +337 -0
  227. warpax-1.4.0/tests/test_symplectic_geodesic.py +129 -0
  228. warpax-1.4.0/tests/test_tov_constraints.py +182 -0
  229. warpax-1.4.0/tests/test_translation_invariance.py +64 -0
  230. warpax-1.4.0/tests/test_transport.py +141 -0
  231. warpax-1.4.0/tests/test_visualization.py +467 -0
  232. warpax-1.4.0/tests/test_vorticity_type_analytic.py +176 -0
  233. warpax-1.4.0/tests/test_worst_observer_analytic.py +80 -0
@@ -0,0 +1,69 @@
1
+ # Byte-compiled / optimized
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Distribution / packaging
7
+ dist/
8
+ build/
9
+ *.egg-info/
10
+ *.egg
11
+ .eggs/
12
+
13
+ # Testing
14
+ .pytest_cache/
15
+ .coverage
16
+ htmlcov/
17
+
18
+ # Linting
19
+ .ruff_cache/
20
+
21
+ # Manim renders
22
+ media/
23
+ animations/
24
+
25
+ # Example output (generated by examples/*.py)
26
+ examples/output/
27
+
28
+ # IDE
29
+ .vscode/
30
+ .idea/
31
+ *.swp
32
+ *.swo
33
+
34
+ # OS
35
+ .DS_Store
36
+ Thumbs.db
37
+
38
+ # Environments
39
+ .env
40
+ .venv/
41
+ env/
42
+ venv/
43
+
44
+ # MkDocs build output
45
+ site/
46
+
47
+ # asv benchmark harness output
48
+ .asv/
49
+ benchmarks/env/
50
+ benchmarks/.asv/
51
+
52
+ # Generated figure outputs (reproducible via reproduce_all.sh / Manim)
53
+ figures/*.pdf
54
+ figures/*.gif
55
+ figures/*.png
56
+ !figures/.gitkeep
57
+ !figures/wall_velocity_sweep.gif
58
+ !figures/eulerian_kinematics.gif
59
+ !figures/kretschmann_invariant.gif
60
+ !figures/eulerian_vs_worstcase_nec.gif
61
+ !figures/gaussian_warp_grid_comparison.png
62
+
63
+ # Reproduction cache - large binary artifacts. The MANIFEST + json/tex
64
+ # summaries stay tracked; npz and pdf are regenerated via reproduce_all.sh.
65
+ results/**/*.npz
66
+ results/**/*.pdf
67
+
68
+ # TeX and renderer logs
69
+ *.log
@@ -0,0 +1,112 @@
1
+ # Changelog
2
+
3
+ All notable changes to `warpax`, following
4
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Pre-1.0 history is
5
+ in `docs/explanation/release_notes.md`.
6
+
7
+ ## [1.4.0] - 2026-08-31
8
+
9
+ Type-free certification. The energy-condition verdict comes from a $4\times4$
10
+ linear matrix inequality rather than from an eigendecomposition, so it holds at
11
+ every Hawking-Ellis type, and each verdict carries an exact rational
12
+ certificate.
13
+
14
+ ### Added
15
+
16
+ - `energy_conditions.slemma.certify_point_lmi`: NEC/WEC/SEC/DEC over every
17
+ timelike and null observer from $\hat T + \sigma\eta \succeq 0$, at Types I
18
+ through IV alike, with no rapidity cap and no classification tolerance.
19
+ `witness_observer` returns the violating boost.
20
+ - `energy_conditions.certificate`: exact rational certificates checked over
21
+ `Fraction`. A multiplier $\sigma$ when the condition holds, a boost $w$ with
22
+ $|w| \le 1$ and $q(w) < 0$ when it fails.
23
+ - `energy_conditions.enclosure`: verified continuum enclosures of the worst-case
24
+ violation by interval branch-and-bound (Moore-Skelboe, `mpmath.iv`, outward
25
+ rounding), bracketing the extremum over the domain rather than over a grid.
26
+ - `energy_conditions.interval_lmi`: the same certificate in interval arithmetic,
27
+ from the metric rather than from a sampled stress-energy tensor.
28
+ - `grids.proper_volume_weights`: the slice Jacobian
29
+ $\mathrm{d}V = \sqrt{\det\gamma}\,\mathrm{d}^3x$. Every volume-weighted
30
+ fraction on a conformally scaled slice moves.
31
+ - `analysis.extrema.refine_extremum`: polishes a grid extremum off the grid.
32
+
33
+ ### Fixed
34
+
35
+ - `averaged.anec`: the on-cone witness is measured on the trajectory tangent
36
+ $\mathrm{d}x/\mathrm{d}\lambda$, not on the projected vector, which is null by
37
+ construction. `_project_to_null` uses the Citardauq form.
38
+ - `averaged.awec`: a spacelike curve is reported rather than normalised as
39
+ timelike, and the line integral carries $\mathrm{d}\tau/\mathrm{d}\lambda$.
40
+ - `analysis.convergence`: grid spacing is $1/(N-1)$ on endpoint-inclusive grids.
41
+ Non-geometric ladders are refused rather than fitted.
42
+ - `energy_conditions.enclosure.tail_bound`: the minimum of $|x|$ over the slab,
43
+ not of $|$endpoint$|$, which excluded a slab straddling the origin.
44
+ - `junction.darmois`: one-sided limits at $\Sigma$, so a smooth metric gives a
45
+ vanishing jump. A $\Sigma$ of changing causal character gives no verdict.
46
+ - Every absolute floor is relative to the tensor or metric scale, so a verdict
47
+ survives a coordinate rescaling.
48
+ - Both classifiers report no verdict on non-finite input, and agree with each
49
+ other.
50
+ - `frame_free`: `lmi_substituted` marks margins taken from the LMI rather than
51
+ from the eigenvalue inequalities. Only their sign is comparable.
52
+ - ANEC affine windows come from the ray's horizon crossing, not from a
53
+ stationarity search that walked into integrator drift.
54
+
55
+ ### Performance
56
+
57
+ - Interval branch-and-bound 3.3x faster, with bit-identical enclosures.
58
+ - Metric parameters are array leaves, so a velocity sweep no longer recompiles
59
+ the curvature chain per value.
60
+ - `import warpax` drops from 2.5 s to 0.75 s; `design` and sympy load on first
61
+ use.
62
+
63
+ ### Removed
64
+
65
+ - `exceptions`, `grids._refined`, `benchmarks.registry`,
66
+ `visualization.common._themes` and `_jit_cache`, none of which had a caller.
67
+
68
+ ## [1.3.0] - 2026-06-22
69
+
70
+ Manim scenes renamed to physically accurate names, colormaps matched to each
71
+ field's sign, and a headless 3D render path through OpenGL/EGL.
72
+
73
+ ## [1.2.0] - 2026-06-21
74
+
75
+ New `warpax.bondi`: Bondi four-momentum radiated flux, Newman-Penrose Weyl
76
+ scalars, and peeling falloff $\Psi_n \sim r^{-(5-n)}$ at null infinity.
77
+
78
+ ## [1.1.1] - 2026-06-20
79
+
80
+ Reproduction artifacts and docs for the source-shell paper
81
+ (arXiv:2605.25417). No API changes.
82
+
83
+ ## [1.1.0] - 2026-06-10
84
+
85
+ Frame-independent certification.
86
+
87
+ - `warpax.certify(metric)`: one-call all-observer certification from the
88
+ Hawking-Ellis eigenvalue test of $T^a{}_b$, valid at all warp speeds
89
+ including superluminal $v_s \ge 1$.
90
+ - Closed-form Type-I worst observer, cross-checked against the BFGS optimizer.
91
+ - Rigorous geodesic-integrated ANEC through a symplectic null integrator that
92
+ conserves $g_{ab}k^ak^b$ where the adaptive integrator drifts off the cone.
93
+ - Shift vorticity controls the wall type: the Type-IV imaginary pair is linear
94
+ in it, and shear amplifies but does not open it.
95
+ - Wall NEC deficit and curvature invariants as power laws in $v_s$, splitting
96
+ by vorticity ($v_s^2$ vortical, $v_s^4$ irrotational).
97
+ - New `metrics.GarattiniMetric`, and cross-construction verification of the
98
+ Fuchs, WarpShell and Garattini-Zatrimaylov constructions.
99
+
100
+ ## [1.0.0] - 2026-05-26
101
+
102
+ First stable release: Hawking-Ellis classification with exact Type-I margins,
103
+ multistart BFGS observer optimization, source-first S-/T-shell construction from
104
+ the Einstein constraints, a pure-JAX autodiff curvature chain, WarpFactory /
105
+ Cactus / EinsteinFields IO, and a differentiable metric-design API.
106
+
107
+ [1.4.0]: https://github.com/anindex/warpax/releases/tag/v1.4.0
108
+ [1.3.0]: https://github.com/anindex/warpax/releases/tag/v1.3.0
109
+ [1.2.0]: https://github.com/anindex/warpax/releases/tag/v1.2.0
110
+ [1.1.1]: https://github.com/anindex/warpax/releases/tag/v1.1.1
111
+ [1.1.0]: https://github.com/anindex/warpax/releases/tag/v1.1.0
112
+ [1.0.0]: https://github.com/anindex/warpax/releases/tag/v1.0.0
warpax-1.4.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 An T. Le
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
warpax-1.4.0/PKG-INFO ADDED
@@ -0,0 +1,414 @@
1
+ Metadata-Version: 2.5
2
+ Name: warpax
3
+ Version: 1.4.0
4
+ Summary: Observer-robust energy condition verification for warp drive spacetimes
5
+ Project-URL: Homepage, https://github.com/anindex/warpax
6
+ Project-URL: Documentation, https://github.com/anindex/warpax#readme
7
+ Project-URL: Repository, https://github.com/anindex/warpax
8
+ Project-URL: Issues, https://github.com/anindex/warpax/issues
9
+ Project-URL: Author, https://github.com/anindex
10
+ Author-email: "An T. Le" <an@robot-learning.de>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Scientific/Engineering :: Astronomy
21
+ Classifier: Topic :: Scientific/Engineering :: Physics
22
+ Requires-Python: >=3.12
23
+ Requires-Dist: beartype<0.23.0,>=0.22.9
24
+ Requires-Dist: diffrax>=0.7.2
25
+ Requires-Dist: equinox<0.14.0,>=0.13.6
26
+ Requires-Dist: jax<0.11.0,>=0.10.0
27
+ Requires-Dist: jaxtyping>=0.3.10
28
+ Requires-Dist: matplotlib<4.0.0,>=3.10.9
29
+ Requires-Dist: mpmath<1.4,>=1.3.0
30
+ Requires-Dist: numpy<3.0.0,>=2.2.0
31
+ Requires-Dist: optimistix>=0.1.0
32
+ Requires-Dist: sympy>=1.14
33
+ Requires-Dist: tqdm>=4.0
34
+ Provides-Extra: bench
35
+ Requires-Dist: asv<1.0,>=0.6.5; extra == 'bench'
36
+ Provides-Extra: design
37
+ Requires-Dist: interpax<0.4.0,>=0.3.14; extra == 'design'
38
+ Provides-Extra: dev
39
+ Requires-Dist: pytest-xdist>=3.6.0; extra == 'dev'
40
+ Requires-Dist: pytest<10.0.0,>=9.0.0; extra == 'dev'
41
+ Requires-Dist: ruff<1.0.0,>=0.15.16; extra == 'dev'
42
+ Provides-Extra: docs
43
+ Requires-Dist: griffe<3.0,>=2.0.2; extra == 'docs'
44
+ Requires-Dist: mkdocs-material<10.0,>=9.7.6; extra == 'docs'
45
+ Requires-Dist: mkdocstrings-python<3.0,>=2.0.3; extra == 'docs'
46
+ Requires-Dist: mkdocstrings<2.0,>=1.0.4; extra == 'docs'
47
+ Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
48
+ Provides-Extra: einfields
49
+ Requires-Dist: flax<0.13,>=0.12; extra == 'einfields'
50
+ Requires-Dist: orbax-checkpoint<0.13.0,>=0.11.40; extra == 'einfields'
51
+ Provides-Extra: interop
52
+ Requires-Dist: h5py<4.0.0,>=3.16.0; extra == 'interop'
53
+ Requires-Dist: mat73<1.0,>=0.65; extra == 'interop'
54
+ Provides-Extra: manim
55
+ Requires-Dist: imageio-ffmpeg>=0.4.9; extra == 'manim'
56
+ Requires-Dist: imageio>=2.31; extra == 'manim'
57
+ Requires-Dist: manim<0.21.0,>=0.20.1; extra == 'manim'
58
+ Provides-Extra: solver
59
+ Requires-Dist: scipy>=1.17.0; extra == 'solver'
60
+ Provides-Extra: viz
61
+ Requires-Dist: imageio>=2.31; extra == 'viz'
62
+ Requires-Dist: scipy>=1.17.0; extra == 'viz'
63
+ Description-Content-Type: text/markdown
64
+
65
+ # warpax
66
+
67
+ [![arXiv](https://img.shields.io/badge/arXiv-2602.18023-brown)](https://arxiv.org/abs/2602.18023)
68
+ [![DOI](https://zenodo.org/badge/1162355401.svg)](https://doi.org/10.5281/zenodo.18715933)
69
+ [![CI](https://github.com/anindex/warpax/actions/workflows/ci.yml/badge.svg)](https://github.com/anindex/warpax/actions/workflows/ci.yml)
70
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://python.org)
71
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://github.com/anindex/warpax/blob/main/LICENSE)
72
+
73
+ [**Observer-robust energy condition verification for warp drive spacetimes.**](https://arxiv.org/abs/2602.18023)
74
+
75
+ `warpax` decides the energy-condition structure of warp-drive spacetimes for
76
+ *every* observer at once, from the eigenstructure of the mixed stress-energy tensor
77
+ $T^a{}_b$, with exact curvature from JAX forward-mode autodiff. The decision uses
78
+ only the boost-invariant eigenvalues of $T^a{}_b$ and never requires the
79
+ coordinate-stationary observer $\partial_t$ to be timelike, so it stays well-defined
80
+ at all warp speeds, including superluminal $v_s \ge 1$ where $\partial_t$ turns
81
+ spacelike and single-frame tools such as WarpFactory break down. Each Hawking-Ellis
82
+ type is decided the same way: a $4\times4$ linear matrix inequality
83
+ $\hat T + \sigma\eta \succeq 0$ over every timelike and null observer, with no
84
+ rapidity cap and no classification tolerance, and each verdict backed by an exact
85
+ rational certificate.
86
+
87
+ <p align="center">
88
+ <img src="https://raw.githubusercontent.com/anindex/warpax/main/figures/wall_velocity_sweep.gif" width="760" alt="Alcubierre warp bubble: Eulerian energy density embedding and observer-robust NEC-margin slab"/>
89
+ </p>
90
+
91
+ <p align="center"><em>An Alcubierre warp bubble. The wireframe is the Eulerian energy density, negative everywhere across the wall (&rho;<sub>Eul</sub> &le; 0); the slab beneath is the NEC margin minimized over the whole null sphere, which never rises above zero. The sweep sharpens the wall (&sigma;: 1 &rarr; 16), then eases the velocity toward flat space. Both fields span about three decades over the sweep, so height and colour are on a signed log scale: monotone and sign-preserving, but not proportional.</em></p>
92
+
93
+ ## Features
94
+
95
+ - Frame-independent, all-observer energy-condition certification at every warp
96
+ speed (including superluminal $v_s \ge 1$), from the eigenstructure of
97
+ $T^a{}_b$, exact and cap-free for every Hawking-Ellis type.
98
+ - Hawking-Ellis classification (Type I-IV) with explicit Type-IV detection,
99
+ cross-checked by two eigensolver backends against a 50-digit `mpmath`
100
+ reference.
101
+ - Exact decision at Type-III/IV points from the absence of a causal
102
+ eigenvector, with a closed-form Eulerian null witness for the
103
+ momentum-sourced case; a closed-form Type-I worst observer and a multistart
104
+ BFGS optimizer serve only to display violation severity.
105
+ - Momentum-density control of the wall type through the discriminant
106
+ $\Delta=(\rho+S_\parallel)^2-4|j|^2$: a negative discriminant sends a point to
107
+ Type IV, and the same momentum density sets the wall NEC deficit and
108
+ curvature scaling.
109
+ - Rigorous geodesic-integrated ANEC via a symplectic null integrator (with an
110
+ on-cone witness), plus a Ford-Roman quantum-inequality diagnostic.
111
+ - Bondi four-momentum radiated-flux and Newman-Penrose peeling at null infinity
112
+ (`warpax.bondi`).
113
+ - Exact curvature via forward-mode JAX autodiff, no finite-difference stencils.
114
+ - Ten warp/shell metrics, constraint residuals, anisotropic TOV, ADM mass with
115
+ falloff, Israel junctions, transport diagnostics, and source-first S-/T-shell
116
+ construction with a five-criterion admissibility standard.
117
+
118
+ ## Two papers, one toolkit
119
+
120
+ warpax backs two separate papers with disjoint claims. If you cite a result,
121
+ cite the paper it belongs to:
122
+
123
+ | | Certification paper ([arXiv:2602.18023](https://arxiv.org/abs/2602.18023)) | Companion note ([arXiv:2605.25417](https://arxiv.org/abs/2605.25417)) |
124
+ |---|---|---|
125
+ | **Question** | Which observers see energy-condition violations, at which warp speeds? | Can source-first shells satisfy the energy conditions at all? |
126
+ | **Results** | Frame-free all-velocity certifier; velocity-resolved type map; momentum-density discriminant controlling the wall type; closed-form worst observer; exoticity ranking + two-term $v_s$ deficit law | S-/T-shell constructions from the Einstein constraints; five-criterion admissibility standard; boundary-cost analysis |
127
+ | **Modules** | `energy_conditions`, `geometry`, `averaged`, `quantum`, `analysis`, `geodesics`, `transport`; metrics Alcubierre / Natário / Van den Broeck / Rodal / Lentz / WarpShell / Garattini | `constraints` (S-/T-shell solvers), `tov`, `adm`, `junction`, `design`, `optimization`; `metrics/sshell.py`, `metrics/tshell.py` |
128
+ | **Examples** | 01-07 | 08-10 |
129
+
130
+ The S-/T-shells are constructed and certified in the companion note, not in the
131
+ certification paper; neither paper's results depend on the other's.
132
+
133
+ ## Quick start
134
+
135
+ ```bash
136
+ # Create environment and install
137
+ conda create -n warpax python=3.12 -y && conda activate warpax
138
+ pip install -e ".[dev,viz,design,solver]"
139
+
140
+ # Run a quick example
141
+ python examples/01_minkowski_sanity.py
142
+ ```
143
+
144
+ See [`examples/README.md`](examples/README.md) for a numbered learning path (01-10)
145
+ and which optional extras each script needs.
146
+
147
+ For a 5-10 minute walkthrough from install to seeing an energy condition violation,
148
+ see the [Quickstart tutorial](docs/tutorials/quickstart.md).
149
+
150
+ ## Key results
151
+
152
+ ### Frame-independent type map across the luminal transition
153
+
154
+ On matched, wall-resolved grids, the Rodal irrotational geometry is globally
155
+ Hawking-Ellis Type I at every speed from $v_s = 0.1$ to $2.5$, while the
156
+ Alcubierre/Natário/Van den Broeck bubble walls are Type-IV dominated (no rest
157
+ frame, no invariant energy density) at every speed. The split is controlled by the
158
+ Eulerian momentum density through the discriminant
159
+ $\Delta=(\rho+S_\parallel)^2-4|j|^2$: an irrotational shift carries no wall momentum
160
+ and stays globally Type I, while a vortical shift drives $\Delta<0$ and the wall to
161
+ Type IV. For Rodal's globally Type-I drive the Eulerian frame does not register
162
+ ~73% of the wall weak-energy and ~74% of the wall dominant-energy violations seen
163
+ by boosted observers, an exact eigenvalue statement rather than an optimizer
164
+ artifact. A rigorous geodesic-integrated
165
+ ANEC (symplectic integrator with an on-cone witness) and a Ford-Roman comparison
166
+ preserve the ordering: every drive violates, and the irrotational Rodal geometry is
167
+ the mildest by one to two orders of magnitude.
168
+
169
+ ### Composite exoticity ranking and scaling laws
170
+
171
+ A composite exoticity ranking on the benchmark slice, from observer-independent
172
+ inputs (NEC severity, Type-IV fraction, rigorous ANEC minimum), places the
173
+ irrotational Rodal drive nearly two orders of magnitude below the bubble-wall
174
+ drives (index 0.010 against 0.70 to 1.00), driven by its vanishing Type-IV
175
+ fraction and tiny averaged-null energy, not by a milder pointwise NEC. The wall NEC deficit follows the two-term law
176
+ $\min(\rho+p_i) = -C\,v_s^2 - D\,v_s$, single-term for the irrotational Rodal drive
177
+ ($D=0$) and with a vorticity-set linear correction for the vortical walls, in line
178
+ with the Santiago-Schuster-Visser no-go. The wall curvature splits by the same
179
+ vorticity: vortical walls grow as $v_s^2$, the irrotational Rodal wall as $v_s^4$
180
+ ($R^2 \ge 0.99$).
181
+
182
+ ### Observer-robust vs Eulerian
183
+
184
+ Conditional on a violation existing, the Eulerian frame misses up to 29% of the
185
+ DEC-violating points and 76% of the SEC-violating points across the tested
186
+ drives (`results/comparison_table.json`).
187
+
188
+ ### Custom metrics
189
+
190
+ Subclass `ADMMetric` and run the full pipeline. The figure below validates a
191
+ Gaussian warp bubble on a 24x24x4 grid: SEC margins from the Eulerian observer
192
+ (left), from the worst-case boosted observer found by BFGS (center), and the 1496
193
+ grid points the Eulerian frame reports as SEC-satisfied while the boosted observer
194
+ sees them violated (right). Regenerate it with
195
+ `python examples/07_custom_warp_metric.py --readme-figure`.
196
+
197
+ ![Gaussian Warp Grid Comparison](https://raw.githubusercontent.com/anindex/warpax/main/figures/gaussian_warp_grid_comparison.png)
198
+
199
+ <p align="center"><em>SEC comparison for a custom Gaussian warp bubble (v<sub>s</sub> = 0.5). Red marks violations the Eulerian frame misses.</em></p>
200
+
201
+ See [`examples/07_custom_warp_metric.py`](examples/07_custom_warp_metric.py).
202
+
203
+ ### Shell admissibility
204
+
205
+ `warpax` ships a five-criterion admissibility standard for warp shells:
206
+
207
+ | Criterion | Checks |
208
+ |-----------|--------|
209
+ | A. Regularity | $C^2$ metric continuity (thick) or Israel conditions (thin) |
210
+ | B. Constraints | Hamiltonian + momentum residuals $\epsilon_{\mathcal{H}}$, $\epsilon_{\mathcal{M}}$ |
211
+ | C. Matter model | Identifiable source (anisotropic fluid, elastic shell) |
212
+ | D. EC margins | Frame-free NEC/WEC/DEC from Hawking-Ellis eigenvalue slacks (exact, cap-free at Type-I; valid at all $v_s$) |
213
+ | E. Global | Positive ADM mass, asymptotic falloff, tidal forces, invariant transport |
214
+
215
+ Fuchs constant-velocity shell: source-aware $\epsilon_{\mathcal{H}} \approx
216
+ 3\times10^{-8}$; the bulk shell interior is Type-I and EC-compliant (0 of 13
217
+ probes violate), while the smoothing tail turns Type-IV. The source-first S-/
218
+ T-shells likewise pass criteria A-C and E with positive interior margins; the
219
+ binding cost is a cap-free Type-I dominant-energy deficit at the inner shell edge
220
+ ($\approx -4.4\times10^{-4}$), localized at the smooth source-vacuum transition,
221
+ and the tilted T-shell's shift vorticity drives a Type-IV onset at its
222
+ low-density edge. These shell results belong to the companion note; see
223
+ [The boundary cost of source consistency](docs/explanation/boundary_cost.md).
224
+
225
+ ## Examples
226
+
227
+ See [`examples/README.md`](examples/README.md) for runtime estimates, install extras,
228
+ and a suggested order for new users.
229
+
230
+ | Script | Description |
231
+ |--------|-------------|
232
+ | `01_minkowski_sanity.py` | Flat-space sanity check (all ECs satisfied) |
233
+ | `02_schwarzschild_verification.py` | Schwarzschild ground-truth validation |
234
+ | `03_alcubierre_analysis.py` | Alcubierre warp drive EC analysis (**quickstart entry**) |
235
+ | `04_warp_drive_comparison.py` | Multi-metric comparison (six warp drives) |
236
+ | `05_grid_analysis.py` | Grid-based EC verification + comparison figure |
237
+ | `06_geodesic_through_warp_bubble.py` | Geodesic integration with tidal forces |
238
+ | `07_custom_warp_metric.py` | Custom warp manifold + robust EC validation |
239
+ | `08_metric_design.py` | Shape-function metric design (B-spline reproduction) |
240
+ | `09_admissibility_diagnostics.py` | Admissibility diagnostics on the Fuchs warp shell |
241
+ | `10_phase_diagram.py` | Parameter-space sweep and EC-admissible transport phase diagram |
242
+
243
+ ```bash
244
+ python examples/01_minkowski_sanity.py
245
+ python examples/10_phase_diagram.py # 8x6 demo (~2 min)
246
+ python examples/10_phase_diagram.py --full # 20x15 sweep (~30 min GPU)
247
+ ```
248
+
249
+ ## Architecture
250
+
251
+ ```
252
+ metrics -> geometry -> energy_conditions -> analysis
253
+ | |
254
+ geodesics classification (Hawking-Ellis)
255
+ |
256
+ transport / tidal / blueshift
257
+ ```
258
+
259
+ | Package | Description |
260
+ |---------|-------------|
261
+ | `geometry` | JAX autodiff pipeline: metric $\to$ Christoffel $\to$ Riemann $\to$ Ricci $\to$ Einstein $\to$ $T_{\mu\nu}$; ADM 3+1 split; $C^2$ regularity diagnostics |
262
+ | `energy_conditions` | NEC/WEC/SEC/DEC via Hawking-Ellis classification, eigenvalue algebra, multi-start BFGS observer optimization |
263
+ | `grids` | Non-uniform grid generators; wall-clustered sampling that resolves a bubble wall without a uniform refinement everywhere |
264
+ | `metrics` | Nine warp/shell metrics: Natário, Lentz, Rodal, Van den Broeck, WarpShell, Fuchs, S-shell, T-shell, Garattini-Zatrimaylov (Alcubierre, Minkowski, and Schwarzschild ship in `benchmarks`, making ten warp metrics total) |
265
+ | `constraints` | Hamiltonian + momentum constraint residuals; S-shell and T-shell constraint solvers (pure JAX) |
266
+ | `tov` | Anisotropic TOV equilibrium checker |
267
+ | `adm` | ADM mass with surface integral and asymptotic falloff verification |
268
+ | `junction` | Israel/Darmois junction conditions and surface stress-energy |
269
+ | `transport` | Invariant diagnostics: geodesic deviation, null coordinate-time asymmetry, blueshift hazard |
270
+ | `optimization` | Bernstein basis, multi-objective loss, EC soft/hard constraints, parameter sweep |
271
+ | `geodesics` | Timelike/null geodesic integration via Diffrax, tidal deviation, blueshift extraction |
272
+ | `design` | Differentiable shape-function parametrization with constrained BFGS optimizer |
273
+ | `analysis` | Eulerian vs. robust comparison, convergence tools (stability spreads + continuum polishing of wall extrema, `analysis.extrema`), kinematic scalars |
274
+ | `io` | External metric loaders: WarpFactory (.mat), EinFields (checkpoint), Cactus (HDF5) |
275
+ | `visualization` | Matplotlib publication figures, Manim animations, phase diagram plots |
276
+ | `classify` | Bobrick-Martire subluminal/superluminal taxonomy |
277
+ | `averaged` | ANEC/AWEC null-ray and geodesic line integrals |
278
+ | `quantum` | Ford-Roman quantum inequality evaluator |
279
+ | `bondi` | Bondi four-momentum, radiated flux, and Newman-Penrose peeling at null infinity |
280
+ | `benchmarks` | Reference spacetimes (Alcubierre, Minkowski, Schwarzschild). Distinct from the top-level `benchmarks/` asv harness |
281
+ | `numerics` | Shared numerical utilities: constants, regularity floors, autodiff-safe helpers |
282
+
283
+ All metrics implement a common `MetricFunction` interface: a callable `(4,) -> (4,4)` mapping
284
+ coordinates $x^\mu$ to the covariant metric tensor $g_{\mu\nu}$.
285
+
286
+ ## Running tests
287
+
288
+ ```bash
289
+ pytest # Whole suite, ~3 min (1090 tests, parallel by default)
290
+ pytest -m smoke # Visualization import / render smoke tests
291
+ pytest tests/test_slemma.py # One module
292
+ ```
293
+
294
+ One tier only: `-n auto` comes from `pyproject.toml`, and no test is excluded by
295
+ default.
296
+
297
+ ## Reproducing results
298
+
299
+ To pin the exact Python environment used to produce the published results:
300
+
301
+ ```bash
302
+ export PYTHON=$(uv run which python)
303
+ bash reproduce_all.sh
304
+ ```
305
+
306
+ Stages can be run individually:
307
+
308
+ ```bash
309
+ bash reproduce_all.sh --stage core # Core computation
310
+ bash reproduce_all.sh --stage ablation # Ablation studies
311
+ bash reproduce_all.sh --stage figures # Figure generation
312
+ ```
313
+
314
+ Use `--keep-cache` to skip cache deletion and only recompute missing results.
315
+
316
+ Per-paper reproduction guides map every figure, table and quoted number to the
317
+ script that produces it:
318
+
319
+ - [**Observer-robust energy condition paper**](docs/how-to/reproduce_observer_robust_paper.md) - stage list, table- and figure-to-script maps, and the two consistency checks
320
+ - [**Warp-shell admissibility paper**](docs/how-to/reproduce_warpshell_paper.md) - per-figure, per-claim mapping to scripts and outputs
321
+
322
+ The outer-edge ($r \ge R_2$) Type-IV verification (log-log slope $1.01 \pm 0.01$) and
323
+ the ANEC impact-parameter scan are reproduced by
324
+ `scripts/run_tshell_typeIV_onset.py` and `scripts/run_anec_impact_scan.py`.
325
+
326
+ ## Documentation
327
+
328
+ warpax ships full documentation in [`docs/`](docs/), organized following the [Diataxis](https://diataxis.fr/) framework:
329
+
330
+ ### Tutorials
331
+
332
+ - [**Quickstart**](docs/tutorials/quickstart.md) - 5-10 minutes from install to seeing an energy condition violation
333
+ - [**First curvature computation**](docs/tutorials/first_curvature_computation.md) - full curvature chain on Minkowski as a warm-up
334
+
335
+ ### How-to guides
336
+
337
+ - [**Define a custom warp metric**](docs/how-to/custom_metric_tutorial.md) - subclass `ADMMetric` and run the verification pipeline
338
+ - [**Interpret EC results**](docs/how-to/interpreting_ec_results.md) - read margin signs, Hawking-Ellis types, and worst-case observers
339
+ - [**Load an external metric**](docs/how-to/loading_external_metrics.md) - use WarpFactory, EinFields, or Cactus data
340
+ - [**Reproduce the observer-robust paper**](docs/how-to/reproduce_observer_robust_paper.md) - stage list, table- and figure-to-script maps, and the two consistency checks
341
+ - [**Reproduce the warp-shell admissibility paper**](docs/how-to/reproduce_warpshell_paper.md) - per-figure, per-claim mapping to scripts and outputs
342
+
343
+ ### Reference
344
+
345
+ - [**API reference**](docs/reference/index.md) - autodoc of the public API
346
+ - [**Metric catalog**](docs/reference/metric_catalog.md) - all ten shipped metrics
347
+ - [**Benchmarks**](docs/reference/benchmarks.md) - asv regression harness
348
+
349
+ ### Explanation
350
+
351
+ - [**Architecture**](docs/explanation/ARCHITECTURE.md) - package structure and design decisions
352
+ - [**Theory: ADM 3+1 and Hawking-Ellis types**](docs/explanation/theory.md) - mathematical background
353
+ - [**Release notes**](docs/explanation/release_notes.md) - pre-1.0 history
354
+
355
+ ## Manim visualizations
356
+
357
+ Every scene comes from the same curvature and energy-condition code as the papers.
358
+ Geometric units on the z = 0 slice; each frame is a frozen metric, a parameter
359
+ sweep rather than a time evolution.
360
+
361
+ <div align="center">
362
+ <table>
363
+ <tr>
364
+ <td width="33%"><img src="https://raw.githubusercontent.com/anindex/warpax/main/figures/eulerian_kinematics.gif" alt="Expansion theta = -K and shear of the Eulerian congruence"/></td>
365
+ <td width="33%"><img src="https://raw.githubusercontent.com/anindex/warpax/main/figures/kretschmann_invariant.gif" alt="Kretschmann curvature invariant"/></td>
366
+ <td width="33%"><img src="https://raw.githubusercontent.com/anindex/warpax/main/figures/eulerian_vs_worstcase_nec.gif" alt="Eulerian vs observer-robust NEC margin"/></td>
367
+ </tr>
368
+ <tr>
369
+ <td align="center"><em><strong>Eulerian kinematics.</strong> Expansion θ = −K: space stretches behind the ship (red) and squeezes in front (blue). Shear σ² as iso-contours, with the f = 0.5 wall on top.</em></td>
370
+ <td align="center"><em><strong>Kretschmann invariant.</strong> K = R<sub>abcd</sub>R<sup>abcd</sup>, the same for every observer. Sign-indefinite in Lorentzian signature, so it dips negative, and spikes on the wall.</em></td>
371
+ <td align="center"><em><strong>Observer-robust NEC.</strong> Six axis-aligned Eulerian nulls on the left, the worst case over the whole null sphere on the right (k·n<sub>Eul</sub> = −1). The gap is what observer-robust verification buys.</em></td>
372
+ </tr>
373
+ </table>
374
+ </div>
375
+
376
+ The full set: **WallAndVelocitySweep** / **VelocitySweep** (dual-layer 3D,
377
+ ρ<sub>Eul</sub> above a NEC-margin slab), **BoostRapiditySweep** (energy density
378
+ vs rapidity ζ, deepening as cosh²ζ), **EulerianKinematics2D**,
379
+ **KretschmannInvariant2D**, **NECMargin2D** / **EulerianVsWorstCaseNEC**, and
380
+ **WorstCaseNullDirections** / **WorstCaseBoostDirections**.
381
+
382
+ ```bash
383
+ # System dependencies (Ubuntu/Debian)
384
+ sudo apt install texlive-latex-extra texlive-fonts-recommended dvipng cm-super ffmpeg gifsicle
385
+
386
+ # Python dependencies (Python <= 3.13 recommended for the renderer)
387
+ pip install -e ".[manim]"
388
+
389
+ # Render all scenes (2D via Cairo, 3D via the GPU OpenGL renderer)
390
+ python scripts/render_all_scenes.py
391
+ ```
392
+
393
+ Rendered videos and images are written to `media/` (not tracked by git). The 3D
394
+ scenes render through manim's OpenGL renderer (EGL, headless).
395
+
396
+ ## Citation
397
+
398
+ If you found this work useful, please consider citing:
399
+
400
+ ```bibtex
401
+ @article{le2026observer,
402
+ title={Observer-robust energy condition verification for warp drive spacetimes},
403
+ author={Le, An T},
404
+ journal={arXiv preprint arXiv:2602.18023},
405
+ year={2026}
406
+ }
407
+
408
+ @article{le2026boundary,
409
+ title={On the boundary cost of source-consistent warp shells},
410
+ author={Le, An T},
411
+ journal={arXiv preprint arXiv:2605.25417},
412
+ year={2026}
413
+ }
414
+ ```