Skip to content

Avoid stack overflow when compressing union-find chains - #4906

Merged
ahojnnes merged 2 commits into
colmap:mainfrom
aswanth-07:fix/union-find-stack-depth
Oct 30, 2026
Merged

ahojnnes merged 2 commits into
colmap:mainfrom
aswanth-07:fix/union-find-stack-depth

Conversation

@aswanth-07

Copy link
Copy Markdown
Contributor

UnionFind::Find recursively follows each parent before compressing the path. Sequential unions can create a long chain, so the first full lookup can exhaust the native stack. Increasing the existing large-chain test to 100,000 nodes reproduces a Windows stack overflow on main. A separate million-node check also overflows an explicitly enlarged 8 MiB stack.

I replaced the recursive walk with an iterative root search and path compression. Union direction, representatives, missing-key insertion and parent maps remain unchanged. The traversal uses constant call-stack storage and adds no heap allocation.

Validation:

  • The existing 100,000-node regression terminates with stack-overflow status 0xC00000FD on pristine source and passes with the change.
  • All 30 native union-find and connected-component cases pass with MSVC Release. The other 29 cases pass on pristine source.
  • 96,000 mixed operations across integer, string and observation-pair keys preserve exact root and parent-map results against pristine code.
  • Clang-format 23.1.3, the scoped Clang-Tidy check and git diff --check pass.
  • Focused paired checks show comparable root/child lookup timings and no slowdown for repeated ordinary unions. I have not measured full reconstruction runtime.

I did not run the full application build, dataset reconstruction, GPU build, Linux or macOS locally. The changed code is a CPU-only template.

AI assistance disclosure: AI-assisted development tools were used during investigation and implementation. The reported tests were run against the final diff.

@aswanth-07
aswanth-07 marked this pull request as ready for review October 28, 2026 07:41
@sarlinpe
sarlinpe requested a review from ahojnnes October 29, 2026 00:37
@sarlinpe sarlinpe added the full-ci Run Windows and remaining pycolmap CI label Oct 29, 2026
@ahojnnes
ahojnnes merged commit a467519 into colmap:main Oct 30, 2026
21 checks passed
fringehush-gif added a commit to fringehush-gif/colmap that referenced this pull request Nov 3, 2026
## Summary
- Integrate all 12 upstream commits after the shared base 9371f7b, including LoMa BF16 loading, matching-worker error propagation, keypoint shape scaling, and project-file CLI overrides.
- Preserve the fork's CUDA blocking-sync helper alongside upstream's BF16 device check and register the shared CUDA test once.

## Validation
- Resolved all merge conflicts; no conflict markers or unmerged paths remain; git diff --check passes.
- Incremental Linux CUDA build linked six focused test executables. The prepared custom Ceres closure required its existing Abseil/CUDA library directories on the linker's search path.
- CTest passed controllers/base_option_manager_test, feature_matching_utils_test, incremental_pipeline_test, option_manager_test, feature/loma_test, and util/cuda_test (six programs, one run each).
- No full suite, Python binding, end-to-end, or performance claim.

## Upstream commits

- `ea470c0c4f4a40a3bdfa33d01eb38375c5df64de` Run Windows and remaining pycolmap CI only with the full-ci label (colmap#4904)
- `c0339e95482c404b51f38ff9b86866de495984f0` Fix MSVC warnings C4805, C4996, and C4756 (colmap#4910)
- `f00d6063bb0b120cf10ee190f7f06f4a34edf432` Expose Ceres solver thresholds in incremental mapping (colmap#4892)
- `978a4467f36bbfc9ae18780f2dca253000b0d008` Keep division-camera derivatives finite on the optical axis (colmap#4888)
- `98f31541f483788ab550f5c4a4e0804e8674b9e0` Fix leak and check covariance in CovarianceWeightedCostFunction (colmap#4911)
- `a467519441171054c7aaa17dffe86fe06431f05c` Avoid stack overflow when compressing union-find chains (colmap#4906)
- `404b83db2c2cc04892e14a578ddfa73e0ac9bfb1` Fix LoMa bf16 fallback on CUDA by loading it like any other model (colmap#4924)
- `d02e6701dede22eaeee89f73784a8c79f6f289ac` Add max_num_features option to automatic_reconstructor and benchmark (colmap#4907)
- `82c3b5db78d96a7e93ca7b8b2af0634e28aa33f4` Propagate errors of feature matching workers instead of terminating (colmap#4921)
- `4afe8d1156a71a2ff33974895f221c8eb3740cb1` Rescale keypoint shapes in image coordinates (colmap#4926)
- `ce2b5ab9df3801c2b75edbba338c04ad3c8cc6af` Fix vocabulary tree builder descriptor dimensions (colmap#4923)
- `f956ce629c21a88d75a7f7b3107298d1faf3dcf3` Fix command-line overrides for project files (colmap#4902)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-ci Run Windows and remaining pycolmap CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants