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.
- nefi/__init__.py +126 -0
- nefi/auto.py +1477 -0
- nefi/autotune/__init__.py +114 -0
- nefi/autotune/_common.py +399 -0
- nefi/autotune/acquisition.py +536 -0
- nefi/autotune/convergence.py +587 -0
- nefi/autotune/gauge.py +1047 -0
- nefi/autotune/orchestrate.py +714 -0
- nefi/autotune/regularization.py +526 -0
- nefi/autotune/search.py +459 -0
- nefi/baselines/__init__.py +276 -0
- nefi/baselines/_common.py +133 -0
- nefi/baselines/admm.py +386 -0
- nefi/baselines/deep_decoder.py +198 -0
- nefi/baselines/direct.py +136 -0
- nefi/baselines/gaussian_splat.py +585 -0
- nefi/baselines/lbfgs.py +76 -0
- nefi/baselines/thermography.py +214 -0
- nefi/bench/__init__.py +13 -0
- nefi/bench/ablation.py +582 -0
- nefi/bench/base.py +127 -0
- nefi/bench/protocol.py +1147 -0
- nefi/bench/report.py +327 -0
- nefi/bench/sweep.py +94 -0
- nefi/cli.py +1448 -0
- nefi/config.py +103 -0
- nefi/diagnostics/__init__.py +105 -0
- nefi/diagnostics/_common.py +351 -0
- nefi/diagnostics/filtering.py +348 -0
- nefi/diagnostics/landscape.py +368 -0
- nefi/diagnostics/plots.py +246 -0
- nefi/diagnostics/report.py +533 -0
- nefi/diagnostics/sensitivity.py +150 -0
- nefi/diagnostics/spectrum.py +177 -0
- nefi/domain.py +156 -0
- nefi/errors.py +27 -0
- nefi/fields/__init__.py +58 -0
- nefi/fields/adaptive/__init__.py +90 -0
- nefi/fields/adaptive/annealing.py +661 -0
- nefi/fields/adaptive/capacity.py +282 -0
- nefi/fields/adaptive/selection.py +683 -0
- nefi/fields/adaptive/spectrum.py +949 -0
- nefi/fields/base.py +55 -0
- nefi/fields/encoding.py +202 -0
- nefi/fields/geometric/__init__.py +124 -0
- nefi/fields/geometric/_utils.py +369 -0
- nefi/fields/geometric/composite.py +582 -0
- nefi/fields/geometric/layered.py +542 -0
- nefi/fields/geometric/shape.py +636 -0
- nefi/fields/geometric/spectral.py +462 -0
- nefi/fields/geometric/warp.py +722 -0
- nefi/fields/grid.py +87 -0
- nefi/fields/hashgrid.py +265 -0
- nefi/fields/heads.py +273 -0
- nefi/fields/levelset.py +188 -0
- nefi/fields/lowrank.py +184 -0
- nefi/fields/modifiers.py +374 -0
- nefi/fields/neural.py +152 -0
- nefi/fields/parametric.py +311 -0
- nefi/fields/symmetric.py +180 -0
- nefi/instances/__init__.py +39 -0
- nefi/instances/_elliptic_common.py +209 -0
- nefi/instances/_volumetric.py +424 -0
- nefi/instances/_wave_family.py +132 -0
- nefi/instances/base.py +155 -0
- nefi/instances/ct3d/__init__.py +350 -0
- nefi/instances/ct3d/radon3d.py +296 -0
- nefi/instances/ct3d/scenes.py +132 -0
- nefi/instances/current_density/__init__.py +387 -0
- nefi/instances/current_density/scenes.py +167 -0
- nefi/instances/darcy_flow/__init__.py +321 -0
- nefi/instances/darcy_flow/operator.py +206 -0
- nefi/instances/darcy_flow/scenes.py +132 -0
- nefi/instances/deconvolution/__init__.py +372 -0
- nefi/instances/deconvolution/data.py +90 -0
- nefi/instances/deconvolution/phantoms.py +147 -0
- nefi/instances/deconvolution/psf.py +99 -0
- nefi/instances/deconvolution/scenes.py +105 -0
- nefi/instances/deconvolution/wiener.py +106 -0
- nefi/instances/deconvolution3d/__init__.py +435 -0
- nefi/instances/deconvolution3d/classical.py +152 -0
- nefi/instances/deconvolution3d/scenes.py +158 -0
- nefi/instances/diffraction_tomography/__init__.py +279 -0
- nefi/instances/dot3d/__init__.py +488 -0
- nefi/instances/dot3d/data.py +110 -0
- nefi/instances/dot3d/operator.py +343 -0
- nefi/instances/dot3d/scenes.py +122 -0
- nefi/instances/eit/__init__.py +340 -0
- nefi/instances/eit/operator.py +342 -0
- nefi/instances/eit/scenes.py +134 -0
- nefi/instances/holography/__init__.py +276 -0
- nefi/instances/nv_relaxometry/__init__.py +648 -0
- nefi/instances/nv_relaxometry/data.py +100 -0
- nefi/instances/nv_relaxometry/losses.py +80 -0
- nefi/instances/nv_relaxometry/operator.py +271 -0
- nefi/instances/nv_relaxometry/physics.py +227 -0
- nefi/instances/nv_relaxometry/scenes.py +247 -0
- nefi/instances/photoacoustic3d/__init__.py +374 -0
- nefi/instances/photoacoustic3d/scenes.py +119 -0
- nefi/instances/photoacoustic3d/sensor.py +86 -0
- nefi/instances/poisson_source/__init__.py +243 -0
- nefi/instances/poisson_source/data.py +135 -0
- nefi/instances/poisson_source/operator.py +246 -0
- nefi/instances/poisson_source/scenes.py +71 -0
- nefi/instances/reaction_diffusion/__init__.py +262 -0
- nefi/instances/sparse_view_ct/__init__.py +268 -0
- nefi/instances/sparse_view_ct/radon.py +292 -0
- nefi/instances/sparse_view_ct/scenes.py +113 -0
- nefi/instances/thermal_tomography/__init__.py +728 -0
- nefi/instances/thermal_tomography/pinn.py +235 -0
- nefi/instances/thermal_tomography/projection.py +187 -0
- nefi/instances/thermal_tomography/realdata.py +307 -0
- nefi/instances/thermal_tomography/scenes.py +236 -0
- nefi/instances/toy1d/__init__.py +175 -0
- nefi/instances/wave_fwi/__init__.py +419 -0
- nefi/instances/wave_fwi/losses.py +89 -0
- nefi/losses/__init__.py +49 -0
- nefi/losses/base.py +168 -0
- nefi/losses/data.py +155 -0
- nefi/losses/physics.py +357 -0
- nefi/losses/reg.py +170 -0
- nefi/measurement.py +95 -0
- nefi/metrics/__init__.py +38 -0
- nefi/metrics/basic.py +170 -0
- nefi/metrics/localization.py +225 -0
- nefi/metrics/segmentation.py +192 -0
- nefi/operators/__init__.py +60 -0
- nefi/operators/base.py +188 -0
- nefi/operators/conv.py +213 -0
- nefi/operators/function.py +281 -0
- nefi/operators/linear.py +522 -0
- nefi/operators/nonlinear.py +227 -0
- nefi/operators/pde/__init__.py +62 -0
- nefi/operators/pde/adjoint.py +494 -0
- nefi/operators/pde/heat.py +637 -0
- nefi/operators/pde/linear_solvers.py +152 -0
- nefi/operators/pde/stencil.py +834 -0
- nefi/operators/timestepping.py +474 -0
- nefi/physics/__init__.py +81 -0
- nefi/physics/elliptic.py +1389 -0
- nefi/physics/magnetostatics.py +801 -0
- nefi/physics/optics.py +462 -0
- nefi/physics/reaction_diffusion.py +402 -0
- nefi/physics/scattering.py +634 -0
- nefi/physics/timestep.py +225 -0
- nefi/physics/wave.py +968 -0
- nefi/priors.py +1176 -0
- nefi/problem.py +148 -0
- nefi/py.typed +0 -0
- nefi/registry.py +78 -0
- nefi/solve/__init__.py +44 -0
- nefi/solve/balancing.py +142 -0
- nefi/solve/batched.py +794 -0
- nefi/solve/callbacks.py +150 -0
- nefi/solve/curriculum.py +142 -0
- nefi/solve/ensemble.py +53 -0
- nefi/solve/postprocess.py +107 -0
- nefi/solve/refine.py +1907 -0
- nefi/solve/result.py +85 -0
- nefi/solve/solver.py +690 -0
- nefi/utils/__init__.py +27 -0
- nefi/utils/compat.py +82 -0
- nefi/utils/device.py +44 -0
- nefi/utils/seed.py +30 -0
- nefi/utils/tensor.py +92 -0
- nefi/utils/timing.py +20 -0
- nefi/viz/__init__.py +313 -0
- nefi/viz/_instances.py +274 -0
- nefi/viz/assets/volume_viewer.css +70 -0
- nefi/viz/assets/volume_viewer.js +1271 -0
- nefi/viz/fields.py +1960 -0
- nefi/viz/hints.py +314 -0
- nefi/viz/interactive.py +949 -0
- nefi/viz/isosurface.py +1076 -0
- nefi/viz/measurement.py +1670 -0
- nefi/viz/multiphysics.py +1799 -0
- nefi/viz/performance.py +1289 -0
- nefi/viz/qualitative.py +651 -0
- nefi/viz/report.py +621 -0
- nefi/viz/style.py +997 -0
- nefi/viz/training.py +1030 -0
- nefi/viz/volume.py +728 -0
- nefi-0.1.0.dist-info/METADATA +268 -0
- nefi-0.1.0.dist-info/RECORD +188 -0
- nefi-0.1.0.dist-info/WHEEL +5 -0
- nefi-0.1.0.dist-info/entry_points.txt +2 -0
- nefi-0.1.0.dist-info/licenses/LICENSE +21 -0
- 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"]
|