Multi-target tracking over gri per-target estimators: ingest/routing, measurement-space scoring, GNN + MFA/MHT association, track lifecycle, LMB existence, and Poisson-binomial cardinality
Project description
gri-multitrack
Multi-target geolocation tracking. gri-multitrack combines the gri per-target
Kalman-IMM (gri-kalman, fed by gri-obs observables) with a multi-target policy
layer: ingest/routing of the feed-in data tiers, measurement-space scoring,
per-scan association, track lifecycle, existence (Labeled Multi-Bernoulli), and
a Poisson-binomial count distribution.
The governing seam is "gri scores, gri-multitrack assigns": gri-kalman owns
per-target estimation and the measurement-space likelihoods; gri-multitrack owns
everything multi-target. The multi-target layer is DIY on numpy/scipy --
gri-multitrack is Stone-Soup-free (see the "Architecture pivot" in AGENTS.md).
The primary tracker class is MultiTracker (the "Crucible" name now belongs to
the companion 3D app).
See PLAN.md for the live program plan (state, backlog, decisions) and
AGENTS.md for repo guidance. Scenario generation, replay harnesses, scoring,
and the replay viewer live in the sibling gri-tracksim repo, which
depends on this engine and serializes its outputs (the engine itself is
serialization-free).
Status
v1 of the original build plan is complete (see PLAN.md): ingest ->
score -> associate -> gri IMM update -> lifecycle -> LMB output, on geos, raw
TDOAs, and presence events, plus the outlier stream (clutter floors,
per-observation dispositions, the extensible cure catalog), the stationary
convolve resolver, split/merge with lineage, and batch RTS retrospectives.
Implemented:
- Ingest + router for the feed-in tiers (geo
Ell, observables, presence). - Per-track adapter over any gri
Tracker(defaultSmartSegmentedIMM; CV / CoordinatedTurn / Static bank). - Measurement-space scoring seam (Gaussian innovation + chi-squared gate).
- GNN scaffold associator (local scipy Hungarian) for bring-up.
- MFA tracker (
MfaTracker): a local hypothesis-oriented MHT that defers at ambiguous crossings and resolves via accumulated kinematic likelihood -- the v1 associator (loose-coupled; not Stone Soup's MFA). Standalone engine mirroringMultiTracker. - Track lifecycle: birth from geos, M-of-N confirm, patient deletion.
- Existence r_i + Poisson-binomial count distribution.
- Presence ("is it on") ->
coast(t)+ existence bump. - LMB output: labeled tracks + count distribution + per-track
predictedhorizons + the per-scanassociationdiagnostic (gates / marginals / hypotheses), associator-agnostic.
Also implemented since the skeleton:
- Per-kind clutter likelihood floors and per-observation DISPOSITIONS
(assigned / birthed / clutter / cured); the user-extensible
CureProtocol. - The stationary resolver (convolve as the live estimator of a locked track;
the cluster answer as
resolved), split/merge withTrackEventlineage, andsmoothed_tracks()batch retrospectives. - Serialization, GOSPA/OSPA metrics, and the replay viewer live in
gri-tracksim(the engine stays serialization-free).
Notable design choices
- The per-track estimator is any gri-kalman
Tracker; the default isSmartSegmentedIMM. gri-kalman exposes one uniform interface (update(ell, t)/update_observable/predict/coast/smoothed_track/result/is_initialized) acrossIMM,SmartIMM,SegmentedIMM, andSmartSegmentedIMM. gri-multitrack defaults to the maneuver-segmenting, outlier-rejectingSmartSegmentedIMMthe design calls for; passtracker_factory=make_imm(or anyTrackerfactory) to swap it. The choice is isolated togri_multitrack/track.py. - Stone-Soup-free; multi-target is DIY on numpy/scipy. Both associators are
local (GNN over scipy
linear_sum_assignment; MFA a local hypothesis-oriented MHT). Stone Soup's MFA is filter-coupled and would cost the gri IMM, and is heavy (~48 MB of deps +ortools); see theCLAUDE.md"Architecture pivot". If LAP speed ever matters, addlapsolver/lap(tiny) -- notortools. Stone Soup remains only as an optional dev-time GOSPA/OSPA cross-check.
Install
Uses uv with editable path dependencies on the sibling gri repos (in
../../foss/).
uv sync # core (Stone-Soup-free)
uv sync --extra crosscheck # optional: Stone Soup, for a dev-time GOSPA/OSPA check only
Run
uv run python examples/two_target_demo.py # end-to-end demo
uv run pytest # tests
uv run ruff check gri_multitrack test # lint
uv run ty check # type check
Quick use
from gri_multitrack import MultiTracker
tracker = MultiTracker()
# each item is (payload, time_s); payload is an Ell, a gri-obs observable,
# or a PresenceObs.
outputs = tracker.process([(ell0, 0.0), (tdoa1, 1.0), (presence, 2.0)])
final = outputs[-1]
for t in final.tracks:
print(t.label, t.existence, t.is_stationary, t.mode_probabilities)
print(final.count_distribution) # Poisson-binomial P(N=k)
Layout
gri_multitrack/ingest.py-- feed-in types, routing, scan grouping.gri_multitrack/track.py-- per-track adapter over the gri IMM.gri_multitrack/scoring.py-- measurement-space likelihood + gate ("gri scores").gri_multitrack/association.py-- GNN scaffold +Associatorprotocol.gri_multitrack/lifecycle.py-- birth / confirm / delete / existence.gri_multitrack/cardinality.py-- Poisson-binomial count distribution.gri_multitrack/output.py-- Labeled Multi-Bernoulli output records.gri_multitrack/tracker.py-- theMultiTrackerorchestrator.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gri_multitrack-0.2.0.tar.gz.
File metadata
- Download URL: gri_multitrack-0.2.0.tar.gz
- Upload date:
- Size: 62.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
056c7975f3d9c035a9dec7e00b1da3e0d0aaa448280cf979817a171c5f0da949
|
|
| MD5 |
2ae587fc3fad7f354f8f65836f1d2ca5
|
|
| BLAKE2b-256 |
f7186a2323f013e4ec51c98eb4eec23d0746c5ccf7dbb9167f5e5b27a09c5961
|
File details
Details for the file gri_multitrack-0.2.0-py3-none-any.whl.
File metadata
- Download URL: gri_multitrack-0.2.0-py3-none-any.whl
- Upload date:
- Size: 50.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34dabd47997b2057e0a93053cf9d4b6cf16aa68202cd0bc93b36edc00b19db35
|
|
| MD5 |
509e1da85626cf4fed7c1a5d01b44853
|
|
| BLAKE2b-256 |
e1a686d13a898b61aa5e2c722aff9c74ce1ff046730037cc8c722e44d4081e79
|