blanchon Claude Opus 4.8 (1M context) commited on
Commit
f1ce527
·
1 Parent(s): f1956d9

Install dvlt from a vendored prebuilt wheel (ZeroGPU, no git/sys.path)

Browse files

packages/dvlt/
repo/ verbatim nv-tlabs/dvlt @ 265fe61, diff = 3 relaxed pins
(torch, torchvision, pydantic) so it resolves with the
ZeroGPU torch>=2.8 + gradio 5.50 stack
wheels/ prebuilt wheel (built by build.sh)
build.sh builds repo/ -> wheels/

requirements.txt installs that wheel via the Space's HTTPS resolve URL
(git+url and local-path installs both fail on HF's Gradio build). No sys.path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. README.md +7 -8
  3. app.py +2 -2
  4. packages/dvlt/README.md +21 -19
  5. packages/dvlt/build.sh +24 -0
  6. packages/dvlt/repo/.gitattributes +2 -0
  7. packages/dvlt/repo/.gitignore +201 -0
  8. packages/dvlt/repo/.pre-commit-config.yaml +32 -0
  9. packages/dvlt/repo/CONTRIBUTING.md +68 -0
  10. packages/dvlt/{LICENSE → repo/LICENSE} +0 -0
  11. packages/dvlt/{LICENSES → repo/LICENSES}/NVIDIA-LICENSE.txt +0 -0
  12. packages/dvlt/{LICENSES → repo/LICENSES}/VGGT-LICENSE.txt +0 -0
  13. packages/dvlt/repo/README.md +262 -0
  14. packages/dvlt/{THIRD_PARTY_LICENSES.md → repo/THIRD_PARTY_LICENSES.md} +0 -0
  15. packages/dvlt/repo/assets/nvidia-hq-dvlt.gif +3 -0
  16. packages/dvlt/repo/docs/CONTRIB.md +97 -0
  17. packages/dvlt/repo/docs/INSTALL.md +74 -0
  18. packages/dvlt/repo/docs/TESTING.md +134 -0
  19. packages/dvlt/repo/docs/data/DATA.md +138 -0
  20. packages/dvlt/{pyproject.toml → repo/pyproject.toml} +100 -5
  21. packages/dvlt/{src → repo/src}/dvlt/__init__.py +0 -0
  22. packages/dvlt/{src → repo/src}/dvlt/callbacks/__init__.py +0 -0
  23. packages/dvlt/{src → repo/src}/dvlt/callbacks/base.py +0 -0
  24. packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/__init__.py +0 -0
  25. packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/base.py +0 -0
  26. packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/depth.py +0 -0
  27. packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pointmap.py +0 -0
  28. packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pose.py +0 -0
  29. packages/dvlt/{src → repo/src}/dvlt/callbacks/logging.py +0 -0
  30. packages/dvlt/{src → repo/src}/dvlt/callbacks/util.py +0 -0
  31. packages/dvlt/{src → repo/src}/dvlt/callbacks/visualization.py +0 -0
  32. packages/dvlt/{src → repo/src}/dvlt/common/__init__.py +0 -0
  33. packages/dvlt/{src → repo/src}/dvlt/common/amp.py +0 -0
  34. packages/dvlt/{src → repo/src}/dvlt/common/constants.py +0 -0
  35. packages/dvlt/{src → repo/src}/dvlt/common/geometry.py +0 -0
  36. packages/dvlt/{src → repo/src}/dvlt/common/io.py +0 -0
  37. packages/dvlt/{src → repo/src}/dvlt/common/numpy/__init__.py +0 -0
  38. packages/dvlt/{src → repo/src}/dvlt/common/numpy/geometry.py +0 -0
  39. packages/dvlt/{src → repo/src}/dvlt/common/numpy/projection.py +0 -0
  40. packages/dvlt/{src → repo/src}/dvlt/common/numpy/rotation.py +0 -0
  41. packages/dvlt/{src → repo/src}/dvlt/common/pose.py +0 -0
  42. packages/dvlt/{src → repo/src}/dvlt/common/projection.py +0 -0
  43. packages/dvlt/{src → repo/src}/dvlt/common/rays.py +0 -0
  44. packages/dvlt/{src → repo/src}/dvlt/common/rotation.py +0 -0
  45. packages/dvlt/{src → repo/src}/dvlt/common/tensor.py +0 -0
  46. packages/dvlt/{src → repo/src}/dvlt/common/types.py +0 -0
  47. packages/dvlt/{src → repo/src}/dvlt/config/__init__.py +0 -0
  48. packages/dvlt/{src → repo/src}/dvlt/config/cli.py +0 -0
  49. packages/dvlt/{src → repo/src}/dvlt/config/completion.py +0 -0
  50. packages/dvlt/{src → repo/src}/dvlt/config/experiments/da3-base.yaml +0 -0
.gitattributes CHANGED
@@ -7,3 +7,4 @@
7
  *.gif filter=lfs diff=lfs merge=lfs -text
8
  *.glb filter=lfs diff=lfs merge=lfs -text
9
  *.onnx filter=lfs diff=lfs merge=lfs -text
 
 
7
  *.gif filter=lfs diff=lfs merge=lfs -text
8
  *.glb filter=lfs diff=lfs merge=lfs -text
9
  *.onnx filter=lfs diff=lfs merge=lfs -text
10
+ *.whl filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -55,14 +55,13 @@ The `@spaces.GPU` decorator is a no-op off-Spaces, so it runs on CPU or a local
55
  GPU unchanged.
56
 
57
  > **ZeroGPU note:** ZeroGPU runs on Blackwell GPUs that need `torch>=2.8`, but
58
- > the official `dvlt` package hard-pins `torch==2.5.1`. This repo therefore
59
- > **vendors** `dvlt` under [`packages/dvlt`](packages/dvlt) a clone of
60
- > [`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ `265fe61` with only its
61
- > `torch`/`torchvision` pins relaxed. HF installs `requirements.txt` *before*
62
- > copying the repo, so that subdirectory is pip-installed via git against this
63
- > Space's own repo (`git+…/spaces/blanchon/dvlt@main#subdirectory=packages/dvlt`).
64
- > The Python source is unmodified; see
65
- > [`packages/dvlt/README.md`](packages/dvlt/README.md) for the exact edits.
66
 
67
  ## Credits
68
 
 
55
  GPU unchanged.
56
 
57
  > **ZeroGPU note:** ZeroGPU runs on Blackwell GPUs that need `torch>=2.8`, but
58
+ > the official `dvlt` package hard-pins `torch==2.5.1`. This repo **vendors**
59
+ > `dvlt` under [`packages/dvlt`](packages/dvlt): `repo/` is
60
+ > [`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ `265fe61` with a 3-line
61
+ > pin relaxation (`torch`/`torchvision`/`pydantic`), and `wheels/` holds the
62
+ > prebuilt wheel (`build.sh`). It's installed from that wheel via the Space's
63
+ > own HTTPS `resolve` URL — not git or a local path, both of which fail on HF's
64
+ > Gradio build. See [`packages/dvlt/README.md`](packages/dvlt/README.md).
 
65
 
66
  ## Credits
67
 
app.py CHANGED
@@ -4,8 +4,8 @@ Déjà View (DVLT) — Looping Transformers for Multi-View 3D Reconstruction.
4
  ZeroGPU-ready: GPU work is wrapped in `@spaces.GPU` (see `dvlt_demo.model`),
5
  and falls back to CPU when no GPU / `spaces` package is available.
6
 
7
- `dvlt_demo` sits next to this file (importable directly), and `dvlt` is
8
- installed as a path dependency from `packages/dvlt` no sys.path juggling.
9
  """
10
 
11
  from dvlt_demo.ui import build_demo
 
4
  ZeroGPU-ready: GPU work is wrapped in `@spaces.GPU` (see `dvlt_demo.model`),
5
  and falls back to CPU when no GPU / `spaces` package is available.
6
 
7
+ `dvlt` is installed from the vendored wheel in `packages/dvlt/wheels/` (see
8
+ `requirements.txt`); `dvlt_demo` sits next to this file. Nothing touches sys.path.
9
  """
10
 
11
  from dvlt_demo.ui import build_demo
packages/dvlt/README.md CHANGED
@@ -1,26 +1,28 @@
1
- # dvlt — vendored clone (edited)
2
 
3
- This is a clone of the official **Déjà View (DVLT)** package,
4
- [`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ commit `265fe61`, vendored
5
- into the [`blanchon/dvlt`](https://huggingface.co/spaces/blanchon/dvlt) Space.
6
- It's pip-installed from this subdirectory via git
7
- (`git+…/spaces/blanchon/dvlt@main#subdirectory=packages/dvlt`), because HF
8
- installs `requirements.txt` before copying the repo, so a bare local path can't
9
- be used. Locally, `uv` installs it from the path (`tool.uv.sources`).
 
10
 
11
- ## What was edited
12
 
13
- Only `pyproject.toml` the Python source under `src/dvlt/` is **unmodified**:
14
 
15
- - `torch==2.5.1` `torch>=2.5` ZeroGPU runs on Blackwell GPUs (sm_120) which
16
- need `torch>=2.8`; the exact pin made the package uninstallable there.
17
- - `torchvision==0.20.1` → `torchvision>=0.20` — must track the installed torch.
18
- - `huggingface-hub==1.16.4` `huggingface-hub>=0.30` — so it co-resolves with
19
- the Gradio/Spaces stack the Space pulls in.
 
20
 
21
- Edited 2026-06-01 by Julien Blanchon (with Claude) for the demo Space only.
22
- For anything else, use the upstream repository.
23
 
24
  Upstream code is Apache-2.0; the `nvidia/dvlt` weights are under the NVIDIA
25
- non-commercial research license. See `LICENSE`, `LICENSES/`, and
26
- `THIRD_PARTY_LICENSES.md`.
 
1
+ # Vendored `dvlt`
2
 
3
+ - **`repo/`** a verbatim copy of the upstream **Déjà View (DVLT)** repository,
4
+ [`nv-tlabs/dvlt`](https://github.com/nv-tlabs/dvlt) @ commit `265fe61`. The
5
+ **only** edit is in `repo/pyproject.toml`: the `torch`/`torchvision` pins were
6
+ relaxed from `==` to `>=` (ZeroGPU runs on Blackwell GPUs that need
7
+ `torch>=2.8`, and the `torchvision==0.20.1` pin transitively forced
8
+ `torch==2.5.1`). Everything else is unmodified.
9
+ - **`build.sh`** builds the wheel from `repo/` into `wheels/`.
10
+ - **`wheels/`** — the prebuilt wheel the Space installs.
11
 
12
+ ## Why a vendored wheel instead of `pip install dvlt`
13
 
14
+ The Space (Gradio SDK + ZeroGPU) can't install this any other way:
15
 
16
+ - a local path dep (`./packages/dvlt/repo`) isn't available when HF runs
17
+ `pip install -r requirements.txt` it installs requirements *before* copying
18
+ the repo;
19
+ - `pip install git+https://huggingface.co/...` fails pip clones with
20
+ `--filter=blob:none`, and HF's git backend can't serve that partial fetch in
21
+ the build sandbox.
22
 
23
+ So the wheel is committed here and installed via the Space's own HTTPS
24
+ `resolve` URL (a plain download — no git, no `sys.path`). See `../../requirements.txt`.
25
 
26
  Upstream code is Apache-2.0; the `nvidia/dvlt` weights are under the NVIDIA
27
+ non-commercial research license (see `repo/LICENSE`, `repo/LICENSES/`,
28
+ `repo/THIRD_PARTY_LICENSES.md`).
packages/dvlt/build.sh ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ # Build the vendored dvlt wheel from repo/ into wheels/.
3
+ #
4
+ # The Space installs dvlt from the resulting wheel via its HTTPS resolve URL
5
+ # (see ../../requirements.txt) — not from git or a local path, both of which
6
+ # fail on Hugging Face's Gradio build (see ../../README.md). Re-run this after
7
+ # editing repo/ and commit the refreshed wheel.
8
+ set -euo pipefail
9
+
10
+ HERE="$(cd "$(dirname "$0")" && pwd)"
11
+ rm -rf "$HERE/wheels"
12
+ mkdir -p "$HERE/wheels"
13
+
14
+ if command -v uv >/dev/null 2>&1; then
15
+ uv build --wheel "$HERE/repo" --out-dir "$HERE/wheels"
16
+ else
17
+ python -m build --wheel --outdir "$HERE/wheels" "$HERE/repo"
18
+ fi
19
+
20
+ # Keep repo/ a pristine copy of upstream — drop in-tree build artifacts.
21
+ rm -rf "$HERE/repo/build" "$HERE/repo"/src/*.egg-info
22
+
23
+ echo "Built:"
24
+ ls -1 "$HERE/wheels"
packages/dvlt/repo/.gitattributes ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # SCM syntax highlighting & preventing 3-way merges
2
+ pixi.lock merge=binary linguist-language=YAML linguist-generated=true
packages/dvlt/repo/.gitignore ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .hydra/
2
+ output/
3
+ ckpt/
4
+ dependency/
5
+ # Byte-compiled / optimized / DLL files
6
+ __pycache__/
7
+ **/__pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+
11
+ # C extensions
12
+ *.so
13
+
14
+ # Distribution / packaging
15
+ .Python
16
+ build/
17
+ develop-eggs/
18
+ dist/
19
+ downloads/
20
+ eggs/
21
+ .eggs/
22
+ lib/
23
+ lib64/
24
+ parts/
25
+ sdist/
26
+ var/
27
+ wheels/
28
+ pip-wheel-metadata/
29
+ share/python-wheels/
30
+ *.egg-info/
31
+ .installed.cfg
32
+ *.egg
33
+ MANIFEST
34
+
35
+ # PyInstaller
36
+ # Usually these files are written by a python script from a template
37
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
38
+ *.manifest
39
+ *.spec
40
+
41
+ # Installer logs
42
+ pip-log.txt
43
+ pip-delete-this-directory.txt
44
+
45
+ # Unit test / coverage reports
46
+ htmlcov/
47
+ .tox/
48
+ .nox/
49
+ .coverage
50
+ .coverage.*
51
+ .cache
52
+ nosetests.xml
53
+ coverage.xml
54
+ *.cover
55
+ *.py,cover
56
+ .hypothesis/
57
+ .pytest_cache/
58
+ cover/
59
+
60
+ # Translations
61
+ *.mo
62
+ *.pot
63
+
64
+ # Django stuff:
65
+ *.log
66
+ local_settings.py
67
+ db.sqlite3
68
+ db.sqlite3-journal
69
+
70
+ # Flask stuff:
71
+ instance/
72
+ .webassets-cache
73
+
74
+ # Scrapy stuff:
75
+ .scrapy
76
+
77
+ # Sphinx documentation
78
+ docs/_build/
79
+
80
+ # PyBuilder
81
+ target/
82
+
83
+ # Jupyter Notebook
84
+ .ipynb_checkpoints
85
+
86
+ # IPython
87
+ profile_default/
88
+ ipython_config.py
89
+
90
+ # pyenv
91
+ .python-version
92
+
93
+ # pipenv
94
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
95
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
96
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
97
+ # install all needed dependencies.
98
+ #Pipfile.lock
99
+
100
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
101
+ __pypackages__/
102
+
103
+ # Celery stuff
104
+ celerybeat-schedule
105
+ celerybeat.pid
106
+
107
+ # SageMath parsed files
108
+ *.sage.py
109
+
110
+ # Environments
111
+ .env
112
+ .venv
113
+ env/
114
+ venv/
115
+ ENV/
116
+ env.bak/
117
+ venv.bak/
118
+
119
+ # Spyder project settings
120
+ .spyderproject
121
+ .spyproject
122
+
123
+ # Rope project settings
124
+ .ropeproject
125
+
126
+ # mkdocs documentation
127
+ /site
128
+
129
+ # mypy
130
+ .mypy_cache/
131
+ .dmypy.json
132
+ dmypy.json
133
+
134
+ # Pyre type checker
135
+ .pyre/
136
+
137
+ # pytype static type analyzer
138
+ .pytype/
139
+
140
+ # Profiling data
141
+ .prof
142
+
143
+ # Folder specific to your needs
144
+ **/tmp/
145
+ **/outputs/skyseg.onnx
146
+ skyseg.onnx
147
+
148
+ # pixi environments
149
+ .pixi
150
+ *.egg-info
151
+
152
+ # Python
153
+ __pycache__/
154
+ *.py[cod]
155
+ *$py.class
156
+ *.so
157
+ .Python
158
+ build/
159
+ develop-eggs/
160
+ dist/
161
+ downloads/
162
+ eggs/
163
+ .eggs/
164
+ lib/
165
+ lib64/
166
+ parts/
167
+ sdist/
168
+ var/
169
+ wheels/
170
+ *.egg-info/
171
+ .installed.cfg
172
+ *.egg
173
+
174
+ # Jupyter Notebook
175
+ .ipynb_checkpoints
176
+
177
+ # Virtual Environment
178
+ venv/
179
+ env/
180
+ ENV/
181
+
182
+ # IDE
183
+ .idea/
184
+ .vscode/
185
+ .cursor/
186
+ .ruff_cache/
187
+ *.swp
188
+ *.swo
189
+
190
+ # DNRM specific
191
+ /datasets/
192
+ outputs/
193
+ third_party/
194
+ visualization/
195
+ checkpoints/
196
+
197
+ # wandb
198
+ wandb/
199
+
200
+ # local configs
201
+ local.yaml
packages/dvlt/repo/.pre-commit-config.yaml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.5.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ - id: check-added-large-files
9
+
10
+ - repo: https://github.com/psf/black
11
+ rev: 25.1.0
12
+ hooks:
13
+ - id: black
14
+ language_version: python3.12
15
+ files: ^(src/|tests/)
16
+
17
+ - repo: https://github.com/astral-sh/ruff-pre-commit
18
+ rev: v0.11.4
19
+ hooks:
20
+ - id: ruff
21
+ args: [--fix, --exit-non-zero-on-fix]
22
+ files: ^(src/|tests/)
23
+
24
+ - repo: local
25
+ hooks:
26
+ - id: pytest-cpu
27
+ name: pytest-cpu-tests
28
+ entry: python tests/run_tests.py -c cpu
29
+ language: system
30
+ pass_filenames: false
31
+ always_run: true
32
+ stages: [pre-commit]
packages/dvlt/repo/CONTRIBUTING.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing to DVLT
2
+
3
+ We appreciate your interest in contributing to DVLT! This document provides
4
+ guidelines and information for contributors.
5
+
6
+ For development setup, code style, testing, and design overview, see
7
+ [docs/CONTRIB.md](docs/CONTRIB.md).
8
+
9
+ ## Signing Your Work
10
+
11
+ We require that all contributors "sign-off" on their commits. This certifies
12
+ that the contribution is your original work, or you have rights to submit it
13
+ under the same license, or a compatible license.
14
+
15
+ Any contribution which contains commits that are not Signed-Off will not be
16
+ accepted.
17
+
18
+ To sign off on a commit you simply use the `--signoff` (or `-s`) option when
19
+ committing your changes:
20
+
21
+ ```bash
22
+ $ git commit -s -m "Add cool feature."
23
+ ```
24
+
25
+ This will append the following to your commit message:
26
+
27
+ ```
28
+ Signed-off-by: Your Name <your@email.com>
29
+ ```
30
+
31
+ ## Full text of the DCO
32
+
33
+ ```
34
+ Developer Certificate of Origin
35
+ Version 1.1
36
+
37
+ Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
38
+
39
+ Everyone is permitted to copy and distribute verbatim copies of this
40
+ license document, but changing it is not allowed.
41
+
42
+
43
+ Developer's Certificate of Origin 1.1
44
+
45
+ By making a contribution to this project, I certify that:
46
+
47
+ (a) The contribution was created in whole or in part by me and I
48
+ have the right to submit it under the open source license
49
+ indicated in the file; or
50
+
51
+ (b) The contribution is based upon previous work that, to the best
52
+ of my knowledge, is covered under an appropriate open source
53
+ license and I have the right under that license to submit that
54
+ work with modifications, whether created in whole or in part
55
+ by me, under the same open source license (unless I am
56
+ permitted to submit under a different license), as indicated
57
+ in the file; or
58
+
59
+ (c) The contribution was provided directly to me by some other
60
+ person who certified (a), (b) or (c) and I have not modified
61
+ it.
62
+
63
+ (d) I understand and agree that this project and the contribution
64
+ are public and that a record of the contribution (including all
65
+ personal information I submit with it, including my sign-off) is
66
+ maintained indefinitely and may be redistributed consistent with
67
+ this project or the open source license(s) involved.
68
+ ```
packages/dvlt/{LICENSE → repo/LICENSE} RENAMED
File without changes
packages/dvlt/{LICENSES → repo/LICENSES}/NVIDIA-LICENSE.txt RENAMED
File without changes
packages/dvlt/{LICENSES → repo/LICENSES}/VGGT-LICENSE.txt RENAMED
File without changes
packages/dvlt/repo/README.md ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div align="center">
2
+ <h1>Déjà View: Looping Transformers for Multi-View 3D Reconstruction</h1>
3
+
4
+ <a href="https://research.nvidia.com/labs/dvl/projects/dvlt/"><img src="https://img.shields.io/badge/Project-Page-1f72b1.svg" alt="Project Page"></a>
5
+ <a href="https://arxiv.org/abs/2605.30215"><img src="https://img.shields.io/badge/arXiv-2605.30215-b31b1b.svg" alt="arXiv"></a>
6
+ <a href="https://huggingface.co/nvidia/dvlt"><img src="https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Model-yellow" alt="Hugging Face"></a>
7
+
8
+ **[NVIDIA](https://www.nvidia.com/)** &nbsp;&nbsp;&nbsp; **[University of Modena and Reggio Emilia](https://www.unimore.it/it)** &nbsp;&nbsp;&nbsp; **[University of Toronto](https://www.utoronto.ca/)** &nbsp;&nbsp;&nbsp; **[ETH Zurich](https://ethz.ch/)**
9
+
10
+ [Alessandro Burzio*](https://research.nvidia.com/labs/dvl/author/alessandro-burzio/), [Tobias Fischer*](https://tobiasfshr.github.io/), [Sven Elflein](https://selflein.github.io/), [Qunjie Zhou](https://research.nvidia.com/labs/dvl/author/qunjie-zhou/), [Riccardo de Lutio](https://riccardodelutio.github.io/), [Jiawei Ren](https://jiawei-ren.github.io/), [Jiahui Huang](https://huangjh-pub.github.io/), [Shengyu Huang](https://shengyuh.github.io/), [Marc Pollefeys](https://people.inf.ethz.ch/marc.pollefeys/), [Laura Leal-Taixé](https://research.nvidia.com/labs/dvl/author/laura-leal-taixe/), [Zan Gojcic+](https://zgojcic.github.io/), [Haithem Turki+](https://haithemturki.com/)
11
+ </div>
12
+
13
+ <p align="center">
14
+ <img src="assets/nvidia-hq-dvlt.gif" alt="Déjà View demo" width="100%">
15
+ </p>
16
+
17
+ ## Overview
18
+
19
+ DéjàView (DVLT) is a recurrent transformer for multi-view 3D reconstruction. It
20
+ loops a shared block of frame/global attention with discrete depth indexing,
21
+ producing per-pixel rays, depth, confidence, and camera poses from an unordered
22
+ set of images. Trained once, the number of refinement steps `K` becomes an
23
+ inference-time compute knob, matching or outperforming substantially larger
24
+ feed-forward baselines at a fraction of their parameters.
25
+
26
+ This repository contains:
27
+
28
+ - The DVLT model + four configurable ablations (vanilla, decoupled blocks,
29
+ no `s_out` token, no depth-scaling).
30
+ - Evaluation wrappers for five baselines: VGGT, VGGT-Omega, Depth-Anything-3,
31
+ MapAnything, and Pi3. Each wrapper imports the upstream package (installed
32
+ separately — see [INSTALL.md](docs/INSTALL.md)).
33
+ - A training stack built on `accelerate` + Hydra, with optional W&B logging.
34
+ - A Stage-2 fine-tune recipe for the depth-conv head.
35
+ - Rerun-based visualization tools.
36
+
37
+ ## Release status
38
+
39
+ - [x] Inference code
40
+ - [x] Model weights
41
+ - [x] Evaluation code
42
+ - [x] eval datasets preprocess and loaders
43
+ - [x] Training code
44
+ - [x] ScanNet++ training dataset loader
45
+ - [ ] other training dataset loaders
46
+
47
+ ## Quickstart
48
+
49
+ ### Install
50
+
51
+ See [docs/INSTALL.md](docs/INSTALL.md). The short version:
52
+
53
+ ```bash
54
+ conda create -n dvlt python=3.12 && conda activate dvlt
55
+ conda install pytorch=2.5.1 torchvision pytorch-cuda=12.4 -c pytorch -c nvidia -c conda-forge
56
+ pip install -e .[all]
57
+ ```
58
+
59
+ ### Quick setup
60
+
61
+ Quick example script:
62
+
63
+ ```python
64
+ import torch
65
+ from accelerate import Accelerator
66
+
67
+ from dvlt.model.dvlt.model import DVLT
68
+ from dvlt.util.preprocess import load_sequence, preprocess_images
69
+
70
+ checkpoint_path = "nvidia/dvlt" # local dir, HTTPS URL, or HF Hub repo id
71
+ # load_sequence accepts a directory, a single video, or an explicit list of files.
72
+ input_path = "path/to/scene_dir"
73
+ # Or: input_path = "path/to/clip.mp4"
74
+ # Or: from glob import glob; input_path = sorted(glob("path/to/scene_dir/*.png"))
75
+
76
+ accelerator = Accelerator(mixed_precision="bf16")
77
+
78
+ model = DVLT(img_size=504)
79
+ model.load_pretrained(checkpoint_path, strict=True)
80
+ model.setup_test(accelerator)
81
+
82
+ _, frames = load_sequence(input_path)
83
+ batch = preprocess_images(frames, img_size=504, patch_size=14, device=accelerator.device)
84
+
85
+ with torch.no_grad(), accelerator.autocast():
86
+ predictions = model.predict(batch, accelerator)
87
+
88
+ cameras = predictions["cameras"][0] # Cameras object with shape [S]
89
+ extrinsics_c2w = cameras.camera_to_worlds # (S, 3, 4) — OpenCV convention [R | t]
90
+ intrinsics = cameras.get_intrinsics_matrices() # (S, 3, 3)
91
+
92
+ depths = predictions["depths"][0] # (S, H, W)
93
+ world_points = predictions["world_points"][0] # (S, H, W, 3)
94
+ ```
95
+
96
+ ### Train
97
+
98
+ ```bash
99
+ # Single-GPU
100
+ python -m dvlt.scripts.train --config-name dvlt-large data=scannetpp
101
+
102
+ # Multi-GPU (4 GPUs)
103
+ accelerate launch --num-processes 4 -m dvlt.scripts.train --config-name dvlt-large data=scannetpp
104
+
105
+ # Resume
106
+ python -m dvlt.scripts.train \
107
+ --config-dir=outputs/<run> \
108
+ --config-name=config.yaml \
109
+ trainer.resume_from_checkpoint=latest
110
+ ```
111
+
112
+ ### Evaluate
113
+
114
+ `benchmark_lite` (DTU, ETH3D, 7Scenes) is a convenience benchmark over the
115
+ datasets that don't require heavy preprocessing; the full `benchmark` adds
116
+ [ScanNet++](src/dvlt/scripts/preprocess/preprocess_scannetpp.md) and
117
+ [NuScenes](src/dvlt/scripts/preprocess/preprocess_nuscenes.md).
118
+
119
+ ```bash
120
+ python -m dvlt.scripts.test --config-name dvlt data=benchmark
121
+ # multi-GPU: accelerate launch --num-processes <N> -m dvlt.scripts.test --config-name dvlt data=benchmark
122
+ python -m dvlt.scripts.test --config-name dvlt data=benchmark_lite
123
+ # multi-GPU: accelerate launch --num-processes <N> -m dvlt.scripts.test --config-name dvlt data=benchmark_lite
124
+ ```
125
+
126
+ DVLT reference results on the full `benchmark`:
127
+
128
+ | Dataset | Pose AUC@3 | Pose AUC@30 | Depth inlier@3% | Depth AbsRel |
129
+ |---|---|---|---|---|
130
+ | DTU | 0.8319 | 0.9880 | 0.9706 | 0.0093 |
131
+ | ETH3D | 0.6604 | 0.9536 | 0.7717 | 0.0267 |
132
+ | 7Scenes | 0.1393 | 0.8172 | 0.7437 | 0.0349 |
133
+ | ScanNet++ | 0.7941 | 0.9803 | 0.9239 | 0.0167 |
134
+ | NuScenes | 0.4340 | 0.8534 | 0.5853 | 0.0673 |
135
+
136
+
137
+ ### Interactive demo
138
+
139
+ Browser UI for uploading images / video and exploring the predicted 3D point
140
+ cloud, depth maps and camera trajectory. The dropdown switches between DVLT
141
+ and the baseline wrappers (VGGT, VGGT-Omega, DA3, Pi3, MapAnything);
142
+ each baseline requires its upstream package installed (see
143
+ [docs/INSTALL.md](docs/INSTALL.md)).
144
+
145
+ ```bash
146
+ # Launch on http://localhost:7860 (DVLT preselected)
147
+ python -m dvlt.scripts.gradio_demo
148
+ ```
149
+
150
+ The same script also has a headless **offline mode** that skips Gradio
151
+ and writes a `.glb` + `.rrd` per (sequence, model) under
152
+ `demo_outputs/<sequence_name>/`. `--input` accepts a directory of images, a
153
+ single image, or a video file (mp4/mov/gif/...), and may be repeated to
154
+ process multiple sequences in one go; `--models` is a comma-separated list of
155
+ config names from the curated registry (or `all`).
156
+
157
+ ```bash
158
+ # Run two models on two sequences (one image dir, one video)
159
+ python -m dvlt.scripts.gradio_demo --offline \
160
+ --input /path/to/scene_dir \
161
+ --input /path/to/clip.mp4 \
162
+ --models dvlt
163
+
164
+ # Run every registered model on one sequence
165
+ python -m dvlt.scripts.gradio_demo --offline --input /path/to/scene_dir --models all
166
+ ```
167
+
168
+ ## Configuration
169
+
170
+ DVLT uses [Hydra](https://hydra.cc) for configuration. Top-level experiment
171
+ configs live in `src/dvlt/config/experiments/`:
172
+
173
+ | Config | Description |
174
+ |---|---|
175
+ | `dvlt-large` | Stage-1 recipe (large model, full training schedule, linear depth head). |
176
+ | `dvlt-large-ablation` | Vanilla ablation parent — toggle decoupled blocks, no-`s_out`, no-depthscale via overrides. |
177
+ | `dvlt-large-ablation-decoupled` | Fully decoupled blocks (`recurrence_mode=none`, no looping): a distinct block per step, fixed 16 steps. |
178
+ | `dvlt-large-depthconv-stage2` | Stage-2 depth-conv head fine-tune (matches the released checkpoint and the model's default `depth_head_type="conv"`). |
179
+ | `dvlt` | Inference-only alias for the released stage-2 checkpoint. |
180
+ | `vggt`, `vggt_omega`, `da3-{base,large,giant}`, `pi3`, `pi3x`, `mapanything` | Eval-only baseline wrappers. Require the upstream package installed (see [INSTALL.md](docs/INSTALL.md)). |
181
+
182
+ ### User configuration (data paths)
183
+
184
+ Per-user settings (most importantly, the dataset root) live in
185
+ `src/dvlt/config/experiments/user/`. Copy `default.yaml` to `local.yaml`,
186
+ edit `data_root`, and select it via `user=local`:
187
+
188
+ ```bash
189
+ python -m dvlt.scripts.train --config-name dvlt-large data=scannetpp user=local
190
+ ```
191
+
192
+ `user.data_root` can also be overridden inline or via the `DVLT_DATA_ROOT`
193
+ environment variable.
194
+
195
+ ### Selecting datasets
196
+
197
+ Pick a single curated dataset config:
198
+
199
+ ```bash
200
+ python -m dvlt.scripts.train --config-name dvlt-large data=scannetpp
201
+ python -m dvlt.scripts.train --config-name dvlt-large data=mixed_all
202
+ ```
203
+
204
+ ## Tab completion
205
+
206
+ For scripts using the `@cli` decorator (train, test, visualize):
207
+
208
+ ```bash
209
+ eval "$(python -m dvlt.scripts.train -sc install)"
210
+ # later, to remove:
211
+ eval "$(python -m dvlt.scripts.train -sc uninstall)"
212
+ ```
213
+
214
+ ## Documentation
215
+
216
+ - [docs/INSTALL.md](docs/INSTALL.md) — environment setup + baseline installs
217
+ - [docs/data/DATA.md](docs/data/DATA.md) — data pipeline overview + how to
218
+ add a new dataset parser
219
+ - [docs/CONTRIB.md](docs/CONTRIB.md) — dev setup, code style, tests
220
+ - [docs/TESTING.md](docs/TESTING.md) — full test-runner documentation
221
+
222
+ ## Acknowledgments
223
+
224
+ We are also grateful to several other open-source repositories that we drew inspiration from or built upon during the development of our pipeline:
225
+ - [VGGT](https://github.com/facebookresearch/vggt)
226
+ - [Pi3](https://github.com/yyfz/Pi3)
227
+ - [CUT3R](https://github.com/CUT3R/CUT3R)
228
+ - [MapAnything](https://github.com/facebookresearch/map-anything)
229
+ - [Depth-Anything-3](https://github.com/bytedance-seed/depth-anything-3)
230
+
231
+ ## Citation
232
+
233
+ If you find this work useful, please cite:
234
+
235
+ ```bibtex
236
+ @article{burzio2026dejaview,
237
+ title = {D\'ej\`a View: Looping Transformers for Multi-View 3D Reconstruction},
238
+ author = {Burzio, Alessandro and Fischer, Tobias and Elflein, Sven and Zhou, Qunjie and de Lutio, Riccardo and Ren, Jiawei and Huang, Jiahui and Huang, Shengyu and Pollefeys, Marc and Leal-Taix{\'e}, Laura and Gojcic, Zan and Turki, Haithem},
239
+ journal = {arXiv preprint arXiv:2605.30215},
240
+ year = {2026}
241
+ }
242
+ ```
243
+
244
+ ## License + attribution
245
+
246
+ The DVLT **code** is released under the **Apache License, Version 2.0** — see
247
+ [LICENSE](LICENSE). The **model weights** (the `nvidia/dvlt` checkpoint) are
248
+ released under the **NVIDIA License** — non-commercial, research-and-evaluation
249
+ use only; see [LICENSES/NVIDIA-LICENSE.txt](LICENSES/NVIDIA-LICENSE.txt).
250
+
251
+ Portions of the codebase are adapted from third-party open-source projects
252
+ (DINOv2, PyTorch3D, MoGe, AnyCalib, MultiNeRF, Depth-Anything-3, VGGT). Each
253
+ adapted file carries the upstream copyright + license notice in its header;
254
+ see [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) for the full attribution
255
+ map and full upstream license texts. The VGGT-derived files are distributed
256
+ under the VGGT License; see [LICENSES/VGGT-LICENSE.txt](LICENSES/VGGT-LICENSE.txt).
257
+
258
+ The baseline evaluation wrappers in `src/dvlt/model/{vggt,vggt_omega,da3,mapanything,pi3}/`
259
+ import (do not vendor) their respective upstream packages, each of which is
260
+ governed by its own license — see
261
+ [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) §"Upstream packages used
262
+ for evaluation".
packages/dvlt/{THIRD_PARTY_LICENSES.md → repo/THIRD_PARTY_LICENSES.md} RENAMED
File without changes
packages/dvlt/repo/assets/nvidia-hq-dvlt.gif ADDED

Git LFS Details

  • SHA256: f8c6586e158bcb682c86a9a22aff2ca53cf2546587a6a22eefec134fc0efd3f0
  • Pointer size: 133 Bytes
  • Size of remote file: 13.4 MB
packages/dvlt/repo/docs/CONTRIB.md ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contribution guidelines
2
+
3
+ If you contribute to the codebase, please follow these steps
4
+
5
+
6
+ ## Development Setup
7
+
8
+ If you're contributing to the codebase, we recommend installing the development dependencies and setting up pre-commit hooks:
9
+
10
+ ```bash
11
+ # Install development dependencies
12
+ pip install -e .[dev]
13
+
14
+ # Install pre-commit hooks
15
+ pip install pre-commit
16
+ pre-commit install
17
+ ```
18
+
19
+ ### Code Style
20
+
21
+ This project uses:
22
+ - Black for code formatting
23
+ - Ruff for linting and import sorting
24
+ - Google-style docstrings
25
+
26
+ You can manually run the formatters:
27
+ ```bash
28
+ # Format code with Black
29
+ black src tests
30
+
31
+ # Run Ruff linter and auto-fix Ruff violations where possible
32
+ ruff check --fix src tests
33
+ ```
34
+
35
+ ### Running Tests
36
+
37
+ The project has a comprehensive test suite with smart hardware detection. For quick development feedback:
38
+
39
+ ```bash
40
+ # Fast CPU-only tests (recommended for development)
41
+ python tests/run_tests.py --category cpu
42
+
43
+ # All tests appropriate for your hardware
44
+ python tests/run_tests.py
45
+
46
+ # Run specific test categories
47
+ python tests/run_tests.py --category cpu # CPU-only tests (fast, no GPU required)
48
+ python tests/run_tests.py --category gpu # GPU tests (single GPU, not integration)
49
+ python tests/run_tests.py --category integration # Integration tests (requires GPU for performance)
50
+ python tests/run_tests.py --category distributed # Distributed tests (requires accelerate launch)
51
+ python tests/run_tests.py --category slow # Slow/comprehensive tests
52
+
53
+ # List all available test categories
54
+ python tests/run_tests.py --list
55
+ ```
56
+
57
+ For direct pytest usage:
58
+ ```bash
59
+ # Run all tests (NOTE: Cannot run distributed tests)
60
+ pytest
61
+
62
+ # Run specific test file
63
+ pytest tests/path/to/test_file.py
64
+ ```
65
+
66
+ See [docs/TESTING.md](TESTING.md) for comprehensive testing documentation.
67
+
68
+ The pre-commit hooks automatically run fast tests before each commit to ensure code quality.
69
+
70
+ ## Sanity Check Mode
71
+
72
+ For quick development testing of training functionality, use the built-in sanity check mode (with your desired config):
73
+
74
+ ```bash
75
+ # Instead of long training runs for testing
76
+ python -m dvlt.scripts.train --config-name dvlt-large.yaml trainer.sanity_check=True
77
+ ```
78
+
79
+ This mode:
80
+ - **Tests all key functions**: train_step, test_step, log_train, log_test, model saving
81
+ - **Uses temporary directories**: No persistent output clutter
82
+ - **Mock loggers**: Prints logged keys/types instead of creating wandb runs
83
+ - **Fast execution**: Runs 11 training steps + 2 validation batches (~1-2 minutes)
84
+ - **Auto cleanup**: Removes temporary files when complete
85
+
86
+ Automatically overrides settings to:
87
+ - `max_train_steps=11`, `validation_steps=11`, `validation_batches=2`
88
+ - `log_every_n_steps=1`
89
+
90
+
91
+ ## Design
92
+
93
+ Check [DATA.md](docs/data/DATA.md) for an overview of the data pipeline flow. We explain there:
94
+
95
+ - How to add new parsers for arbitrary new datasets
96
+ - How to maintain and extend the data preprocessing code
97
+ - What batch format the model will be fed during training and evaluation
packages/dvlt/repo/docs/INSTALL.md ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Installation
2
+
3
+ Tested with **Python 3.11**, **PyTorch 2.5.1**, and **CUDA 12.4** on Linux.
4
+
5
+ ```bash
6
+ conda create -n dvlt python=3.11 && conda activate dvlt
7
+ conda install pytorch=2.5.1 torchvision pytorch-cuda=12.4 -c pytorch -c nvidia -c conda-forge
8
+
9
+ git clone <YOUR-DVLT-REMOTE>.git dvlt && cd dvlt
10
+ pip install -e .[all]
11
+ ```
12
+
13
+ Extras (pick what you need): `pip install -e .[demos|dev|all]`
14
+
15
+ - `demos` — Gradio demos (`gradio`, `onnxruntime-gpu`, `trimesh`)
16
+ - `dev` — `black`, `ruff`, `pre-commit`, `pytest`
17
+ - `all` — both
18
+
19
+ ## Baselines (optional)
20
+
21
+ The baseline wrappers in `src/dvlt/model/{vggt,vggt_omega,da3,mapanything,pi3}/`
22
+ import the upstream packages at runtime. Install only the ones you plan to
23
+ evaluate:
24
+
25
+ ```bash
26
+ # VGGT — code: commercial-use-friendly; checkpoints: original
27
+ # is non-commercial, VGGT-1B-Commercial allows commercial use. See upstream LICENSE.
28
+ pip install git+https://github.com/facebookresearch/vggt.git --no-deps
29
+
30
+ # VGGT-Omega — FAIR Noncommercial Research License (non-commercial / research-only;
31
+ # applies to both code and checkpoints). See upstream LICENSE.
32
+ pip install git+https://github.com/facebookresearch/vggt-omega.git --no-deps
33
+
34
+ # Depth-Anything-3 — Apache-2.0
35
+ pip install git+https://github.com/ByteDance-Seed/Depth-Anything-3.git --no-deps
36
+
37
+ # MapAnything — Apache-2.0
38
+ pip install git+https://github.com/facebookresearch/map-anything.git --no-deps
39
+ pip install uniception==0.1.6
40
+
41
+ # Pi3 / Pi3X — BSD-3-Clause (clone into third_party/Pi3 first)
42
+ git clone https://github.com/<pi3-upstream>/Pi3.git third_party/Pi3
43
+ pip install -e third_party/Pi3 --no-deps
44
+ ```
45
+
46
+ See [THIRD_PARTY_LICENSES.md](../THIRD_PARTY_LICENSES.md) §"Upstream packages
47
+ used for evaluation" for license details — verify each upstream's terms suit
48
+ your use case before installing.
49
+
50
+ ## Data backend (`dataverse`)
51
+
52
+ DVLT's dataset parsers depend on the `dataverse` package.
53
+
54
+ ```bash
55
+ git clone <YOUR-DATAVERSE-REMOTE>.git third_party/dataverse
56
+ pip install -e third_party/dataverse
57
+ ```
58
+
59
+ Some datasets need extra dependencies — install the matching extras as needed,
60
+ for example:
61
+
62
+ ```bash
63
+ pip install -e 'third_party/dataverse[kubric]'
64
+ ```
65
+
66
+ The Gradio demos and `dvlt.scripts.visualize` work without `dataverse`; the
67
+ full training stack does not.
68
+
69
+ ## Sanity check
70
+
71
+ ```bash
72
+ python -c "import dvlt; print('dvlt OK')"
73
+ pytest -q tests/data/datasets/
74
+ ```
packages/dvlt/repo/docs/TESTING.md ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Testing Guide
2
+
3
+ ## 🚀 Quick Start
4
+
5
+ ```bash
6
+ # Run all appropriate tests for your hardware (default)
7
+ python tests/run_tests.py
8
+
9
+ # Run specific categories
10
+ python tests/run_tests.py -c cpu # CPU tests only
11
+ python tests/run_tests.py -c gpu # GPU tests (requires CUDA)
12
+ python tests/run_tests.py -c integration # Integration tests (requires GPU)
13
+ python tests/run_tests.py -c distributed # Distributed tests (requires multiple GPUs)
14
+
15
+ # See all available categories
16
+ python tests/run_tests.py --list
17
+ ```
18
+
19
+ ## 📋 Test Categories
20
+
21
+ The system uses **explicit pytest markers** to categorize tests:
22
+
23
+ ### Available Categories
24
+
25
+ | Category | Command | Marker Required | Hardware | Description |
26
+ |----------|---------|----------------|----------|-------------|
27
+ | **cpu** | `pytest tests/ -m "not gpu and not distributed and not slow and not integration"` | None | Any CPU | Fast CPU-only tests |
28
+ | **gpu** | `pytest tests/ -m "gpu and not distributed and not integration"` | `@pytest.mark.gpu` | NVIDIA GPU | GPU tests (excluding integration) |
29
+ | **integration** | `pytest tests/ -m "integration and not distributed"` | `@pytest.mark.integration` | NVIDIA GPU | End-to-end tests |
30
+ | **slow** | `pytest tests/ -m "slow"` | `@pytest.mark.slow` | Varies | Time-intensive tests |
31
+ | **distributed** | `accelerate launch --num_processes 2 -m pytest tests/ -m "distributed"` | `@pytest.mark.distributed` | 2+ GPUs | Multi-GPU tests |
32
+
33
+ ### Default Behavior (Intelligent Hardware Detection)
34
+
35
+ When no category is specified, the system automatically runs appropriate tests:
36
+ - **CPU only**: Runs CPU tests
37
+ - **Single GPU**: Runs CPU + GPU + Integration tests
38
+ - **Multiple GPUs**: Runs All tests including Distributed
39
+
40
+ ## 🎯 Test Markers
41
+
42
+ ### Required Markers for Non-CPU Tests
43
+
44
+ ```python
45
+ # CPU test (no marker needed - default)
46
+ def test_utility_function():
47
+ """Fast CPU-only test."""
48
+ pass
49
+
50
+ # GPU test
51
+ @pytest.mark.gpu
52
+ def test_device_computation():
53
+ """Test requiring GPU acceleration."""
54
+ pass
55
+
56
+ # Integration test (requires GPU for performance)
57
+ @pytest.mark.integration
58
+ def test_training_pipeline():
59
+ """End-to-end integration test."""
60
+ pass
61
+
62
+ # Distributed test
63
+ @pytest.mark.distributed
64
+ def test_multi_process_sync():
65
+ """Test requiring multiple GPUs with accelerate launch."""
66
+ pass
67
+
68
+ # Slow test
69
+ @pytest.mark.slow
70
+ def test_comprehensive_scenario():
71
+ """Time-intensive comprehensive test."""
72
+ pass
73
+ ```
74
+
75
+ ## 🚀 Development Workflow
76
+
77
+ **Recommended testing order:**
78
+ 1. **Development**: `python tests/run_tests.py -c cpu` (fast feedback)
79
+ 2. **Feature Testing**: `python tests/run_tests.py -c gpu` (when GPU available)
80
+ 3. **Integration**: `python tests/run_tests.py -c integration` (end-to-end validation)
81
+ 4. **Full Testing**: `python tests/run_tests.py` (all appropriate tests)
82
+
83
+ ## 📝 Adding New Tests
84
+
85
+ **Choose appropriate marker:**
86
+ - No marker = CPU test (default)
87
+ - `@pytest.mark.gpu` = GPU required
88
+ - `@pytest.mark.integration` = End-to-end test (GPU needed for performance)
89
+ - `@pytest.mark.distributed` = Multi-GPU test
90
+ - `@pytest.mark.slow` = Time-intensive test
91
+
92
+ **Verify categorization:**
93
+ ```bash
94
+ # Test your specific function
95
+ pytest tests/path/to/test_file.py::test_function_name -v
96
+
97
+ # Run the expected category
98
+ python tests/run_tests.py -c [expected_category]
99
+ ```
100
+
101
+ ## 📊 Example Test Structure
102
+
103
+ ```python
104
+ import pytest
105
+ import torch
106
+ from src.dvlt.model.base import BaseModel
107
+
108
+ # CPU test (no marker)
109
+ def test_model_initialization():
110
+ model = BaseModel()
111
+ assert model is not None
112
+
113
+ # GPU test
114
+ @pytest.mark.gpu
115
+ def test_model_cuda_operations():
116
+ if not torch.cuda.is_available():
117
+ pytest.skip("CUDA not available")
118
+ model = BaseModel().cuda()
119
+ x = torch.randn(1, 3, 224, 224).cuda()
120
+ output = model(x)
121
+ assert output.device.type == 'cuda'
122
+
123
+ # Integration test
124
+ @pytest.mark.integration
125
+ def test_training_integration():
126
+ # ... comprehensive training test
127
+ pass
128
+
129
+ # Distributed test
130
+ @pytest.mark.distributed
131
+ def test_multi_gpu_training():
132
+ # ... distributed training test
133
+ pass
134
+ ```
packages/dvlt/repo/docs/data/DATA.md ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dataset Preparation
2
+
3
+ All dataset paths are resolved from a single config variable, `user.data_root`.
4
+ It defaults to `<project root>/datasets`, and can be overridden with the CLI
5
+ flag `user.data_root=/path/to/data`. The per-dataset configs under
6
+ [`src/dvlt/config/experiments/data/`](../../src/dvlt/config/experiments/data/)
7
+ read from `${user.data_root}/{train,test}/<dataset>`.
8
+
9
+ Supported datasets and per-dataset preparation:
10
+
11
+ | Dataset | Use | Preparation | Config |
12
+ |---|---|---|---|
13
+ | DTU | eval | download only (Spann3R mvsnet, see below) | [`dtu.yaml`](../../src/dvlt/config/experiments/data/test_datasets/dtu.yaml) |
14
+ | ETH3D | eval | [`preprocess_eth3d.md`](../../src/dvlt/scripts/preprocess/preprocess_eth3d.md) | [`eth3d.yaml`](../../src/dvlt/config/experiments/data/test_datasets/eth3d.yaml) |
15
+ | 7Scenes | eval | [`preprocess_7scenes.md`](../../src/dvlt/scripts/preprocess/preprocess_7scenes.md) | [`sevenscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/sevenscenes.yaml) |
16
+ | NuScenes | eval | [`preprocess_nuscenes.md`](../../src/dvlt/scripts/preprocess/preprocess_nuscenes.md) | [`nuscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/nuscenes.yaml) |
17
+ | ScanNet++ | train + eval | [`preprocess_scannetpp.md`](../../src/dvlt/scripts/preprocess/preprocess_scannetpp.md) | [`scannetpp.yaml`](../../src/dvlt/config/experiments/data/test_datasets/scannetpp.yaml) |
18
+
19
+ Preprocessing scripts live under
20
+ [`src/dvlt/scripts/preprocess/`](../../src/dvlt/scripts/preprocess/) and are run
21
+ as modules, e.g. `python -m dvlt.scripts.preprocess.<dataset>.<script>`. See the
22
+ per-dataset docs above for download + preprocessing details.
23
+
24
+ ---
25
+
26
+ ## DTU (evaluation, download only)
27
+
28
+ Follow Spann3R for DTU download (mvsnet preprocessed):
29
+ <https://github.com/HengyiWang/spann3r/blob/main/docs/data_preprocess.md#dtu>
30
+
31
+ Expected layout, one directory per scan, placed under `${user.data_root}/test/dtu`:
32
+
33
+ ```text
34
+ test/dtu/
35
+ └── scanN/
36
+ ├── images/{00000000.jpg, 00000001.jpg, ...}
37
+ ├── cams/{00000000_cam.txt, ...} # MVSnet camera format (world-to-camera)
38
+ ├── depths/{00000000.npy, ...} # depth in millimetres
39
+ └── binary_masks/{00000000.png, ...} # foreground masks
40
+ ```
41
+
42
+ Consumed by [`test_datasets/dtu.yaml`](../../src/dvlt/config/experiments/data/test_datasets/dtu.yaml)
43
+ (`DTU`).
44
+
45
+ ---
46
+
47
+ ## ETH3D (evaluation)
48
+
49
+ High-resolution multi-view benchmark. Download the undistorted DSLR images +
50
+ calibration and the GT depth, then undistort the distorted GT depth onto the
51
+ pinhole cameras. Lands under `${user.data_root}/test/eth3d`.
52
+
53
+ See [`preprocess_eth3d.md`](../../src/dvlt/scripts/preprocess/preprocess_eth3d.md)
54
+ for download + preprocessing. Consumed by
55
+ [`test_datasets/eth3d.yaml`](../../src/dvlt/config/experiments/data/test_datasets/eth3d.yaml).
56
+
57
+ ---
58
+
59
+ ## 7Scenes (evaluation)
60
+
61
+ Microsoft 7-Scenes RGB-D (640×480). Download the seven scenes and generate the
62
+ projected pseudo-GT depth (via SimpleRecon). Lands under
63
+ `${user.data_root}/test/sevenscenes`. Intrinsics are fixed (focal 525, principal
64
+ point at image centre).
65
+
66
+ See [`preprocess_7scenes.md`](../../src/dvlt/scripts/preprocess/preprocess_7scenes.md)
67
+ for download + preprocessing. Consumed by
68
+ [`test_datasets/sevenscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/sevenscenes.yaml).
69
+
70
+ ---
71
+
72
+ ## NuScenes (evaluation)
73
+
74
+ Autonomous-driving dataset. Download **v1.0-trainval** (contains the 50 eval
75
+ scenes) and convert to one `scene.h5` per scene (CAM_FRONT images, sparse LiDAR
76
+ depth, camera extrinsics + intrinsics). Lands under
77
+ `${user.data_root}/test/nuscenes/trainval/<scene>/scene.h5`.
78
+
79
+ See [`preprocess_nuscenes.md`](../../src/dvlt/scripts/preprocess/preprocess_nuscenes.md)
80
+ for download + preprocessing. Consumed by
81
+ [`test_datasets/nuscenes.yaml`](../../src/dvlt/config/experiments/data/test_datasets/nuscenes.yaml).
82
+
83
+ ---
84
+
85
+ ## ScanNet++ (training + evaluation)
86
+
87
+ Indoor DSLR captures. Render per-frame metric depth from the aligned GT mesh and
88
+ rectify the fisheye images/depth to a pinhole model. The train split
89
+ (`nvs_sem_train`) lands under `${user.data_root}/train/scannetpp`, the eval split
90
+ (`nvs_sem_val`) under `${user.data_root}/test/scannetpp`.
91
+
92
+ See [`preprocess_scannetpp.md`](../../src/dvlt/scripts/preprocess/preprocess_scannetpp.md)
93
+ for download + preprocessing. Consumed by
94
+ [`train_datasets/scannetpp.yaml`](../../src/dvlt/config/experiments/data/train_datasets/scannetpp.yaml)
95
+ and
96
+ [`test_datasets/scannetpp.yaml`](../../src/dvlt/config/experiments/data/test_datasets/scannetpp.yaml).
97
+
98
+ ---
99
+
100
+ ## Training datasets
101
+
102
+ Only **ScanNet++** is included as a runnable training dataset in this release.
103
+ The other training-dataset configs under
104
+ [`train_datasets/`](../../src/dvlt/config/experiments/data/train_datasets/) are
105
+ kept so that the per-dataset frame/view-sampling configuration stays visible
106
+ (`view_ranking`, `view_sampling`, `window_size_ratio`, `max_depth_thresh`,
107
+ etc.), but their loaders and preprocess scripts are WIP.
108
+
109
+ ---
110
+
111
+ ## Data pipeline (overview)
112
+
113
+ Parsers convert dataset-specific formats into a unified representation in three
114
+ stages:
115
+
116
+ 1. **Parse + per-frame preprocess** - `TrainDataset.get_data()` (training) or
117
+ `EvalDataset.__getitem__()` (eval): sample frames, read raw data, then
118
+ resize/crop each frame and update intrinsics/depth/world-points accordingly.
119
+ Output: per-frame numpy arrays.
120
+ 2. **Sequence-level processing** - `MultiSourceDataset._build_sample()`: color
121
+ augmentations (training), scene normalization (centre + scale factor), and
122
+ conversion to PyTorch tensors.
123
+ 3. **Batch assembly** - `default_collate_fn()`: stack samples into a batch with
124
+ field-specific padding.
125
+
126
+ The batched sample the model consumes (keys are `DataField`s):
127
+
128
+ ```python
129
+ {
130
+ DataField.IMAGES: torch.Tensor, # [B, S, C, H, W], float32, [0,1]
131
+ DataField.DEPTHS: torch.Tensor, # [B, S, H, W], float32
132
+ DataField.EXTRINSICS_C2W:torch.Tensor, # [B, S, 4, 4], float32 (normalized)
133
+ DataField.INTRINSICS: torch.Tensor, # [B, S, 3, 3], float32
134
+ DataField.WORLD_POINTS: torch.Tensor, # [B, S, H, W, 3], float32 (normalized)
135
+ DataField.POINT_MASKS: torch.Tensor, # [B, S, H, W], bool
136
+ DataField.SCALE_FACTOR: torch.Tensor, # [B], float32
137
+ }
138
+ ```
packages/dvlt/{pyproject.toml → repo/pyproject.toml} RENAMED
@@ -3,7 +3,7 @@ name = "dvlt"
3
  version = "0.0.1"
4
  description = "Déjà View: Looping Transformers for Multi-View 3D Reconstruction"
5
  readme = "README.md"
6
- requires-python = ">= 3.10"
7
  license = { file = "LICENSE" }
8
  authors = [
9
  {name = "Tobias Fischer", email = "tobiasfischer623@gmail.com"},
@@ -24,17 +24,17 @@ dependencies = [
24
  # core
25
  "accelerate==1.8.1",
26
  "h5py==3.16.0",
27
- "huggingface-hub>=0.30", # EDIT: was ==1.16.4 — relaxed so it co-resolves with gradio/spaces on the Space
28
  "hydra-core==1.3.2",
29
  "numpy==2.4.4",
30
  "omegaconf==2.3.0",
31
  "opencv-python==4.11.0.86",
32
  "Pillow==11.2.1",
33
- "pydantic==2.12.4",
34
  "safetensors==0.5.3",
35
  "scipy==1.16.0",
36
- "torch>=2.5", # EDIT: was ==2.5.1 — ZeroGPU (Blackwell) ships torch>=2.8
37
- "torchvision>=0.20", # EDIT: was ==0.20.1 — must track the installed torch
38
  "tqdm==4.67.1",
39
  # logging + console
40
  "rich==14.3.3",
@@ -50,6 +50,7 @@ dependencies = [
50
 
51
  [project.optional-dependencies]
52
  demos = [
 
53
  "gradio==6.1.0",
54
  "onnxruntime-gpu==1.25.0",
55
  "requests==2.32.4",
@@ -63,10 +64,104 @@ dev = [
63
  ]
64
  all = ["dvlt[demos,dev]"]
65
 
 
 
66
  [build-system]
67
  requires = ["setuptools>=61.0", "wheel"]
68
  build-backend = "setuptools.build_meta"
69
 
 
70
  [tool.setuptools.packages.find]
71
  where = ["src"]
72
  include = ["dvlt*"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  version = "0.0.1"
4
  description = "Déjà View: Looping Transformers for Multi-View 3D Reconstruction"
5
  readme = "README.md"
6
+ requires-python = ">= 3.11"
7
  license = { file = "LICENSE" }
8
  authors = [
9
  {name = "Tobias Fischer", email = "tobiasfischer623@gmail.com"},
 
24
  # core
25
  "accelerate==1.8.1",
26
  "h5py==3.16.0",
27
+ "huggingface-hub==1.16.4",
28
  "hydra-core==1.3.2",
29
  "numpy==2.4.4",
30
  "omegaconf==2.3.0",
31
  "opencv-python==4.11.0.86",
32
  "Pillow==11.2.1",
33
+ "pydantic>=2.0",
34
  "safetensors==0.5.3",
35
  "scipy==1.16.0",
36
+ "torch>=2.5.1",
37
+ "torchvision>=0.20.1",
38
  "tqdm==4.67.1",
39
  # logging + console
40
  "rich==14.3.3",
 
50
 
51
  [project.optional-dependencies]
52
  demos = [
53
+ # interactive gradio demos
54
  "gradio==6.1.0",
55
  "onnxruntime-gpu==1.25.0",
56
  "requests==2.32.4",
 
64
  ]
65
  all = ["dvlt[demos,dev]"]
66
 
67
+
68
+ # Using setuptools as the build backend
69
  [build-system]
70
  requires = ["setuptools>=61.0", "wheel"]
71
  build-backend = "setuptools.build_meta"
72
 
73
+ # setuptools configuration
74
  [tool.setuptools.packages.find]
75
  where = ["src"]
76
  include = ["dvlt*"]
77
+
78
+ # Black configuration
79
+ [tool.black]
80
+ line-length = 120
81
+ target-version = ["py310"]
82
+ include = '\.pyi?$'
83
+ extend-exclude = '''
84
+ # A regex preceded with ^/ will apply only to files and directories
85
+ # in the root of the project.
86
+ ^/build/
87
+ '''
88
+
89
+ # Ruff configuration
90
+ [tool.ruff]
91
+ line-length = 120
92
+ target-version = "py310"
93
+
94
+ # Enable various linting rules:
95
+ # E: pycodestyle errors (PEP 8 style guide)
96
+ # F: Pyflakes (detects logical errors)
97
+ # I: isort (import sorting)
98
+ # N: pep8-naming (naming conventions)
99
+ # W: pycodestyle warnings
100
+ # B: flake8-bugbear (additional bug detection)
101
+ # UP: pyupgrade (upgrade syntax to newer Python)
102
+ # PL: Pylint (general Python linting)
103
+ # RUF: Ruff-specific rules
104
+ lint.select = ["E", "F", "I", "W", "B", "PLE", "PLW", "PLC", "PLR"]
105
+ lint.ignore = [
106
+ "E731", # lambda expression
107
+ "E501", # Line too long.
108
+ "PLR2004", # Magic value used in comparison.
109
+ "PLR0915", # Too many statements.
110
+ "PLR0913", # Too many arguments.
111
+ "PLC0414", # Import alias does not rename variable. (this is used for exporting names)
112
+ "PLC1901", # Use falsey strings.
113
+ "PLR0911", # Too many return statements.
114
+ "PLR0912", # Too many branches.
115
+ "PLW2901", # For loop variable overwritten.
116
+ "B027", # Allow empty methods in abstract base class
117
+ ]
118
+
119
+ # Specify directories that should be checked
120
+ include = ["src/**/*.py", "tests/**/*.py"]
121
+
122
+ # Exclude a variety of commonly ignored directories.
123
+ exclude = [
124
+ ".bzr",
125
+ ".direnv",
126
+ ".eggs",
127
+ ".git",
128
+ ".git-rewrite",
129
+ ".hg",
130
+ ".mypy_cache",
131
+ ".nox",
132
+ ".pants.d",
133
+ ".pytype",
134
+ ".ruff_cache",
135
+ ".svn",
136
+ ".tox",
137
+ ".venv",
138
+ "__pypackages__",
139
+ "_build",
140
+ "buck-out",
141
+ "build",
142
+ "dist",
143
+ "node_modules",
144
+ "venv",
145
+ ]
146
+
147
+ # Allow unused variables when underscore-prefixed.
148
+ lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
149
+
150
+ [tool.ruff.lint.mccabe]
151
+ max-complexity = 10
152
+
153
+ [tool.ruff.lint.isort]
154
+ known-first-party = ["dvlt", "tests"]
155
+ force-single-line = false
156
+ lines-after-imports = 2
157
+
158
+ [tool.ruff.lint.flake8-quotes]
159
+ docstring-quotes = "double"
160
+ inline-quotes = "single"
161
+
162
+ [tool.ruff.lint.pydocstyle]
163
+ convention = "google"
164
+
165
+ [tool.pytest.ini_options]
166
+ testpaths = ["tests"]
167
+ python_files = ["test_*.py"]
packages/dvlt/{src → repo/src}/dvlt/__init__.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/__init__.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/base.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/__init__.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/base.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/depth.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pointmap.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/evaluators/pose.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/logging.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/util.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/callbacks/visualization.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/__init__.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/amp.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/constants.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/geometry.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/io.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/numpy/__init__.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/numpy/geometry.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/numpy/projection.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/numpy/rotation.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/pose.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/projection.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/rays.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/rotation.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/tensor.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/common/types.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/config/__init__.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/config/cli.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/config/completion.py RENAMED
File without changes
packages/dvlt/{src → repo/src}/dvlt/config/experiments/da3-base.yaml RENAMED
File without changes