visiontrack-cpp 0.1.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 (43) hide show
  1. visiontrack_cpp-0.1.0/.github/workflows/parity-isolation.yml +91 -0
  2. visiontrack_cpp-0.1.0/.github/workflows/release.yml +132 -0
  3. visiontrack_cpp-0.1.0/.gitignore +11 -0
  4. visiontrack_cpp-0.1.0/CMakeLists.txt +115 -0
  5. visiontrack_cpp-0.1.0/LICENSE +21 -0
  6. visiontrack_cpp-0.1.0/NEXT_STEPS.md +43 -0
  7. visiontrack_cpp-0.1.0/PHASE2.md +275 -0
  8. visiontrack_cpp-0.1.0/PHASE3.md +131 -0
  9. visiontrack_cpp-0.1.0/PHASE4.md +171 -0
  10. visiontrack_cpp-0.1.0/PKG-INFO +443 -0
  11. visiontrack_cpp-0.1.0/README.md +411 -0
  12. visiontrack_cpp-0.1.0/RELEASE.md +141 -0
  13. visiontrack_cpp-0.1.0/bench/BENCHMARK.md +27 -0
  14. visiontrack_cpp-0.1.0/bench/bench.py +235 -0
  15. visiontrack_cpp-0.1.0/bench/compare.py +332 -0
  16. visiontrack_cpp-0.1.0/bench/figure.py +201 -0
  17. visiontrack_cpp-0.1.0/bench/gpu_feasibility.py +166 -0
  18. visiontrack_cpp-0.1.0/bind/module.cpp +544 -0
  19. visiontrack_cpp-0.1.0/ci/check_oracle.py +134 -0
  20. visiontrack_cpp-0.1.0/core/assignment.hpp +215 -0
  21. visiontrack_cpp-0.1.0/core/build_info.hpp +62 -0
  22. visiontrack_cpp-0.1.0/core/config.hpp +82 -0
  23. visiontrack_cpp-0.1.0/core/cost.hpp +135 -0
  24. visiontrack_cpp-0.1.0/core/geometry.hpp +181 -0
  25. visiontrack_cpp-0.1.0/core/kalman.hpp +221 -0
  26. visiontrack_cpp-0.1.0/core/lapjv.hpp +171 -0
  27. visiontrack_cpp-0.1.0/core/track.hpp +163 -0
  28. visiontrack_cpp-0.1.0/core/tracker.hpp +309 -0
  29. visiontrack_cpp-0.1.0/learning/LEARNING.md +407 -0
  30. visiontrack_cpp-0.1.0/learning/README.md +12 -0
  31. visiontrack_cpp-0.1.0/parity/REPORT.md +68 -0
  32. visiontrack_cpp-0.1.0/parity/run_parity.py +482 -0
  33. visiontrack_cpp-0.1.0/pyproject.toml +72 -0
  34. visiontrack_cpp-0.1.0/tests/_traj.py +84 -0
  35. visiontrack_cpp-0.1.0/tests/test_build_integrity.py +52 -0
  36. visiontrack_cpp-0.1.0/tests/test_document_links.py +37 -0
  37. visiontrack_cpp-0.1.0/tests/test_lapjv.py +169 -0
  38. visiontrack_cpp-0.1.0/tests/test_parity_assignment.py +364 -0
  39. visiontrack_cpp-0.1.0/tests/test_parity_geometry.py +135 -0
  40. visiontrack_cpp-0.1.0/tests/test_parity_harness.py +103 -0
  41. visiontrack_cpp-0.1.0/tests/test_parity_kalman.py +219 -0
  42. visiontrack_cpp-0.1.0/tests/test_parity_tracker.py +491 -0
  43. visiontrack_cpp-0.1.0/tests/test_smoke.py +62 -0
@@ -0,0 +1,91 @@
1
+ # A single-purpose experiment, not part of releasing.
2
+ #
3
+ # ANSWERED. Neither compiler was at fault, and neither was NumPy's version.
4
+ # Both arms pass on manylinux_2_28 (gcc 12: 25 passed; clang 21.1.8: 25
5
+ # passed) with the same NumPy 2.4.6 that failed on manylinux2014. The real
6
+ # variable was the base image: NumPy >= 2.4 needs glibc 2.27 and ships no
7
+ # manylinux2014 wheel, so on CentOS 7 pip compiled NumPy from source against
8
+ # a different LAPACK -- visible as a wheel tagged linux_x86_64 instead of
9
+ # manylinux_*. The comparison had been against a rebuilt oracle, not against
10
+ # the reference. release.yml now pins manylinux_2_28 and ci/check_oracle.py
11
+ # refuses to run the suite against a NumPy whose BLAS is not a known-good
12
+ # backend. Kept here as a working harness for the next question of this shape.
13
+ #
14
+ # Original framing follows.
15
+ #
16
+ # CI run 2 found that the Kalman parity tests fail on Linux x86_64 with NumPy
17
+ # 2.4.6 by 1-2 ULP, while passing on:
18
+ # * macOS arm64 / clang with NumPy 2.2.6, 2.4.6 and 2.5.3
19
+ # * Windows x86_64 / MSVC with NumPy 2.2.6, 2.4.6 and 2.5.3
20
+ # * Linux x86_64 / gcc with NumPy 2.2.6
21
+ #
22
+ # So neither "x86_64" nor "NumPy >= 2.4" explains it alone; it is the two
23
+ # together. Two candidates remain, and they assign blame to opposite sides:
24
+ #
25
+ # (a) gcc's codegen for the Eigen Kalman path -> our bug, and fixable.
26
+ # (b) NumPy's manylinux build reducing in a different order than its macOS
27
+ # and Windows wheels -> the oracle differs per platform, and the C++ is
28
+ # faithful to the reference it was written against.
29
+ #
30
+ # Each arm compiles a C++17 probe before cibuildwheel runs, and the step is
31
+ # chained with && rather than tolerated with || true. The first attempt at this
32
+ # experiment installed a clang too old for C++17 and failed for that reason
33
+ # instead of for a parity reason -- an arm that cannot build is not evidence,
34
+ # and it must say so in its own words rather than as a generic CMake error.
35
+ #
36
+ # This holds the platform, the image, the Python and the NumPy version fixed
37
+ # and varies ONLY the compiler. clang passing while gcc fails points at (a). Both failing
38
+ # points at (b). Anything else means the experiment is wrong, not the answer.
39
+ name: parity-isolation
40
+
41
+ on:
42
+ workflow_dispatch:
43
+
44
+ jobs:
45
+ linux-compiler:
46
+ name: linux cp311 numpy==2.4.6 (${{ matrix.cc }})
47
+ runs-on: ubuntu-latest
48
+ strategy:
49
+ fail-fast: false
50
+ matrix:
51
+ include:
52
+ - cc: gcc # the control arm: must reproduce the failure
53
+ cxx: g++
54
+ - cc: clang # the treatment arm
55
+ cxx: clang++
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+
59
+ - name: Build and test one wheel
60
+ uses: pypa/cibuildwheel@v2.21.3
61
+ env:
62
+ # One interpreter only. The point is the compiler, and every extra
63
+ # build is wall-clock spent not answering the question.
64
+ CIBW_BUILD: "cp311-manylinux_x86_64"
65
+ CIBW_ARCHS_LINUX: "x86_64"
66
+ # manylinux_2_28 (AlmaLinux 8), not the default manylinux2014
67
+ # (CentOS 7). EPEL on CentOS 7 ships clang 3.4.2 -- a 2014 compiler
68
+ # that cannot compile C++17, so CMake rejected it as broken and the
69
+ # first attempt at this experiment produced a clang arm that never
70
+ # ran a test. Both arms use the same image so the compiler is the
71
+ # only difference between them; the gcc-on-manylinux2014 result from
72
+ # release run 2 stays the separate reproduction data point.
73
+ CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_28"
74
+ CIBW_BEFORE_ALL_LINUX: >-
75
+ dnf install -y clang &&
76
+ ${{ matrix.cxx }} --version &&
77
+ printf 'int main(){ if constexpr(true) return 0; return 1; }' > /tmp/probe.cpp &&
78
+ ${{ matrix.cxx }} -std=c++17 /tmp/probe.cpp -o /tmp/probe
79
+ CIBW_ENVIRONMENT_LINUX: "CC=${{ matrix.cc }} CXX=${{ matrix.cxx }}"
80
+ # NumPy is pinned here, unlike in release.yml. In an experiment the
81
+ # oracle must be held fixed: a floating NumPy would let the variable
82
+ # under test and the reference move at the same time.
83
+ CIBW_TEST_REQUIRES: "pytest>=7.0 visiontrack-mot==0.2.0 numpy==2.4.6"
84
+ CIBW_TEST_COMMAND: >-
85
+ python -c "import visiontrack_cpp, numpy, json;
86
+ print('COMPILER_ARM=${{ matrix.cc }}');
87
+ print(json.dumps(visiontrack_cpp.build_info(), indent=2));
88
+ print('numpy', numpy.__version__);
89
+ numpy.show_config()"
90
+ && pytest {project}/tests/test_parity_kalman.py -v
91
+ && pytest {project}/tests -q
@@ -0,0 +1,132 @@
1
+ # Build wheels on every supported platform, then publish them to PyPI with
2
+ # trusted publishing -- no API token anywhere in this repository or in its
3
+ # secrets.
4
+ #
5
+ # The parity claim in the README is a claim about a *binary*, not about source
6
+ # code: it holds only if the compiler that produced the binary left every
7
+ # floating-point operation alone. That is why every wheel built here runs
8
+ # tests/test_build_integrity.py before it is allowed out. A wheel whose
9
+ # compiler contracted `a + b*c` into an FMA is not a slower-but-correct wheel,
10
+ # it is a wheel that quietly breaks the one guarantee this project makes, and
11
+ # it must fail the build rather than ship.
12
+ #
13
+ # Confirmed passing: arm64/clang (macos-14) and x86_64/MSVC (windows-latest),
14
+ # both across NumPy 2.2.6, 2.4.6 and 2.5.3.
15
+ #
16
+ # Linux's earlier NumPy >= 2.4 failures were traced to manylinux2014 compiling
17
+ # NumPy locally against a different LAPACK. The manylinux_2_28 image and oracle
18
+ # integrity check below now prevent that false comparison; the latest complete
19
+ # three-platform manual run passed.
20
+ name: release
21
+
22
+ on:
23
+ push:
24
+ tags: ["v*"]
25
+ workflow_dispatch:
26
+
27
+ jobs:
28
+ wheels:
29
+ name: wheels (${{ matrix.os }})
30
+ runs-on: ${{ matrix.os }}
31
+ strategy:
32
+ # Never cancel siblings: when one platform's parity gate fails, the
33
+ # interesting question is whether the others failed too, and a cancelled
34
+ # job answers nothing.
35
+ fail-fast: false
36
+ matrix:
37
+ # macos-13 (Intel) is deliberately absent. It sat queued without ever
38
+ # being scheduled on two consecutive runs -- GitHub is retiring those
39
+ # runners -- and a release must not be gated on a runner that does not
40
+ # arrive. x86_64 is still covered by ubuntu-latest and windows-latest,
41
+ # and clang is still covered by macos-14, so the cell it would have
42
+ # filled (clang x x86_64) is the product of two factors already tested.
43
+ os: [ubuntu-latest, macos-14, windows-latest]
44
+ steps:
45
+ - uses: actions/checkout@v4
46
+
47
+ - name: Build wheels
48
+ uses: pypa/cibuildwheel@v2.21.3
49
+ env:
50
+ CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*"
51
+ # PyPy has no pybind11 story here worth supporting, and musllinux
52
+ # doubles the Eigen build for a platform nobody has asked for.
53
+ CIBW_SKIP: "pp* *-musllinux_* *_i686 *-win32"
54
+ CIBW_ARCHS_MACOS: "auto"
55
+ CIBW_ARCHS_LINUX: "x86_64"
56
+ # manylinux_2_28, not the default manylinux2014. This is a parity
57
+ # setting, not a modernisation: NumPy >= 2.4 requires glibc 2.27 and
58
+ # ships no manylinux2014 wheel, so on CentOS 7 pip silently compiled
59
+ # NumPy from source (the giveaway is a wheel tagged linux_x86_64
60
+ # rather than manylinux_*). A source-built NumPy links a different
61
+ # LAPACK than the official OpenBLAS wheel, and its np.linalg.solve
62
+ # returns answers 1-2 ULP away. Three Kalman parity tests failed for
63
+ # exactly that reason, and the tracker was never involved: the
64
+ # oracle had been rebuilt underneath the comparison.
65
+ CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_28"
66
+ # Matches what RELEASE.md requires of a local build: without this the
67
+ # wheel is tagged for whatever macOS built it, which forces every
68
+ # older-macOS user to compile a package that ships as a binary.
69
+ MACOSX_DEPLOYMENT_TARGET: "11.0"
70
+ CIBW_TEST_REQUIRES: "pytest>=7.0 visiontrack-mot==0.2.0"
71
+ # scipy gates ~10 tests in test_lapjv.py, which skip cleanly without
72
+ # it. It is deliberately NOT in CIBW_TEST_REQUIRES: inside the
73
+ # manylinux image pip resolved a scipy with no matching wheel, fell
74
+ # back to a source build, and failed for want of OpenBLAS -- taking
75
+ # the parity gate down with it. An optional test dependency must not
76
+ # be able to fail this job, so it is installed best-effort and the
77
+ # tests it gates skip when it is absent.
78
+ CIBW_BEFORE_TEST: "pip install scipy || true"
79
+ # Two preconditions, then the suite. The second one exists because
80
+ # its absence cost a full day: parity is measured against NumPy, so
81
+ # a NumPy that pip built from source is not the reference and any
82
+ # comparison to it is meaningless. Asserting the BLAS turns that
83
+ # from three inscrutable 1-ULP failures into one sentence naming the
84
+ # cause.
85
+ CIBW_TEST_COMMAND: >-
86
+ python {project}/ci/check_oracle.py
87
+ && pytest {project}/tests -q
88
+ # No continue-on-error on any platform. It was here for Windows while
89
+ # MSVC's FP behaviour was an open question; that question is now
90
+ # answered (fp_contract_off is true under /fp:precise) and the flag has
91
+ # to go, because it does not just tolerate a failure -- it rewrites the
92
+ # step's `conclusion` to success while the real `outcome` is failure.
93
+ # A parity gate that reports green when it failed is worse than no gate.
94
+
95
+ - uses: actions/upload-artifact@v4
96
+ with:
97
+ name: wheels-${{ matrix.os }}
98
+ path: wheelhouse/*.whl
99
+
100
+ sdist:
101
+ name: sdist
102
+ runs-on: ubuntu-latest
103
+ steps:
104
+ - uses: actions/checkout@v4
105
+ - uses: actions/setup-python@v5
106
+ with:
107
+ python-version: "3.12"
108
+ - run: pipx run build --sdist
109
+ - run: pipx run twine check dist/*.tar.gz
110
+ - uses: actions/upload-artifact@v4
111
+ with:
112
+ name: sdist
113
+ path: dist/*.tar.gz
114
+
115
+ publish:
116
+ name: publish to PyPI
117
+ needs: [wheels, sdist]
118
+ runs-on: ubuntu-latest
119
+ # Only a tag publishes. A manual workflow_dispatch run builds and tests
120
+ # everything and stops, which is what you want when the question is "do
121
+ # the wheels build?" rather than "should this go out?".
122
+ if: startsWith(github.ref, 'refs/tags/v')
123
+ environment: pypi
124
+ permissions:
125
+ id-token: write
126
+ steps:
127
+ - uses: actions/download-artifact@v4
128
+ with:
129
+ path: dist
130
+ merge-multiple: true
131
+ - run: ls -la dist
132
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,11 @@
1
+ build/
2
+ dist/
3
+ *.so
4
+ *.dylib
5
+ *.egg-info/
6
+ __pycache__/
7
+ .pytest_cache/
8
+ .venv/
9
+ CMakeCache.txt
10
+ CMakeFiles/
11
+ compile_commands.json
@@ -0,0 +1,115 @@
1
+ cmake_minimum_required(VERSION 3.20)
2
+ project(visiontrack_cpp LANGUAGES CXX)
3
+
4
+ set(CMAKE_CXX_STANDARD 17)
5
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
6
+
7
+ if(NOT CMAKE_BUILD_TYPE)
8
+ set(CMAKE_BUILD_TYPE Release)
9
+ endif()
10
+
11
+ # When Eigen is not already on the machine, download a pinned copy rather than
12
+ # failing. Pinned, not "latest": Eigen chooses different kernels between
13
+ # versions, and this project's correctness claim is bit-for-bit agreement with
14
+ # a NumPy reference. A floating version would make the wheel's numerics depend
15
+ # on the day it was built. Set -DVT_FETCH_EIGEN=OFF to forbid the download and
16
+ # require a system Eigen instead.
17
+ option(VT_FETCH_EIGEN "Download a pinned Eigen if none is installed" ON)
18
+ # OFF builds against the pinned Eigen even when the machine has one. That is
19
+ # the setting a release wheel wants: it makes the binary's numerics a property
20
+ # of this repo rather than of whatever the build host happened to have in
21
+ # /opt/homebrew. It is also the only way to exercise the download path on a
22
+ # machine that already has Eigen.
23
+ option(VT_SYSTEM_EIGEN "Prefer an already-installed Eigen over the pinned one" ON)
24
+ set(VT_EIGEN_TAG "3.4.0" CACHE STRING "Eigen release to fetch when none is found")
25
+
26
+ find_package(Python REQUIRED COMPONENTS Interpreter Development.Module)
27
+ find_package(pybind11 CONFIG REQUIRED)
28
+
29
+ # Eigen is header-only. Prefer a real config package, then the usual system
30
+ # include paths, and only then the network.
31
+ if(VT_SYSTEM_EIGEN)
32
+ find_package(Eigen3 3.3 QUIET NO_MODULE)
33
+ endif()
34
+ if(Eigen3_FOUND)
35
+ set(VT_EIGEN_TARGET Eigen3::Eigen)
36
+ message(STATUS "Eigen: found via CMake config")
37
+ else()
38
+ if(VT_SYSTEM_EIGEN)
39
+ find_path(VT_EIGEN_INCLUDE_DIR NAMES Eigen/Dense
40
+ HINTS /opt/homebrew/opt/eigen/include/eigen3
41
+ /usr/local/opt/eigen/include/eigen3
42
+ /usr/include/eigen3)
43
+ endif()
44
+ if(VT_EIGEN_INCLUDE_DIR)
45
+ message(STATUS "Eigen: using include dir ${VT_EIGEN_INCLUDE_DIR}")
46
+ elseif(VT_FETCH_EIGEN)
47
+ message(STATUS "Eigen: not installed, fetching pinned ${VT_EIGEN_TAG}")
48
+ include(FetchContent)
49
+ # CMake 3.30 deprecated single-argument FetchContent_Populate in favour of
50
+ # MakeAvailable. MakeAvailable is wrong here: it would add_subdirectory()
51
+ # Eigen's own project, pulling in its tests, BLAS/LAPACK shims and install
52
+ # rules -- none of which this build wants, and some of which break on
53
+ # toolchains that build the extension fine. Populate-only is the intent, so
54
+ # the old behaviour is requested explicitly rather than tripped into.
55
+ if(POLICY CMP0169)
56
+ cmake_policy(SET CMP0169 OLD)
57
+ endif()
58
+ FetchContent_Declare(
59
+ eigen
60
+ URL https://gitlab.com/libeigen/eigen/-/archive/${VT_EIGEN_TAG}/eigen-${VT_EIGEN_TAG}.tar.gz
61
+ )
62
+ # Populate only. Eigen's own CMake project pulls in tests, BLAS shims and
63
+ # install rules that this build has no use for and that break some
64
+ # toolchains; the headers are the entire dependency.
65
+ FetchContent_Populate(eigen)
66
+ set(VT_EIGEN_INCLUDE_DIR ${eigen_SOURCE_DIR})
67
+ else()
68
+ message(FATAL_ERROR
69
+ "No Eigen available: none installed (or VT_SYSTEM_EIGEN=OFF) and "
70
+ "VT_FETCH_EIGEN=OFF.\n"
71
+ " macOS: brew install eigen\n"
72
+ " Debian: apt install libeigen3-dev")
73
+ endif()
74
+ endif()
75
+
76
+ # PARITY: forbid floating-point contraction. clang defaults to -ffp-contract=fast
77
+ # at -O2/-O3, which fuses `a + b*c` into a single FMA that rounds ONCE where
78
+ # NumPy rounds twice. That is a 1-ULP difference on every height-scaled term of
79
+ # the Kalman process noise -- invisible in isolation, and exactly the kind of
80
+ # drift that flips a near-tied association later. Correctness here means
81
+ # "identical to the oracle", not "more accurate".
82
+ #
83
+ # On an unrecognised compiler this stops the build instead of guessing. A wheel
84
+ # built without the flag is not slightly off, it is wrong, and silently
85
+ # omitting the flag is the one failure this project cannot afford to be quiet
86
+ # about. `visiontrack_cpp.build_info()["fp_contract_off"]` re-checks the same
87
+ # property against the binary that actually came out, so a toolchain that
88
+ # ignores the flag is still caught -- at import, by the tests, not in the field.
89
+ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU|IntelLLVM")
90
+ add_compile_options(-ffp-contract=off)
91
+ elseif(MSVC)
92
+ # /fp:precise disables contraction -- verified, not assumed: a Windows CI
93
+ # wheel reports fp_contract_is_off() == true and passes the parity suite.
94
+ #
95
+ # /Zc:__cplusplus is needed because MSVC otherwise hardcodes __cplusplus to
96
+ # 199711L for backward compatibility, no matter which standard it is
97
+ # actually compiling. Without it, build_info() reports a C++ standard the
98
+ # build is not using, and the integrity tests correctly call that a lie.
99
+ add_compile_options(/fp:precise /Zc:__cplusplus)
100
+ else()
101
+ message(FATAL_ERROR
102
+ "Unknown compiler '${CMAKE_CXX_COMPILER_ID}': no way to disable FP "
103
+ "contraction, which this project's parity guarantee depends on.")
104
+ endif()
105
+
106
+ pybind11_add_module(visiontrack_cpp bind/module.cpp)
107
+ target_include_directories(visiontrack_cpp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
108
+
109
+ if(Eigen3_FOUND)
110
+ target_link_libraries(visiontrack_cpp PRIVATE ${VT_EIGEN_TARGET})
111
+ else()
112
+ target_include_directories(visiontrack_cpp PRIVATE ${VT_EIGEN_INCLUDE_DIR})
113
+ endif()
114
+
115
+ install(TARGETS visiontrack_cpp DESTINATION .)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rushikesh Hulage
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.
@@ -0,0 +1,43 @@
1
+ # VisionTrack C++ — next-step checklist
2
+
3
+ VisionTrack C++ is the parity-gated performance implementation of the NumPy
4
+ reference. Its core engineering phases are resolved; future work should protect
5
+ the parity claim rather than broaden the tracker into a second research repo.
6
+
7
+ ## Active focus — publish version 0.1.0
8
+
9
+ - [ ] Confirm the PyPI project or pending trusted publisher is available.
10
+ - [ ] Rebuild source and platform-wheel artifacts from a clean release commit.
11
+ - [ ] Run the oracle-integrity check and full parity suite on every wheel.
12
+ - [ ] Publish only after all platform gates pass.
13
+ - [ ] Verify installation from PyPI in clean Python 3.10–3.13 environments.
14
+ - [ ] Replace provisional installation wording with a verified release link and
15
+ record the release date.
16
+
17
+ As of 2026-09-13, the PyPI JSON endpoint for `visiontrack-cpp` returns 404; the
18
+ package is not yet publicly installable under that name. The repository's
19
+ GitHub Actions environment named `pypi` also returns 404, so the environment
20
+ and PyPI pending trusted publisher must be configured before creating `v0.1.0`.
21
+
22
+ ## After publication — maintain the contract
23
+
24
+ - [x] Add a small CI check for the learning hub and release-document links.
25
+ - [ ] Regenerate parity and benchmark reports from the exact release commit.
26
+ - [ ] Document the supported NumPy-oracle matrix for each release.
27
+ - [ ] Test new compiler, Eigen, Python, and NumPy versions deliberately before
28
+ claiming support.
29
+ - [ ] Keep research-only GMC, OC-SORT, and learned residual behavior in the
30
+ NumPy repository unless a measured production need justifies a port.
31
+
32
+ ## Explicit non-goals
33
+
34
+ - [ ] Do not add a GPU path without new measurements that overturn the existing
35
+ float64, dispatch-overhead, and Amdahl conclusions.
36
+ - [ ] Do not trade bit-exact default behavior for a benchmark headline.
37
+ - [ ] Do not duplicate the detector, evaluation platform, or research harness.
38
+
39
+ ## Completion rule
40
+
41
+ The next release is complete only when an ordinary user can install the package,
42
+ inspect its build information, reproduce parity, and trace the published
43
+ benchmark to the same source revision.