nefi 0.1.0__py3-none-any.whl

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 (188) hide show
  1. nefi/__init__.py +126 -0
  2. nefi/auto.py +1477 -0
  3. nefi/autotune/__init__.py +114 -0
  4. nefi/autotune/_common.py +399 -0
  5. nefi/autotune/acquisition.py +536 -0
  6. nefi/autotune/convergence.py +587 -0
  7. nefi/autotune/gauge.py +1047 -0
  8. nefi/autotune/orchestrate.py +714 -0
  9. nefi/autotune/regularization.py +526 -0
  10. nefi/autotune/search.py +459 -0
  11. nefi/baselines/__init__.py +276 -0
  12. nefi/baselines/_common.py +133 -0
  13. nefi/baselines/admm.py +386 -0
  14. nefi/baselines/deep_decoder.py +198 -0
  15. nefi/baselines/direct.py +136 -0
  16. nefi/baselines/gaussian_splat.py +585 -0
  17. nefi/baselines/lbfgs.py +76 -0
  18. nefi/baselines/thermography.py +214 -0
  19. nefi/bench/__init__.py +13 -0
  20. nefi/bench/ablation.py +582 -0
  21. nefi/bench/base.py +127 -0
  22. nefi/bench/protocol.py +1147 -0
  23. nefi/bench/report.py +327 -0
  24. nefi/bench/sweep.py +94 -0
  25. nefi/cli.py +1448 -0
  26. nefi/config.py +103 -0
  27. nefi/diagnostics/__init__.py +105 -0
  28. nefi/diagnostics/_common.py +351 -0
  29. nefi/diagnostics/filtering.py +348 -0
  30. nefi/diagnostics/landscape.py +368 -0
  31. nefi/diagnostics/plots.py +246 -0
  32. nefi/diagnostics/report.py +533 -0
  33. nefi/diagnostics/sensitivity.py +150 -0
  34. nefi/diagnostics/spectrum.py +177 -0
  35. nefi/domain.py +156 -0
  36. nefi/errors.py +27 -0
  37. nefi/fields/__init__.py +58 -0
  38. nefi/fields/adaptive/__init__.py +90 -0
  39. nefi/fields/adaptive/annealing.py +661 -0
  40. nefi/fields/adaptive/capacity.py +282 -0
  41. nefi/fields/adaptive/selection.py +683 -0
  42. nefi/fields/adaptive/spectrum.py +949 -0
  43. nefi/fields/base.py +55 -0
  44. nefi/fields/encoding.py +202 -0
  45. nefi/fields/geometric/__init__.py +124 -0
  46. nefi/fields/geometric/_utils.py +369 -0
  47. nefi/fields/geometric/composite.py +582 -0
  48. nefi/fields/geometric/layered.py +542 -0
  49. nefi/fields/geometric/shape.py +636 -0
  50. nefi/fields/geometric/spectral.py +462 -0
  51. nefi/fields/geometric/warp.py +722 -0
  52. nefi/fields/grid.py +87 -0
  53. nefi/fields/hashgrid.py +265 -0
  54. nefi/fields/heads.py +273 -0
  55. nefi/fields/levelset.py +188 -0
  56. nefi/fields/lowrank.py +184 -0
  57. nefi/fields/modifiers.py +374 -0
  58. nefi/fields/neural.py +152 -0
  59. nefi/fields/parametric.py +311 -0
  60. nefi/fields/symmetric.py +180 -0
  61. nefi/instances/__init__.py +39 -0
  62. nefi/instances/_elliptic_common.py +209 -0
  63. nefi/instances/_volumetric.py +424 -0
  64. nefi/instances/_wave_family.py +132 -0
  65. nefi/instances/base.py +155 -0
  66. nefi/instances/ct3d/__init__.py +350 -0
  67. nefi/instances/ct3d/radon3d.py +296 -0
  68. nefi/instances/ct3d/scenes.py +132 -0
  69. nefi/instances/current_density/__init__.py +387 -0
  70. nefi/instances/current_density/scenes.py +167 -0
  71. nefi/instances/darcy_flow/__init__.py +321 -0
  72. nefi/instances/darcy_flow/operator.py +206 -0
  73. nefi/instances/darcy_flow/scenes.py +132 -0
  74. nefi/instances/deconvolution/__init__.py +372 -0
  75. nefi/instances/deconvolution/data.py +90 -0
  76. nefi/instances/deconvolution/phantoms.py +147 -0
  77. nefi/instances/deconvolution/psf.py +99 -0
  78. nefi/instances/deconvolution/scenes.py +105 -0
  79. nefi/instances/deconvolution/wiener.py +106 -0
  80. nefi/instances/deconvolution3d/__init__.py +435 -0
  81. nefi/instances/deconvolution3d/classical.py +152 -0
  82. nefi/instances/deconvolution3d/scenes.py +158 -0
  83. nefi/instances/diffraction_tomography/__init__.py +279 -0
  84. nefi/instances/dot3d/__init__.py +488 -0
  85. nefi/instances/dot3d/data.py +110 -0
  86. nefi/instances/dot3d/operator.py +343 -0
  87. nefi/instances/dot3d/scenes.py +122 -0
  88. nefi/instances/eit/__init__.py +340 -0
  89. nefi/instances/eit/operator.py +342 -0
  90. nefi/instances/eit/scenes.py +134 -0
  91. nefi/instances/holography/__init__.py +276 -0
  92. nefi/instances/nv_relaxometry/__init__.py +648 -0
  93. nefi/instances/nv_relaxometry/data.py +100 -0
  94. nefi/instances/nv_relaxometry/losses.py +80 -0
  95. nefi/instances/nv_relaxometry/operator.py +271 -0
  96. nefi/instances/nv_relaxometry/physics.py +227 -0
  97. nefi/instances/nv_relaxometry/scenes.py +247 -0
  98. nefi/instances/photoacoustic3d/__init__.py +374 -0
  99. nefi/instances/photoacoustic3d/scenes.py +119 -0
  100. nefi/instances/photoacoustic3d/sensor.py +86 -0
  101. nefi/instances/poisson_source/__init__.py +243 -0
  102. nefi/instances/poisson_source/data.py +135 -0
  103. nefi/instances/poisson_source/operator.py +246 -0
  104. nefi/instances/poisson_source/scenes.py +71 -0
  105. nefi/instances/reaction_diffusion/__init__.py +262 -0
  106. nefi/instances/sparse_view_ct/__init__.py +268 -0
  107. nefi/instances/sparse_view_ct/radon.py +292 -0
  108. nefi/instances/sparse_view_ct/scenes.py +113 -0
  109. nefi/instances/thermal_tomography/__init__.py +728 -0
  110. nefi/instances/thermal_tomography/pinn.py +235 -0
  111. nefi/instances/thermal_tomography/projection.py +187 -0
  112. nefi/instances/thermal_tomography/realdata.py +307 -0
  113. nefi/instances/thermal_tomography/scenes.py +236 -0
  114. nefi/instances/toy1d/__init__.py +175 -0
  115. nefi/instances/wave_fwi/__init__.py +419 -0
  116. nefi/instances/wave_fwi/losses.py +89 -0
  117. nefi/losses/__init__.py +49 -0
  118. nefi/losses/base.py +168 -0
  119. nefi/losses/data.py +155 -0
  120. nefi/losses/physics.py +357 -0
  121. nefi/losses/reg.py +170 -0
  122. nefi/measurement.py +95 -0
  123. nefi/metrics/__init__.py +38 -0
  124. nefi/metrics/basic.py +170 -0
  125. nefi/metrics/localization.py +225 -0
  126. nefi/metrics/segmentation.py +192 -0
  127. nefi/operators/__init__.py +60 -0
  128. nefi/operators/base.py +188 -0
  129. nefi/operators/conv.py +213 -0
  130. nefi/operators/function.py +281 -0
  131. nefi/operators/linear.py +522 -0
  132. nefi/operators/nonlinear.py +227 -0
  133. nefi/operators/pde/__init__.py +62 -0
  134. nefi/operators/pde/adjoint.py +494 -0
  135. nefi/operators/pde/heat.py +637 -0
  136. nefi/operators/pde/linear_solvers.py +152 -0
  137. nefi/operators/pde/stencil.py +834 -0
  138. nefi/operators/timestepping.py +474 -0
  139. nefi/physics/__init__.py +81 -0
  140. nefi/physics/elliptic.py +1389 -0
  141. nefi/physics/magnetostatics.py +801 -0
  142. nefi/physics/optics.py +462 -0
  143. nefi/physics/reaction_diffusion.py +402 -0
  144. nefi/physics/scattering.py +634 -0
  145. nefi/physics/timestep.py +225 -0
  146. nefi/physics/wave.py +968 -0
  147. nefi/priors.py +1176 -0
  148. nefi/problem.py +148 -0
  149. nefi/py.typed +0 -0
  150. nefi/registry.py +78 -0
  151. nefi/solve/__init__.py +44 -0
  152. nefi/solve/balancing.py +142 -0
  153. nefi/solve/batched.py +794 -0
  154. nefi/solve/callbacks.py +150 -0
  155. nefi/solve/curriculum.py +142 -0
  156. nefi/solve/ensemble.py +53 -0
  157. nefi/solve/postprocess.py +107 -0
  158. nefi/solve/refine.py +1907 -0
  159. nefi/solve/result.py +85 -0
  160. nefi/solve/solver.py +690 -0
  161. nefi/utils/__init__.py +27 -0
  162. nefi/utils/compat.py +82 -0
  163. nefi/utils/device.py +44 -0
  164. nefi/utils/seed.py +30 -0
  165. nefi/utils/tensor.py +92 -0
  166. nefi/utils/timing.py +20 -0
  167. nefi/viz/__init__.py +313 -0
  168. nefi/viz/_instances.py +274 -0
  169. nefi/viz/assets/volume_viewer.css +70 -0
  170. nefi/viz/assets/volume_viewer.js +1271 -0
  171. nefi/viz/fields.py +1960 -0
  172. nefi/viz/hints.py +314 -0
  173. nefi/viz/interactive.py +949 -0
  174. nefi/viz/isosurface.py +1076 -0
  175. nefi/viz/measurement.py +1670 -0
  176. nefi/viz/multiphysics.py +1799 -0
  177. nefi/viz/performance.py +1289 -0
  178. nefi/viz/qualitative.py +651 -0
  179. nefi/viz/report.py +621 -0
  180. nefi/viz/style.py +997 -0
  181. nefi/viz/training.py +1030 -0
  182. nefi/viz/volume.py +728 -0
  183. nefi-0.1.0.dist-info/METADATA +268 -0
  184. nefi-0.1.0.dist-info/RECORD +188 -0
  185. nefi-0.1.0.dist-info/WHEEL +5 -0
  186. nefi-0.1.0.dist-info/entry_points.txt +2 -0
  187. nefi-0.1.0.dist-info/licenses/LICENSE +21 -0
  188. nefi-0.1.0.dist-info/top_level.txt +1 -0
nefi/__init__.py ADDED
@@ -0,0 +1,126 @@
1
+ """nefi — Neural-Field Inversion.
2
+
3
+ Physics-faithful, label-free inverse problems solved by per-measurement optimization of a
4
+ coordinate neural field through a differentiable forward operator.
5
+
6
+ Quick start::
7
+
8
+ import nefi
9
+ from nefi.instances.toy1d import make_problem
10
+
11
+ problem, gt, meas = make_problem()
12
+ result = nefi.invert(problem) # default: 2-stage multiscale curriculum
13
+ print(nefi.metrics.psnr(result.fields["x"], gt["x"]))
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import logging as _logging
19
+
20
+ from . import fields, losses, metrics, operators, solve
21
+ from .config import config_hash, load_config, save_config
22
+ from .domain import Domain
23
+ from .errors import NefiError
24
+ from .fields import Bounded, GatedSoftplus, GridField, Heads, NeuralField, Softplus, SupportMasked
25
+ from .losses import L1, MSE, TV, LogMSE, LossSet, NormalizedMSE
26
+ from .measurement import Measurement
27
+ from .operators import FFTConvolution, Nuisance, Operator
28
+ from .problem import InverseProblem
29
+ from .registry import build, list_registered, register
30
+ from .solve import (
31
+ Curriculum,
32
+ EnergyScaleCorrection,
33
+ OptimConfig,
34
+ RefineReport,
35
+ Result,
36
+ Solver,
37
+ Stage,
38
+ batch_invert,
39
+ ensemble,
40
+ refine_edges,
41
+ )
42
+
43
+ __version__ = "0.1.0"
44
+
45
+ _logging.getLogger("nefi").addHandler(_logging.NullHandler())
46
+
47
+ from . import instances # noqa: E402 (registers built-in instances)
48
+
49
+
50
+ def invert(problem: InverseProblem, curriculum: Curriculum | None = None, **solver_kw) -> Result:
51
+ """One-call entry point: run ``Solver(problem, curriculum, **solver_kw).run()``."""
52
+ return Solver(problem, curriculum, **solver_kw).run()
53
+
54
+
55
+ def enable_logging(level: int = _logging.INFO) -> None:
56
+ """Send nefi logs to stderr (idempotent)."""
57
+ logger = _logging.getLogger("nefi")
58
+ if not any(
59
+ isinstance(h, _logging.StreamHandler) and not isinstance(h, _logging.NullHandler)
60
+ for h in logger.handlers
61
+ ):
62
+ h = _logging.StreamHandler()
63
+ h.setFormatter(_logging.Formatter("%(asctime)s %(levelname)s %(message)s", "%H:%M:%S"))
64
+ logger.addHandler(h)
65
+ logger.setLevel(level)
66
+
67
+
68
+ __all__ = [
69
+ "L1",
70
+ "MSE",
71
+ "TV",
72
+ "Bounded",
73
+ "Curriculum",
74
+ "Domain",
75
+ "EnergyScaleCorrection",
76
+ "FFTConvolution",
77
+ "GatedSoftplus",
78
+ "GridField",
79
+ "Heads",
80
+ "InverseProblem",
81
+ "LogMSE",
82
+ "LossSet",
83
+ "Measurement",
84
+ "NefiError",
85
+ "NeuralField",
86
+ "NormalizedMSE",
87
+ "Nuisance",
88
+ "Operator",
89
+ "OptimConfig",
90
+ "RefineReport",
91
+ "Result",
92
+ "Softplus",
93
+ "Solver",
94
+ "Stage",
95
+ "SupportMasked",
96
+ "batch_invert",
97
+ "build",
98
+ "config_hash",
99
+ "enable_logging",
100
+ "ensemble",
101
+ "fields",
102
+ "instances",
103
+ "list_registered",
104
+ "load_config",
105
+ "losses",
106
+ "metrics",
107
+ "operators",
108
+ "register",
109
+ "save_config",
110
+ "invert",
111
+ "refine_edges",
112
+ "solve",
113
+ ]
114
+
115
+ # --- bring-your-own-problem layer: prior catalogue + adaptive defaults -------------------------
116
+ from . import auto, priors # noqa: E402
117
+ from .auto import from_forward, quick_report # noqa: E402
118
+ from .priors import Prior # noqa: E402
119
+
120
+ __all__ += ["Prior", "auto", "from_forward", "priors", "quick_report"]
121
+
122
+ # --- auto-tuning layer: gauges, acquisition report, budget / LR, regularization, search --------
123
+ from . import autotune # noqa: E402
124
+ from .autotune import autotune_problem # noqa: E402
125
+
126
+ __all__ += ["autotune", "autotune_problem"]