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.
- visiontrack_cpp-0.1.0/.github/workflows/parity-isolation.yml +91 -0
- visiontrack_cpp-0.1.0/.github/workflows/release.yml +132 -0
- visiontrack_cpp-0.1.0/.gitignore +11 -0
- visiontrack_cpp-0.1.0/CMakeLists.txt +115 -0
- visiontrack_cpp-0.1.0/LICENSE +21 -0
- visiontrack_cpp-0.1.0/NEXT_STEPS.md +43 -0
- visiontrack_cpp-0.1.0/PHASE2.md +275 -0
- visiontrack_cpp-0.1.0/PHASE3.md +131 -0
- visiontrack_cpp-0.1.0/PHASE4.md +171 -0
- visiontrack_cpp-0.1.0/PKG-INFO +443 -0
- visiontrack_cpp-0.1.0/README.md +411 -0
- visiontrack_cpp-0.1.0/RELEASE.md +141 -0
- visiontrack_cpp-0.1.0/bench/BENCHMARK.md +27 -0
- visiontrack_cpp-0.1.0/bench/bench.py +235 -0
- visiontrack_cpp-0.1.0/bench/compare.py +332 -0
- visiontrack_cpp-0.1.0/bench/figure.py +201 -0
- visiontrack_cpp-0.1.0/bench/gpu_feasibility.py +166 -0
- visiontrack_cpp-0.1.0/bind/module.cpp +544 -0
- visiontrack_cpp-0.1.0/ci/check_oracle.py +134 -0
- visiontrack_cpp-0.1.0/core/assignment.hpp +215 -0
- visiontrack_cpp-0.1.0/core/build_info.hpp +62 -0
- visiontrack_cpp-0.1.0/core/config.hpp +82 -0
- visiontrack_cpp-0.1.0/core/cost.hpp +135 -0
- visiontrack_cpp-0.1.0/core/geometry.hpp +181 -0
- visiontrack_cpp-0.1.0/core/kalman.hpp +221 -0
- visiontrack_cpp-0.1.0/core/lapjv.hpp +171 -0
- visiontrack_cpp-0.1.0/core/track.hpp +163 -0
- visiontrack_cpp-0.1.0/core/tracker.hpp +309 -0
- visiontrack_cpp-0.1.0/learning/LEARNING.md +407 -0
- visiontrack_cpp-0.1.0/learning/README.md +12 -0
- visiontrack_cpp-0.1.0/parity/REPORT.md +68 -0
- visiontrack_cpp-0.1.0/parity/run_parity.py +482 -0
- visiontrack_cpp-0.1.0/pyproject.toml +72 -0
- visiontrack_cpp-0.1.0/tests/_traj.py +84 -0
- visiontrack_cpp-0.1.0/tests/test_build_integrity.py +52 -0
- visiontrack_cpp-0.1.0/tests/test_document_links.py +37 -0
- visiontrack_cpp-0.1.0/tests/test_lapjv.py +169 -0
- visiontrack_cpp-0.1.0/tests/test_parity_assignment.py +364 -0
- visiontrack_cpp-0.1.0/tests/test_parity_geometry.py +135 -0
- visiontrack_cpp-0.1.0/tests/test_parity_harness.py +103 -0
- visiontrack_cpp-0.1.0/tests/test_parity_kalman.py +219 -0
- visiontrack_cpp-0.1.0/tests/test_parity_tracker.py +491 -0
- 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,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.
|