[{"data":1,"prerenderedAt":4284},["ShallowReactive",2],{"navigation":3,"api-navigation":126,"\u002Fnotebooks\u002Ftutorials\u002Fdata_model":328,"docyard:crossref-index":4283},[4,8,38,44,48,122],{"title":5,"path":6,"stem":7},"Getting Started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11,"children":12,"page":37},"Recipes","\u002Frecipes","2.recipes",[13,17,21,25,29,33],{"title":14,"path":15,"stem":16},"Recipe: two-stage cascade tracker","\u002Frecipes\u002Fcascade_tracker","2.recipes\u002Fcascade_tracker",{"title":18,"path":19,"stem":20},"Recipe: cosine appearance tracker","\u002Frecipes\u002Fcosine_tracker","2.recipes\u002Fcosine_tracker",{"title":22,"path":23,"stem":24},"Recipe: Kalman motion tracker","\u002Frecipes\u002Fkalman_motion_tracker","2.recipes\u002Fkalman_motion_tracker",{"title":26,"path":27,"stem":28},"Recipe: learned MOTR-style appearance tracker","\u002Frecipes\u002Flearned_motr_tracker","2.recipes\u002Flearned_motr_tracker",{"title":30,"path":31,"stem":32},"Recipe: overlap-IoU tracker (port of 1.x models.overlap)","\u002Frecipes\u002Foverlap_tracker","2.recipes\u002Foverlap_tracker",{"title":34,"path":35,"stem":36},"Recipe: SORT-style tracker on unitrack 2.0","\u002Frecipes\u002Fsort","2.recipes\u002Fsort",false,{"title":39,"path":40,"stem":41,"children":42},"API reference","\u002Fapi","3.api\u002Findex",[43],{"title":39,"path":40,"stem":41},{"title":45,"path":46,"stem":47},"Migrating from 1.x to 2.0","\u002Fmigration","4.migration",{"title":49,"path":50,"stem":51,"children":52,"page":37},"Notebooks","\u002Fnotebooks","5.notebooks",[53,84,88],{"title":54,"path":55,"stem":56,"children":57},"Embedding \u002F appearance filters","\u002Fnotebooks\u002Fembedding_filters","5.notebooks\u002Fembedding_filters\u002Findex",[58,59,64,68,72,76,80],{"title":54,"path":55,"stem":56},{"title":60,"path":61,"stem":62,"icon":63},"Embedding filters 1 — Exponential moving average (EMA)","\u002Fnotebooks\u002Fembedding_filters\u002Fema","5.notebooks\u002Fembedding_filters\u002F1.ema","i-lucide-notebook",{"title":65,"path":66,"stem":67,"icon":63},"Embedding filters 2 — Diagonal Kalman","\u002Fnotebooks\u002Fembedding_filters\u002Fkalman_diagonal","5.notebooks\u002Fembedding_filters\u002F2.kalman_diagonal",{"title":69,"path":70,"stem":71,"icon":63},"Embedding filters 3 — von Mises-Fisher (directional)","\u002Fnotebooks\u002Fembedding_filters\u002Fvmf_directional","5.notebooks\u002Fembedding_filters\u002F3.vmf_directional",{"title":73,"path":74,"stem":75,"icon":63},"Embedding filters 4 — Ensemble Kalman & information filters","\u002Fnotebooks\u002Fembedding_filters\u002Fenkf_information","5.notebooks\u002Fembedding_filters\u002F4.enkf_information",{"title":77,"path":78,"stem":79,"icon":63},"Embedding filters 5 — Memory bank & learned propagation","\u002Fnotebooks\u002Fembedding_filters\u002Fgallery_and_learned","5.notebooks\u002Fembedding_filters\u002F5.gallery_and_learned",{"title":81,"path":82,"stem":83,"icon":63},"Embedding filters 6 — summary & benchmark","\u002Fnotebooks\u002Fembedding_filters\u002Fsummary_benchmark","5.notebooks\u002Fembedding_filters\u002F6.summary_benchmark",{"title":85,"path":86,"stem":87,"icon":63},"Kalman filters for motion prediction in tracking","\u002Fnotebooks\u002Fkalman","5.notebooks\u002Fkalman",{"title":89,"path":90,"stem":91,"children":92},"Tutorial notebooks","\u002Fnotebooks\u002Ftutorials","5.notebooks\u002Ftutorials\u002Findex",[93,94,98,102,106,110,114,118],{"title":89,"path":90,"stem":91},{"title":95,"path":96,"stem":97,"icon":63},"1. Quickstart — your first tracker","\u002Fnotebooks\u002Ftutorials\u002Fquickstart","5.notebooks\u002Ftutorials\u002F1.quickstart",{"title":99,"path":100,"stem":101,"icon":63},"2. The data model — typed records that flow through a tracker","\u002Fnotebooks\u002Ftutorials\u002Fdata_model","5.notebooks\u002Ftutorials\u002F2.data_model",{"title":103,"path":104,"stem":105,"icon":63},"3. The cost & gate zoos","\u002Fnotebooks\u002Ftutorials\u002Fcosts_and_gates","5.notebooks\u002Ftutorials\u002F3.costs_and_gates",{"title":107,"path":108,"stem":109,"icon":63},"4. The composable pipeline tree","\u002Fnotebooks\u002Ftutorials\u002Fpipeline_tree","5.notebooks\u002Ftutorials\u002F4.pipeline_tree",{"title":111,"path":112,"stem":113,"icon":63},"5. State evolution and lifecycle","\u002Fnotebooks\u002Ftutorials\u002Fstates_and_lifecycle","5.notebooks\u002Ftutorials\u002F5.states_and_lifecycle",{"title":115,"path":116,"stem":117,"icon":63},"6. End-to-end: K=2 cascaded and parallel fusion","\u002Fnotebooks\u002Ftutorials\u002Fcascaded_and_parallel","5.notebooks\u002Ftutorials\u002F6.cascaded_and_parallel",{"title":119,"path":120,"stem":121,"icon":63},"7. Migration & new possibilities — driven by a real detector","\u002Fnotebooks\u002Ftutorials\u002Fmigration","5.notebooks\u002Ftutorials\u002F7.migration",{"title":123,"path":124,"stem":125},"Unitrack","\u002F","index",[127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,249,252,255,258,261,263,266,269,272,274,277,280,282,285,288,290,293,296,299,302,305,308,311,313,315,318,320,323,326],{"title":128,"path":129},"assignment","\u002Fapi\u002Fassignment",{"title":131,"path":132},"associate","\u002Fapi\u002Fassignment\u002Fassociate",{"title":134,"path":135},"clip_associate","\u002Fapi\u002Fassignment\u002Fclip_associate",{"title":137,"path":138},"lap","\u002Fapi\u002Fassignment\u002Flap",{"title":140,"path":141},"lapjv","\u002Fapi\u002Fassignment\u002Flapjv",{"title":143,"path":144},"benchmarks","\u002Fapi\u002Fbenchmarks",{"title":146,"path":147},"hota","\u002Fapi\u002Fbenchmarks\u002Fhota",{"title":149,"path":150},"datasets","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fdatasets",{"title":152,"path":153},"learned_modules","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Flearned_modules",{"title":155,"path":156},"metric","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fmetric",{"title":158,"path":159},"models","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fmodels",{"title":161,"path":162},"protocols","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Fprotocols",{"title":164,"path":165},"render","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Frender",{"title":167,"path":168},"report","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Freport",{"title":170,"path":171},"runner","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Frunner",{"title":173,"path":174},"tracker","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Ftracker",{"title":176,"path":177},"train_learned","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Ftrain_learned",{"title":179,"path":180},"types","\u002Fapi\u002Fbenchmarks\u002Fhota\u002Ftypes",{"title":182,"path":183},"costs","\u002Fapi\u002Fcosts",{"title":185,"path":186},"combinators","\u002Fapi\u002Fcosts\u002Fcombinators",{"title":188,"path":189},"distance","\u002Fapi\u002Fcosts\u002Fdistance",{"title":191,"path":192},"gallery","\u002Fapi\u002Fcosts\u002Fgallery",{"title":194,"path":195},"overlap","\u002Fapi\u002Fcosts\u002Foverlap",{"title":197,"path":198},"data","\u002Fapi\u002Fdata",{"title":200,"path":201},"clip","\u002Fapi\u002Fdata\u002Fclip",{"title":203,"path":204},"cost","\u002Fapi\u002Fdata\u002Fcost",{"title":206,"path":207},"detections","\u002Fapi\u002Fdata\u002Fdetections",{"title":209,"path":210},"frame","\u002Fapi\u002Fdata\u002Fframe",{"title":212,"path":213},"gate","\u002Fapi\u002Fdata\u002Fgate",{"title":215,"path":216},"match","\u002Fapi\u002Fdata\u002Fmatch",{"title":218,"path":219},"tensor_spec","\u002Fapi\u002Fdata\u002Ftensor_spec",{"title":221,"path":222},"tracklets","\u002Fapi\u002Fdata\u002Ftracklets",{"title":224,"path":225},"gates","\u002Fapi\u002Fgates",{"title":227,"path":228},"motion","\u002Fapi\u002Fgates\u002Fmotion",{"title":230,"path":231},"simple","\u002Fapi\u002Fgates\u002Fsimple",{"title":233,"path":234},"soft","\u002Fapi\u002Fgates\u002Fsoft",{"title":236,"path":237},"spatial","\u002Fapi\u002Fgates\u002Fspatial",{"title":239,"path":240},"lifecycle","\u002Fapi\u002Flifecycle",{"title":242,"path":243},"filters","\u002Fapi\u002Flifecycle\u002Ffilters",{"title":245,"path":246},"policies","\u002Fapi\u002Flifecycle\u002Fpolicies",{"title":233,"path":248},"\u002Fapi\u002Flifecycle\u002Fsoft",{"title":250,"path":251},"status","\u002Fapi\u002Flifecycle\u002Fstatus",{"title":253,"path":254},"visibility","\u002Fapi\u002Flifecycle\u002Fvisibility",{"title":256,"path":257},"pipeline","\u002Fapi\u002Fpipeline",{"title":259,"path":260},"base","\u002Fapi\u002Fpipeline\u002Fbase",{"title":185,"path":262},"\u002Fapi\u002Fpipeline\u002Fcombinators",{"title":264,"path":265},"diff","\u002Fapi\u002Fpipeline\u002Fdiff",{"title":267,"path":268},"merge","\u002Fapi\u002Fpipeline\u002Fmerge",{"title":270,"path":271},"states","\u002Fapi\u002Fstates",{"title":259,"path":273},"\u002Fapi\u002Fstates\u002Fbase",{"title":275,"path":276},"directional","\u002Fapi\u002Fstates\u002Fdirectional",{"title":278,"path":279},"ema","\u002Fapi\u002Fstates\u002Fema",{"title":191,"path":281},"\u002Fapi\u002Fstates\u002Fgallery",{"title":283,"path":284},"identity","\u002Fapi\u002Fstates\u002Fidentity",{"title":286,"path":287},"kalman","\u002Fapi\u002Fstates\u002Fkalman",{"title":259,"path":289},"\u002Fapi\u002Fstates\u002Fkalman\u002Fbase",{"title":291,"path":292},"bbox","\u002Fapi\u002Fstates\u002Fkalman\u002Fbbox",{"title":294,"path":295},"centroid","\u002Fapi\u002Fstates\u002Fkalman\u002Fcentroid",{"title":297,"path":298},"ensemble","\u002Fapi\u002Fstates\u002Fkalman\u002Fensemble",{"title":300,"path":301},"information","\u002Fapi\u002Fstates\u002Fkalman\u002Finformation",{"title":303,"path":304},"project","\u002Fapi\u002Fstates\u002Fkalman\u002Fproject",{"title":306,"path":307},"update","\u002Fapi\u002Fstates\u002Fkalman\u002Fupdate",{"title":309,"path":310},"learned","\u002Fapi\u002Fstates\u002Flearned",{"title":233,"path":312},"\u002Fapi\u002Fstates\u002Fsoft",{"title":173,"path":314},"\u002Fapi\u002Ftracker",{"title":316,"path":317},"batch","\u002Fapi\u002Ftracker\u002Fbatch",{"title":200,"path":319},"\u002Fapi\u002Ftracker\u002Fclip",{"title":321,"path":322},"memory","\u002Fapi\u002Ftracker\u002Fmemory",{"title":324,"path":325},"multistream","\u002Fapi\u002Ftracker\u002Fmultistream",{"title":173,"path":327},"\u002Fapi\u002Ftracker\u002Ftracker",{"id":329,"title":99,"body":330,"description":4277,"extension":4278,"meta":4279,"navigation":4280,"path":100,"seo":4281,"stem":101,"__hash__":4282},"content\u002F5.notebooks\u002Ftutorials\u002F2.data_model.md",{"type":331,"value":332,"toc":4268},"minimark",[333,337,351,354,442,449,452,619,624,629,657,668,685,688,1299,1303,1306,1444,1447,1451,1462,1741,1744,1748,1751,2492,2498,2501,2505,2524,2527,2702,2705,2714,3130,3135,3139,3145,3173,3184,3193,3425,3428,3921,3926,3930,3940,3970,4228,4231,4234,4245,4254,4258,4264],[334,335,99],"h1",{"id":336},"_2-the-data-model-typed-records-that-flow-through-a-tracker",[338,339,340,341,345,346,350],"p",{},"unitrack 2.0 is built around a small set of ",[342,343,344],"strong",{},"immutable, typed\nrecords"," backed by ",[347,348,349],"code",{},"tensordict.tensorclass",". Every interesting\ndata shape passing between stages of a tracker is one of these\ntypes. This makes the pipeline easy to reason about: a stage's\nsignature tells you exactly what it consumes and produces.",[338,352,353],{},"The five canonical records are:",[355,356,357,373],"table",{},[358,359,360],"thead",{},[361,362,363,367,370],"tr",{},[364,365,366],"th",{},"Record",[364,368,369],{},"Shape",[364,371,372],{},"Role",[374,375,376,390,403,416,429],"tbody",{},[361,377,378,384,387],{},[379,380,381],"td",{},[347,382,383],{},"Tracklets",[379,385,386],{},"(N,) batched",[379,388,389],{},"the tracker's snapshot of live identities",[361,391,392,397,400],{},[379,393,394],{},[347,395,396],{},"Detections",[379,398,399],{},"(M,) batched",[379,401,402],{},"one frame's new observations",[361,404,405,410,413],{},[379,406,407],{},[347,408,409],{},"FrameContext",[379,411,412],{},"scalar",[379,414,415],{},"timing + stream metadata",[361,417,418,423,426],{},[379,419,420],{},[347,421,422],{},"CostExpression",[379,424,425],{},"(N, M) cost matrix + optional gates",[379,427,428],{},"cost producer's output",[361,430,431,436,439],{},[379,432,433],{},[347,434,435],{},"MatchOutcome",[379,437,438],{},"matched pairs + residual indices",[379,440,441],{},"associator's output",[338,443,444,445,448],{},"Plus an algebraic variant type ",[347,446,447],{},"Gate = PerPair | PerCs | PerDs | CostBias",".",[338,450,451],{},"We'll walk through each in turn.",[453,454,459],"pre",{"className":455,"code":456,"language":457,"meta":458,"style":458},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import torch\nimport matplotlib.pyplot as plt\n\nfrom unitrack.data import (\n    CostExpression,\n    Detections,\n    FrameContext,\n    Gate,\n    MatchOutcome,\n    Tracklets,\n)\nfrom unitrack.lifecycle import TrackletStatus\n\ntorch.manual_seed(0)\n\n","python","",[347,460,461,474,495,502,521,530,538,546,554,562,570,576,593,598],{"__ignoreMap":458},[462,463,466,470],"span",{"class":464,"line":465},"line",1,[462,467,469],{"class":468},"sVHd0","import",[462,471,473],{"class":472},"su5hD"," torch\n",[462,475,477,479,482,485,489,492],{"class":464,"line":476},2,[462,478,469],{"class":468},[462,480,481],{"class":472}," matplotlib",[462,483,448],{"class":484},"sP7_E",[462,486,488],{"class":487},"skxfh","pyplot",[462,490,491],{"class":468}," as",[462,493,494],{"class":472}," plt\n",[462,496,498],{"class":464,"line":497},3,[462,499,501],{"emptyLinePlaceholder":500},true,"\n",[462,503,505,508,511,513,516,518],{"class":464,"line":504},4,[462,506,507],{"class":468},"from",[462,509,510],{"class":472}," unitrack",[462,512,448],{"class":484},[462,514,515],{"class":472},"data ",[462,517,469],{"class":468},[462,519,520],{"class":484}," (\n",[462,522,524,527],{"class":464,"line":523},5,[462,525,526],{"class":472},"    CostExpression",[462,528,529],{"class":484},",\n",[462,531,533,536],{"class":464,"line":532},6,[462,534,535],{"class":472},"    Detections",[462,537,529],{"class":484},[462,539,541,544],{"class":464,"line":540},7,[462,542,543],{"class":472},"    FrameContext",[462,545,529],{"class":484},[462,547,549,552],{"class":464,"line":548},8,[462,550,551],{"class":472},"    Gate",[462,553,529],{"class":484},[462,555,557,560],{"class":464,"line":556},9,[462,558,559],{"class":472},"    MatchOutcome",[462,561,529],{"class":484},[462,563,565,568],{"class":464,"line":564},10,[462,566,567],{"class":472},"    Tracklets",[462,569,529],{"class":484},[462,571,573],{"class":464,"line":572},11,[462,574,575],{"class":484},")\n",[462,577,579,581,583,585,588,590],{"class":464,"line":578},12,[462,580,507],{"class":468},[462,582,510],{"class":472},[462,584,448],{"class":484},[462,586,587],{"class":472},"lifecycle ",[462,589,469],{"class":468},[462,591,592],{"class":472}," TrackletStatus\n",[462,594,596],{"class":464,"line":595},13,[462,597,501],{"emptyLinePlaceholder":500},[462,599,601,604,606,610,613,617],{"class":464,"line":600},14,[462,602,603],{"class":472},"torch",[462,605,448],{"class":484},[462,607,609],{"class":608},"slqww","manual_seed",[462,611,612],{"class":484},"(",[462,614,616],{"class":615},"srdBf","0",[462,618,575],{"class":484},[620,621],"docyard-notebook-output",{"data":622,"kind":623},"PHRvcmNoLl9DLkdlbmVyYXRvciBhdCAweDdmOTllOGJjNmRiMD4=","result",[625,626,628],"h2",{"id":627},"tracklets-the-snapshot","Tracklets — the snapshot",[338,630,631,632,634,635,638,639,638,641,638,644,638,647,529,650,638,653,656],{},"A ",[347,633,383],{}," record holds the tracker's view of every live\nidentity. The reserved fields are common to every tracker:\n",[347,636,637],{},"id",", ",[347,640,250],{},[347,642,643],{},"hits",[347,645,646],{},"time_since_update",[347,648,649],{},"age",[347,651,652],{},"frame_started",[347,654,655],{},"frame_last_seen",". User fields (kernel, mask,\nbbox, …) are added at construction time and live alongside the\nreserved ones.",[338,658,659,660,663,664,667],{},"Status is a ",[347,661,662],{},"TrackletStatus"," enum stored as ",[347,665,666],{},"int8",":",[453,669,671],{"className":455,"code":670,"language":457,"meta":458,"style":458},"list(TrackletStatus)\n\n",[347,672,673],{"__ignoreMap":458},[462,674,675,679,681,683],{"class":464,"line":465},[462,676,678],{"class":677},"sZMiF","list",[462,680,612],{"class":484},[462,682,662],{"class":608},[462,684,575],{"class":484},[620,686],{"data":687,"kind":623},"WzxUcmFja2xldFN0YXR1cy5UZW50YXRpdmU6IDA+LAogPFRyYWNrbGV0U3RhdHVzLkFjdGl2ZTogMT4sCiA8VHJhY2tsZXRTdGF0dXMuTG9zdDogMj4sCiA8VHJhY2tsZXRTdGF0dXMuUmVtb3ZlZDogMz5d",[453,689,691],{"className":455,"code":690,"language":457,"meta":458,"style":458},"# Construct three tracklets — two Active, one Tentative.\nt = Tracklets(\n    id=torch.tensor([10, 11, 12], dtype=torch.int64),\n    status=torch.tensor(\n        [TrackletStatus.Active, TrackletStatus.Active, TrackletStatus.Tentative],\n        dtype=torch.int8,\n    ),\n    hits=torch.tensor([5, 5, 1], dtype=torch.int32),\n    time_since_update=torch.zeros(3, dtype=torch.int32),\n    age=torch.tensor([10, 8, 1], dtype=torch.int32),\n    frame_started=torch.tensor([0, 2, 9], dtype=torch.int32),\n    frame_last_seen=torch.tensor([10, 10, 10], dtype=torch.int32),\n    # Two user fields:\n    kernel=torch.randn(3, 8),\n    position=torch.tensor([[100.0, 50.0], [200.0, 80.0], [50.0, 30.0]]),\n    batch_size=[3],\n)\nprint(f\"batch_size: {t.batch_size}\")\nprint(f\"ids:        {t.id.tolist()}\")\nprint(f\"statuses:   {t.status.tolist()}  (0=Tentative, 1=Active)\")\nprint(f\"kernel.shape: {t.kernel.shape}\")\nprint(f\"position:    {t.position.tolist()}\")\n\n",[347,692,693,699,714,764,779,812,827,832,875,908,948,989,1029,1034,1058,1111,1126,1131,1167,1201,1234,1266],{"__ignoreMap":458},[462,694,695],{"class":464,"line":465},[462,696,698],{"class":697},"sutJx","# Construct three tracklets — two Active, one Tentative.\n",[462,700,701,704,708,711],{"class":464,"line":476},[462,702,703],{"class":472},"t ",[462,705,707],{"class":706},"smGrS","=",[462,709,710],{"class":608}," Tracklets",[462,712,713],{"class":484},"(\n",[462,715,716,720,722,724,726,729,732,735,738,741,743,746,749,752,754,756,758,761],{"class":464,"line":497},[462,717,719],{"class":718},"s99_P","    id",[462,721,707],{"class":706},[462,723,603],{"class":608},[462,725,448],{"class":484},[462,727,728],{"class":608},"tensor",[462,730,731],{"class":484},"([",[462,733,734],{"class":615},"10",[462,736,737],{"class":484},",",[462,739,740],{"class":615}," 11",[462,742,737],{"class":484},[462,744,745],{"class":615}," 12",[462,747,748],{"class":484},"],",[462,750,751],{"class":718}," dtype",[462,753,707],{"class":706},[462,755,603],{"class":608},[462,757,448],{"class":484},[462,759,760],{"class":487},"int64",[462,762,763],{"class":484},"),\n",[462,765,766,769,771,773,775,777],{"class":464,"line":504},[462,767,768],{"class":718},"    status",[462,770,707],{"class":706},[462,772,603],{"class":608},[462,774,448],{"class":484},[462,776,728],{"class":608},[462,778,713],{"class":484},[462,780,781,784,786,788,791,793,796,798,800,802,804,806,809],{"class":464,"line":523},[462,782,783],{"class":484},"        [",[462,785,662],{"class":608},[462,787,448],{"class":484},[462,789,790],{"class":487},"Active",[462,792,737],{"class":484},[462,794,795],{"class":608}," TrackletStatus",[462,797,448],{"class":484},[462,799,790],{"class":487},[462,801,737],{"class":484},[462,803,795],{"class":608},[462,805,448],{"class":484},[462,807,808],{"class":487},"Tentative",[462,810,811],{"class":484},"],\n",[462,813,814,817,819,821,823,825],{"class":464,"line":532},[462,815,816],{"class":718},"        dtype",[462,818,707],{"class":706},[462,820,603],{"class":608},[462,822,448],{"class":484},[462,824,666],{"class":487},[462,826,529],{"class":484},[462,828,829],{"class":464,"line":540},[462,830,831],{"class":484},"    ),\n",[462,833,834,837,839,841,843,845,847,850,852,855,857,860,862,864,866,868,870,873],{"class":464,"line":548},[462,835,836],{"class":718},"    hits",[462,838,707],{"class":706},[462,840,603],{"class":608},[462,842,448],{"class":484},[462,844,728],{"class":608},[462,846,731],{"class":484},[462,848,849],{"class":615},"5",[462,851,737],{"class":484},[462,853,854],{"class":615}," 5",[462,856,737],{"class":484},[462,858,859],{"class":615}," 1",[462,861,748],{"class":484},[462,863,751],{"class":718},[462,865,707],{"class":706},[462,867,603],{"class":608},[462,869,448],{"class":484},[462,871,872],{"class":487},"int32",[462,874,763],{"class":484},[462,876,877,880,882,884,886,889,891,894,896,898,900,902,904,906],{"class":464,"line":556},[462,878,879],{"class":718},"    time_since_update",[462,881,707],{"class":706},[462,883,603],{"class":608},[462,885,448],{"class":484},[462,887,888],{"class":608},"zeros",[462,890,612],{"class":484},[462,892,893],{"class":615},"3",[462,895,737],{"class":484},[462,897,751],{"class":718},[462,899,707],{"class":706},[462,901,603],{"class":608},[462,903,448],{"class":484},[462,905,872],{"class":487},[462,907,763],{"class":484},[462,909,910,913,915,917,919,921,923,925,927,930,932,934,936,938,940,942,944,946],{"class":464,"line":564},[462,911,912],{"class":718},"    age",[462,914,707],{"class":706},[462,916,603],{"class":608},[462,918,448],{"class":484},[462,920,728],{"class":608},[462,922,731],{"class":484},[462,924,734],{"class":615},[462,926,737],{"class":484},[462,928,929],{"class":615}," 8",[462,931,737],{"class":484},[462,933,859],{"class":615},[462,935,748],{"class":484},[462,937,751],{"class":718},[462,939,707],{"class":706},[462,941,603],{"class":608},[462,943,448],{"class":484},[462,945,872],{"class":487},[462,947,763],{"class":484},[462,949,950,953,955,957,959,961,963,965,967,970,972,975,977,979,981,983,985,987],{"class":464,"line":572},[462,951,952],{"class":718},"    frame_started",[462,954,707],{"class":706},[462,956,603],{"class":608},[462,958,448],{"class":484},[462,960,728],{"class":608},[462,962,731],{"class":484},[462,964,616],{"class":615},[462,966,737],{"class":484},[462,968,969],{"class":615}," 2",[462,971,737],{"class":484},[462,973,974],{"class":615}," 9",[462,976,748],{"class":484},[462,978,751],{"class":718},[462,980,707],{"class":706},[462,982,603],{"class":608},[462,984,448],{"class":484},[462,986,872],{"class":487},[462,988,763],{"class":484},[462,990,991,994,996,998,1000,1002,1004,1006,1008,1011,1013,1015,1017,1019,1021,1023,1025,1027],{"class":464,"line":578},[462,992,993],{"class":718},"    frame_last_seen",[462,995,707],{"class":706},[462,997,603],{"class":608},[462,999,448],{"class":484},[462,1001,728],{"class":608},[462,1003,731],{"class":484},[462,1005,734],{"class":615},[462,1007,737],{"class":484},[462,1009,1010],{"class":615}," 10",[462,1012,737],{"class":484},[462,1014,1010],{"class":615},[462,1016,748],{"class":484},[462,1018,751],{"class":718},[462,1020,707],{"class":706},[462,1022,603],{"class":608},[462,1024,448],{"class":484},[462,1026,872],{"class":487},[462,1028,763],{"class":484},[462,1030,1031],{"class":464,"line":595},[462,1032,1033],{"class":697},"    # Two user fields:\n",[462,1035,1036,1039,1041,1043,1045,1048,1050,1052,1054,1056],{"class":464,"line":600},[462,1037,1038],{"class":718},"    kernel",[462,1040,707],{"class":706},[462,1042,603],{"class":608},[462,1044,448],{"class":484},[462,1046,1047],{"class":608},"randn",[462,1049,612],{"class":484},[462,1051,893],{"class":615},[462,1053,737],{"class":484},[462,1055,929],{"class":615},[462,1057,763],{"class":484},[462,1059,1061,1064,1066,1068,1070,1072,1075,1078,1080,1083,1085,1088,1091,1093,1096,1098,1100,1103,1105,1108],{"class":464,"line":1060},15,[462,1062,1063],{"class":718},"    position",[462,1065,707],{"class":706},[462,1067,603],{"class":608},[462,1069,448],{"class":484},[462,1071,728],{"class":608},[462,1073,1074],{"class":484},"([[",[462,1076,1077],{"class":615},"100.0",[462,1079,737],{"class":484},[462,1081,1082],{"class":615}," 50.0",[462,1084,748],{"class":484},[462,1086,1087],{"class":484}," [",[462,1089,1090],{"class":615},"200.0",[462,1092,737],{"class":484},[462,1094,1095],{"class":615}," 80.0",[462,1097,748],{"class":484},[462,1099,1087],{"class":484},[462,1101,1102],{"class":615},"50.0",[462,1104,737],{"class":484},[462,1106,1107],{"class":615}," 30.0",[462,1109,1110],{"class":484},"]]),\n",[462,1112,1114,1117,1119,1122,1124],{"class":464,"line":1113},16,[462,1115,1116],{"class":718},"    batch_size",[462,1118,707],{"class":706},[462,1120,1121],{"class":484},"[",[462,1123,893],{"class":615},[462,1125,811],{"class":484},[462,1127,1129],{"class":464,"line":1128},17,[462,1130,575],{"class":484},[462,1132,1134,1138,1140,1144,1148,1151,1154,1156,1159,1162,1165],{"class":464,"line":1133},18,[462,1135,1137],{"class":1136},"sptTA","print",[462,1139,612],{"class":484},[462,1141,1143],{"class":1142},"sbsja","f",[462,1145,1147],{"class":1146},"s_sjI","\"batch_size: ",[462,1149,1150],{"class":615},"{",[462,1152,1153],{"class":608},"t",[462,1155,448],{"class":484},[462,1157,1158],{"class":487},"batch_size",[462,1160,1161],{"class":615},"}",[462,1163,1164],{"class":1146},"\"",[462,1166,575],{"class":484},[462,1168,1170,1172,1174,1176,1179,1181,1183,1185,1187,1189,1192,1195,1197,1199],{"class":464,"line":1169},19,[462,1171,1137],{"class":1136},[462,1173,612],{"class":484},[462,1175,1143],{"class":1142},[462,1177,1178],{"class":1146},"\"ids:        ",[462,1180,1150],{"class":615},[462,1182,1153],{"class":608},[462,1184,448],{"class":484},[462,1186,637],{"class":487},[462,1188,448],{"class":484},[462,1190,1191],{"class":608},"tolist",[462,1193,1194],{"class":484},"()",[462,1196,1161],{"class":615},[462,1198,1164],{"class":1146},[462,1200,575],{"class":484},[462,1202,1204,1206,1208,1210,1213,1215,1217,1219,1221,1223,1225,1227,1229,1232],{"class":464,"line":1203},20,[462,1205,1137],{"class":1136},[462,1207,612],{"class":484},[462,1209,1143],{"class":1142},[462,1211,1212],{"class":1146},"\"statuses:   ",[462,1214,1150],{"class":615},[462,1216,1153],{"class":608},[462,1218,448],{"class":484},[462,1220,250],{"class":487},[462,1222,448],{"class":484},[462,1224,1191],{"class":608},[462,1226,1194],{"class":484},[462,1228,1161],{"class":615},[462,1230,1231],{"class":1146},"  (0=Tentative, 1=Active)\"",[462,1233,575],{"class":484},[462,1235,1237,1239,1241,1243,1246,1248,1250,1252,1255,1257,1260,1262,1264],{"class":464,"line":1236},21,[462,1238,1137],{"class":1136},[462,1240,612],{"class":484},[462,1242,1143],{"class":1142},[462,1244,1245],{"class":1146},"\"kernel.shape: ",[462,1247,1150],{"class":615},[462,1249,1153],{"class":608},[462,1251,448],{"class":484},[462,1253,1254],{"class":487},"kernel",[462,1256,448],{"class":484},[462,1258,1259],{"class":487},"shape",[462,1261,1161],{"class":615},[462,1263,1164],{"class":1146},[462,1265,575],{"class":484},[462,1267,1269,1271,1273,1275,1278,1280,1282,1284,1287,1289,1291,1293,1295,1297],{"class":464,"line":1268},22,[462,1270,1137],{"class":1136},[462,1272,612],{"class":484},[462,1274,1143],{"class":1142},[462,1276,1277],{"class":1146},"\"position:    ",[462,1279,1150],{"class":615},[462,1281,1153],{"class":608},[462,1283,448],{"class":484},[462,1285,1286],{"class":487},"position",[462,1288,448],{"class":484},[462,1290,1191],{"class":608},[462,1292,1194],{"class":484},[462,1294,1161],{"class":615},[462,1296,1164],{"class":1146},[462,1298,575],{"class":484},[620,1300],{"data":1301,"kind":1302},"YmF0Y2hfc2l6ZTogdG9yY2guU2l6ZShbM10pCmlkczogICAgICAgIFsxMCwgMTEsIDEyXQpzdGF0dXNlczogICBbMSwgMSwgMF0gICgwPVRlbnRhdGl2ZSwgMT1BY3RpdmUpCmtlcm5lbC5zaGFwZTogdG9yY2guU2l6ZShbMywgOF0pCnBvc2l0aW9uOiAgICBbWzEwMC4wLCA1MC4wXSwgWzIwMC4wLCA4MC4wXSwgWzUwLjAsIDMwLjBdXQo=","stream",[338,1304,1305],{},"Snapshots are batch-aware: indexing returns a Tracklets of the\nsub-batch, with all fields sliced consistently.",[453,1307,1309],{"className":455,"code":1308,"language":457,"meta":458,"style":458},"# Subset to only Active tracklets:\nactive_only = t[t.status == int(TrackletStatus.Active)]\nprint(f\"active tracklets:  {active_only.batch_size[0]}\")\nprint(f\"ids:               {active_only.id.tolist()}\")\nprint(f\"position.shape:    {active_only.position.shape}\")\n\n",[347,1310,1311,1316,1351,1384,1415],{"__ignoreMap":458},[462,1312,1313],{"class":464,"line":465},[462,1314,1315],{"class":697},"# Subset to only Active tracklets:\n",[462,1317,1318,1321,1323,1326,1328,1330,1332,1334,1337,1340,1342,1344,1346,1348],{"class":464,"line":476},[462,1319,1320],{"class":472},"active_only ",[462,1322,707],{"class":706},[462,1324,1325],{"class":472}," t",[462,1327,1121],{"class":484},[462,1329,1153],{"class":472},[462,1331,448],{"class":484},[462,1333,250],{"class":487},[462,1335,1336],{"class":706}," ==",[462,1338,1339],{"class":677}," int",[462,1341,612],{"class":484},[462,1343,662],{"class":608},[462,1345,448],{"class":484},[462,1347,790],{"class":487},[462,1349,1350],{"class":484},")]\n",[462,1352,1353,1355,1357,1359,1362,1364,1367,1369,1371,1373,1375,1378,1380,1382],{"class":464,"line":497},[462,1354,1137],{"class":1136},[462,1356,612],{"class":484},[462,1358,1143],{"class":1142},[462,1360,1361],{"class":1146},"\"active tracklets:  ",[462,1363,1150],{"class":615},[462,1365,1366],{"class":608},"active_only",[462,1368,448],{"class":484},[462,1370,1158],{"class":487},[462,1372,1121],{"class":484},[462,1374,616],{"class":615},[462,1376,1377],{"class":484},"]",[462,1379,1161],{"class":615},[462,1381,1164],{"class":1146},[462,1383,575],{"class":484},[462,1385,1386,1388,1390,1392,1395,1397,1399,1401,1403,1405,1407,1409,1411,1413],{"class":464,"line":504},[462,1387,1137],{"class":1136},[462,1389,612],{"class":484},[462,1391,1143],{"class":1142},[462,1393,1394],{"class":1146},"\"ids:               ",[462,1396,1150],{"class":615},[462,1398,1366],{"class":608},[462,1400,448],{"class":484},[462,1402,637],{"class":487},[462,1404,448],{"class":484},[462,1406,1191],{"class":608},[462,1408,1194],{"class":484},[462,1410,1161],{"class":615},[462,1412,1164],{"class":1146},[462,1414,575],{"class":484},[462,1416,1417,1419,1421,1423,1426,1428,1430,1432,1434,1436,1438,1440,1442],{"class":464,"line":523},[462,1418,1137],{"class":1136},[462,1420,612],{"class":484},[462,1422,1143],{"class":1142},[462,1424,1425],{"class":1146},"\"position.shape:    ",[462,1427,1150],{"class":615},[462,1429,1366],{"class":608},[462,1431,448],{"class":484},[462,1433,1286],{"class":487},[462,1435,448],{"class":484},[462,1437,1259],{"class":487},[462,1439,1161],{"class":615},[462,1441,1164],{"class":1146},[462,1443,575],{"class":484},[620,1445],{"data":1446,"kind":1302},"YWN0aXZlIHRyYWNrbGV0czogIDIKaWRzOiAgICAgICAgICAgICAgIFsxMCwgMTFdCnBvc2l0aW9uLnNoYXBlOiAgICB0b3JjaC5TaXplKFsyLCAyXSkK",[625,1448,1450],{"id":1449},"detections-one-frames-observations","Detections — one frame's observations",[338,1452,1453,1455,1456,1458,1459,1461],{},[347,1454,396],{}," mirrors ",[347,1457,383],{}," but only carries one reserved\nfield, ",[347,1460,125],{}," (the caller-supplied per-detection ordering).\nUser fields match the Tracklets schema for the same Tracker.",[453,1463,1465],{"className":455,"code":1464,"language":457,"meta":458,"style":458},"d = Detections(\n    index=torch.arange(4, dtype=torch.int64),\n    kernel=torch.randn(4, 8),\n    position=torch.tensor(\n        [\n            [110.0, 52.0],  # close to tracklet 0\n            [201.0, 81.0],  # close to tracklet 1\n            [300.0, 200.0],  # new\n            [49.0, 31.0],\n        ]\n    ),  # close to tracklet 2\n    batch_size=[4],\n)\nprint(f\"detections:  {d.batch_size[0]}\")\nprint(f\"index:       {d.index.tolist()}\")\nprint(f\"position:    {d.position.tolist()}\")\n\n",[347,1466,1467,1479,1512,1534,1548,1553,1571,1588,1605,1619,1624,1632,1644,1648,1680,1711],{"__ignoreMap":458},[462,1468,1469,1472,1474,1477],{"class":464,"line":465},[462,1470,1471],{"class":472},"d ",[462,1473,707],{"class":706},[462,1475,1476],{"class":608}," Detections",[462,1478,713],{"class":484},[462,1480,1481,1484,1486,1488,1490,1493,1495,1498,1500,1502,1504,1506,1508,1510],{"class":464,"line":476},[462,1482,1483],{"class":718},"    index",[462,1485,707],{"class":706},[462,1487,603],{"class":608},[462,1489,448],{"class":484},[462,1491,1492],{"class":608},"arange",[462,1494,612],{"class":484},[462,1496,1497],{"class":615},"4",[462,1499,737],{"class":484},[462,1501,751],{"class":718},[462,1503,707],{"class":706},[462,1505,603],{"class":608},[462,1507,448],{"class":484},[462,1509,760],{"class":487},[462,1511,763],{"class":484},[462,1513,1514,1516,1518,1520,1522,1524,1526,1528,1530,1532],{"class":464,"line":497},[462,1515,1038],{"class":718},[462,1517,707],{"class":706},[462,1519,603],{"class":608},[462,1521,448],{"class":484},[462,1523,1047],{"class":608},[462,1525,612],{"class":484},[462,1527,1497],{"class":615},[462,1529,737],{"class":484},[462,1531,929],{"class":615},[462,1533,763],{"class":484},[462,1535,1536,1538,1540,1542,1544,1546],{"class":464,"line":504},[462,1537,1063],{"class":718},[462,1539,707],{"class":706},[462,1541,603],{"class":608},[462,1543,448],{"class":484},[462,1545,728],{"class":608},[462,1547,713],{"class":484},[462,1549,1550],{"class":464,"line":523},[462,1551,1552],{"class":484},"        [\n",[462,1554,1555,1558,1561,1563,1566,1568],{"class":464,"line":532},[462,1556,1557],{"class":484},"            [",[462,1559,1560],{"class":615},"110.0",[462,1562,737],{"class":484},[462,1564,1565],{"class":615}," 52.0",[462,1567,748],{"class":484},[462,1569,1570],{"class":697},"  # close to tracklet 0\n",[462,1572,1573,1575,1578,1580,1583,1585],{"class":464,"line":540},[462,1574,1557],{"class":484},[462,1576,1577],{"class":615},"201.0",[462,1579,737],{"class":484},[462,1581,1582],{"class":615}," 81.0",[462,1584,748],{"class":484},[462,1586,1587],{"class":697},"  # close to tracklet 1\n",[462,1589,1590,1592,1595,1597,1600,1602],{"class":464,"line":548},[462,1591,1557],{"class":484},[462,1593,1594],{"class":615},"300.0",[462,1596,737],{"class":484},[462,1598,1599],{"class":615}," 200.0",[462,1601,748],{"class":484},[462,1603,1604],{"class":697},"  # new\n",[462,1606,1607,1609,1612,1614,1617],{"class":464,"line":556},[462,1608,1557],{"class":484},[462,1610,1611],{"class":615},"49.0",[462,1613,737],{"class":484},[462,1615,1616],{"class":615}," 31.0",[462,1618,811],{"class":484},[462,1620,1621],{"class":464,"line":564},[462,1622,1623],{"class":484},"        ]\n",[462,1625,1626,1629],{"class":464,"line":572},[462,1627,1628],{"class":484},"    ),",[462,1630,1631],{"class":697},"  # close to tracklet 2\n",[462,1633,1634,1636,1638,1640,1642],{"class":464,"line":578},[462,1635,1116],{"class":718},[462,1637,707],{"class":706},[462,1639,1121],{"class":484},[462,1641,1497],{"class":615},[462,1643,811],{"class":484},[462,1645,1646],{"class":464,"line":595},[462,1647,575],{"class":484},[462,1649,1650,1652,1654,1656,1659,1661,1664,1666,1668,1670,1672,1674,1676,1678],{"class":464,"line":600},[462,1651,1137],{"class":1136},[462,1653,612],{"class":484},[462,1655,1143],{"class":1142},[462,1657,1658],{"class":1146},"\"detections:  ",[462,1660,1150],{"class":615},[462,1662,1663],{"class":608},"d",[462,1665,448],{"class":484},[462,1667,1158],{"class":487},[462,1669,1121],{"class":484},[462,1671,616],{"class":615},[462,1673,1377],{"class":484},[462,1675,1161],{"class":615},[462,1677,1164],{"class":1146},[462,1679,575],{"class":484},[462,1681,1682,1684,1686,1688,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709],{"class":464,"line":1060},[462,1683,1137],{"class":1136},[462,1685,612],{"class":484},[462,1687,1143],{"class":1142},[462,1689,1690],{"class":1146},"\"index:       ",[462,1692,1150],{"class":615},[462,1694,1663],{"class":608},[462,1696,448],{"class":484},[462,1698,125],{"class":487},[462,1700,448],{"class":484},[462,1702,1191],{"class":608},[462,1704,1194],{"class":484},[462,1706,1161],{"class":615},[462,1708,1164],{"class":1146},[462,1710,575],{"class":484},[462,1712,1713,1715,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739],{"class":464,"line":1113},[462,1714,1137],{"class":1136},[462,1716,612],{"class":484},[462,1718,1143],{"class":1142},[462,1720,1277],{"class":1146},[462,1722,1150],{"class":615},[462,1724,1663],{"class":608},[462,1726,448],{"class":484},[462,1728,1286],{"class":487},[462,1730,448],{"class":484},[462,1732,1191],{"class":608},[462,1734,1194],{"class":484},[462,1736,1161],{"class":615},[462,1738,1164],{"class":1146},[462,1740,575],{"class":484},[620,1742],{"data":1743,"kind":1302},"ZGV0ZWN0aW9uczogIDQKaW5kZXg6ICAgICAgIFswLCAxLCAyLCAzXQpwb3NpdGlvbjogICAgW1sxMTAuMCwgNTIuMF0sIFsyMDEuMCwgODEuMF0sIFszMDAuMCwgMjAwLjBdLCBbNDkuMCwgMzEuMF1dCg==",[625,1745,1747],{"id":1746},"whats-being-matched","What's being matched?",[338,1749,1750],{},"Before we compute any cost, picture the problem in 2D: the\nsnapshot's three tracklets (squares) and this frame's four\ndetections (circles). The associator's whole job is to decide\nwhich circle continues which square — and which circle is a\nbrand-new object. The spatial layout below is what the cost\nmatrix in the next section measures.",[453,1752,1754],{"className":455,"code":1753,"language":457,"meta":458,"style":458},"fig, ax = plt.subplots(figsize=(6, 4))\ntp, dp = t.position, d.position\nax.scatter(\n    tp[:, 0],\n    tp[:, 1],\n    s=160,\n    marker=\"s\",\n    color=\"tab:blue\",\n    edgecolor=\"black\",\n    label=\"tracklets (snapshot)\",\n    zorder=3,\n)\nfor i in range(t.batch_size[0]):\n    ax.annotate(\n        f\"id={int(t.id[i])}\",\n        (tp[i, 0], tp[i, 1]),\n        textcoords=\"offset points\",\n        xytext=(8, 6),\n        fontsize=9,\n    )\nax.scatter(\n    dp[:, 0],\n    dp[:, 1],\n    s=90,\n    marker=\"o\",\n    color=\"tab:orange\",\n    edgecolor=\"black\",\n    label=\"detections (this frame)\",\n    zorder=3,\n)\nfor j in range(d.batch_size[0]):\n    ax.annotate(\n        f\"det {j}\",\n        (dp[j, 0], dp[j, 1]),\n        textcoords=\"offset points\",\n        xytext=(8, -12),\n        fontsize=9,\n    )\nax.set_title(\"The matching problem in 2D — which detection continues which tracklet?\")\nax.set_xlabel(\"x\")\nax.set_ylabel(\"y\")\nax.legend(fontsize=8)\nax.grid(alpha=0.3)\nplt.show()\n\n",[347,1755,1756,1796,1824,1836,1849,1859,1871,1888,1904,1920,1936,1947,1951,1980,1992,2027,2058,2074,2093,2105,2110,2120,2131,2142,2154,2170,2186,2201,2217,2228,2233,2259,2270,2289,2320,2335,2356,2367,2372,2393,2414,2435,2456,2478],{"__ignoreMap":458},[462,1757,1758,1761,1763,1766,1768,1771,1773,1776,1778,1781,1783,1785,1788,1790,1793],{"class":464,"line":465},[462,1759,1760],{"class":472},"fig",[462,1762,737],{"class":484},[462,1764,1765],{"class":472}," ax ",[462,1767,707],{"class":706},[462,1769,1770],{"class":472}," plt",[462,1772,448],{"class":484},[462,1774,1775],{"class":608},"subplots",[462,1777,612],{"class":484},[462,1779,1780],{"class":718},"figsize",[462,1782,707],{"class":706},[462,1784,612],{"class":484},[462,1786,1787],{"class":615},"6",[462,1789,737],{"class":484},[462,1791,1792],{"class":615}," 4",[462,1794,1795],{"class":484},"))\n",[462,1797,1798,1801,1803,1806,1808,1810,1812,1814,1816,1819,1821],{"class":464,"line":476},[462,1799,1800],{"class":472},"tp",[462,1802,737],{"class":484},[462,1804,1805],{"class":472}," dp ",[462,1807,707],{"class":706},[462,1809,1325],{"class":472},[462,1811,448],{"class":484},[462,1813,1286],{"class":487},[462,1815,737],{"class":484},[462,1817,1818],{"class":472}," d",[462,1820,448],{"class":484},[462,1822,1823],{"class":487},"position\n",[462,1825,1826,1829,1831,1834],{"class":464,"line":497},[462,1827,1828],{"class":472},"ax",[462,1830,448],{"class":484},[462,1832,1833],{"class":608},"scatter",[462,1835,713],{"class":484},[462,1837,1838,1841,1844,1847],{"class":464,"line":504},[462,1839,1840],{"class":608},"    tp",[462,1842,1843],{"class":484},"[:,",[462,1845,1846],{"class":615}," 0",[462,1848,811],{"class":484},[462,1850,1851,1853,1855,1857],{"class":464,"line":523},[462,1852,1840],{"class":608},[462,1854,1843],{"class":484},[462,1856,859],{"class":615},[462,1858,811],{"class":484},[462,1860,1861,1864,1866,1869],{"class":464,"line":532},[462,1862,1863],{"class":718},"    s",[462,1865,707],{"class":706},[462,1867,1868],{"class":615},"160",[462,1870,529],{"class":484},[462,1872,1873,1876,1878,1881,1884,1886],{"class":464,"line":540},[462,1874,1875],{"class":718},"    marker",[462,1877,707],{"class":706},[462,1879,1164],{"class":1880},"sjJ54",[462,1882,1883],{"class":1146},"s",[462,1885,1164],{"class":1880},[462,1887,529],{"class":484},[462,1889,1890,1893,1895,1897,1900,1902],{"class":464,"line":548},[462,1891,1892],{"class":718},"    color",[462,1894,707],{"class":706},[462,1896,1164],{"class":1880},[462,1898,1899],{"class":1146},"tab:blue",[462,1901,1164],{"class":1880},[462,1903,529],{"class":484},[462,1905,1906,1909,1911,1913,1916,1918],{"class":464,"line":556},[462,1907,1908],{"class":718},"    edgecolor",[462,1910,707],{"class":706},[462,1912,1164],{"class":1880},[462,1914,1915],{"class":1146},"black",[462,1917,1164],{"class":1880},[462,1919,529],{"class":484},[462,1921,1922,1925,1927,1929,1932,1934],{"class":464,"line":564},[462,1923,1924],{"class":718},"    label",[462,1926,707],{"class":706},[462,1928,1164],{"class":1880},[462,1930,1931],{"class":1146},"tracklets (snapshot)",[462,1933,1164],{"class":1880},[462,1935,529],{"class":484},[462,1937,1938,1941,1943,1945],{"class":464,"line":572},[462,1939,1940],{"class":718},"    zorder",[462,1942,707],{"class":706},[462,1944,893],{"class":615},[462,1946,529],{"class":484},[462,1948,1949],{"class":464,"line":578},[462,1950,575],{"class":484},[462,1952,1953,1956,1959,1962,1965,1967,1969,1971,1973,1975,1977],{"class":464,"line":595},[462,1954,1955],{"class":468},"for",[462,1957,1958],{"class":472}," i ",[462,1960,1961],{"class":468},"in",[462,1963,1964],{"class":1136}," range",[462,1966,612],{"class":484},[462,1968,1153],{"class":608},[462,1970,448],{"class":484},[462,1972,1158],{"class":487},[462,1974,1121],{"class":484},[462,1976,616],{"class":615},[462,1978,1979],{"class":484},"]):\n",[462,1981,1982,1985,1987,1990],{"class":464,"line":600},[462,1983,1984],{"class":472},"    ax",[462,1986,448],{"class":484},[462,1988,1989],{"class":608},"annotate",[462,1991,713],{"class":484},[462,1993,1994,1997,2000,2002,2005,2007,2009,2011,2013,2015,2018,2021,2023,2025],{"class":464,"line":1060},[462,1995,1996],{"class":1142},"        f",[462,1998,1999],{"class":1146},"\"id=",[462,2001,1150],{"class":615},[462,2003,2004],{"class":677},"int",[462,2006,612],{"class":484},[462,2008,1153],{"class":608},[462,2010,448],{"class":484},[462,2012,637],{"class":487},[462,2014,1121],{"class":484},[462,2016,2017],{"class":487},"i",[462,2019,2020],{"class":484},"])",[462,2022,1161],{"class":615},[462,2024,1164],{"class":1146},[462,2026,529],{"class":484},[462,2028,2029,2032,2034,2036,2038,2040,2042,2044,2047,2049,2051,2053,2055],{"class":464,"line":1113},[462,2030,2031],{"class":484},"        (",[462,2033,1800],{"class":608},[462,2035,1121],{"class":484},[462,2037,2017],{"class":608},[462,2039,737],{"class":484},[462,2041,1846],{"class":615},[462,2043,748],{"class":484},[462,2045,2046],{"class":608}," tp",[462,2048,1121],{"class":484},[462,2050,2017],{"class":608},[462,2052,737],{"class":484},[462,2054,859],{"class":615},[462,2056,2057],{"class":484},"]),\n",[462,2059,2060,2063,2065,2067,2070,2072],{"class":464,"line":1128},[462,2061,2062],{"class":718},"        textcoords",[462,2064,707],{"class":706},[462,2066,1164],{"class":1880},[462,2068,2069],{"class":1146},"offset points",[462,2071,1164],{"class":1880},[462,2073,529],{"class":484},[462,2075,2076,2079,2081,2083,2086,2088,2091],{"class":464,"line":1133},[462,2077,2078],{"class":718},"        xytext",[462,2080,707],{"class":706},[462,2082,612],{"class":484},[462,2084,2085],{"class":615},"8",[462,2087,737],{"class":484},[462,2089,2090],{"class":615}," 6",[462,2092,763],{"class":484},[462,2094,2095,2098,2100,2103],{"class":464,"line":1169},[462,2096,2097],{"class":718},"        fontsize",[462,2099,707],{"class":706},[462,2101,2102],{"class":615},"9",[462,2104,529],{"class":484},[462,2106,2107],{"class":464,"line":1203},[462,2108,2109],{"class":484},"    )\n",[462,2111,2112,2114,2116,2118],{"class":464,"line":1236},[462,2113,1828],{"class":472},[462,2115,448],{"class":484},[462,2117,1833],{"class":608},[462,2119,713],{"class":484},[462,2121,2122,2125,2127,2129],{"class":464,"line":1268},[462,2123,2124],{"class":608},"    dp",[462,2126,1843],{"class":484},[462,2128,1846],{"class":615},[462,2130,811],{"class":484},[462,2132,2134,2136,2138,2140],{"class":464,"line":2133},23,[462,2135,2124],{"class":608},[462,2137,1843],{"class":484},[462,2139,859],{"class":615},[462,2141,811],{"class":484},[462,2143,2145,2147,2149,2152],{"class":464,"line":2144},24,[462,2146,1863],{"class":718},[462,2148,707],{"class":706},[462,2150,2151],{"class":615},"90",[462,2153,529],{"class":484},[462,2155,2157,2159,2161,2163,2166,2168],{"class":464,"line":2156},25,[462,2158,1875],{"class":718},[462,2160,707],{"class":706},[462,2162,1164],{"class":1880},[462,2164,2165],{"class":1146},"o",[462,2167,1164],{"class":1880},[462,2169,529],{"class":484},[462,2171,2173,2175,2177,2179,2182,2184],{"class":464,"line":2172},26,[462,2174,1892],{"class":718},[462,2176,707],{"class":706},[462,2178,1164],{"class":1880},[462,2180,2181],{"class":1146},"tab:orange",[462,2183,1164],{"class":1880},[462,2185,529],{"class":484},[462,2187,2189,2191,2193,2195,2197,2199],{"class":464,"line":2188},27,[462,2190,1908],{"class":718},[462,2192,707],{"class":706},[462,2194,1164],{"class":1880},[462,2196,1915],{"class":1146},[462,2198,1164],{"class":1880},[462,2200,529],{"class":484},[462,2202,2204,2206,2208,2210,2213,2215],{"class":464,"line":2203},28,[462,2205,1924],{"class":718},[462,2207,707],{"class":706},[462,2209,1164],{"class":1880},[462,2211,2212],{"class":1146},"detections (this frame)",[462,2214,1164],{"class":1880},[462,2216,529],{"class":484},[462,2218,2220,2222,2224,2226],{"class":464,"line":2219},29,[462,2221,1940],{"class":718},[462,2223,707],{"class":706},[462,2225,893],{"class":615},[462,2227,529],{"class":484},[462,2229,2231],{"class":464,"line":2230},30,[462,2232,575],{"class":484},[462,2234,2236,2238,2241,2243,2245,2247,2249,2251,2253,2255,2257],{"class":464,"line":2235},31,[462,2237,1955],{"class":468},[462,2239,2240],{"class":472}," j ",[462,2242,1961],{"class":468},[462,2244,1964],{"class":1136},[462,2246,612],{"class":484},[462,2248,1663],{"class":608},[462,2250,448],{"class":484},[462,2252,1158],{"class":487},[462,2254,1121],{"class":484},[462,2256,616],{"class":615},[462,2258,1979],{"class":484},[462,2260,2262,2264,2266,2268],{"class":464,"line":2261},32,[462,2263,1984],{"class":472},[462,2265,448],{"class":484},[462,2267,1989],{"class":608},[462,2269,713],{"class":484},[462,2271,2273,2275,2278,2280,2283,2285,2287],{"class":464,"line":2272},33,[462,2274,1996],{"class":1142},[462,2276,2277],{"class":1146},"\"det ",[462,2279,1150],{"class":615},[462,2281,2282],{"class":608},"j",[462,2284,1161],{"class":615},[462,2286,1164],{"class":1146},[462,2288,529],{"class":484},[462,2290,2292,2294,2297,2299,2301,2303,2305,2307,2310,2312,2314,2316,2318],{"class":464,"line":2291},34,[462,2293,2031],{"class":484},[462,2295,2296],{"class":608},"dp",[462,2298,1121],{"class":484},[462,2300,2282],{"class":608},[462,2302,737],{"class":484},[462,2304,1846],{"class":615},[462,2306,748],{"class":484},[462,2308,2309],{"class":608}," dp",[462,2311,1121],{"class":484},[462,2313,2282],{"class":608},[462,2315,737],{"class":484},[462,2317,859],{"class":615},[462,2319,2057],{"class":484},[462,2321,2323,2325,2327,2329,2331,2333],{"class":464,"line":2322},35,[462,2324,2062],{"class":718},[462,2326,707],{"class":706},[462,2328,1164],{"class":1880},[462,2330,2069],{"class":1146},[462,2332,1164],{"class":1880},[462,2334,529],{"class":484},[462,2336,2338,2340,2342,2344,2346,2348,2351,2354],{"class":464,"line":2337},36,[462,2339,2078],{"class":718},[462,2341,707],{"class":706},[462,2343,612],{"class":484},[462,2345,2085],{"class":615},[462,2347,737],{"class":484},[462,2349,2350],{"class":706}," -",[462,2352,2353],{"class":615},"12",[462,2355,763],{"class":484},[462,2357,2359,2361,2363,2365],{"class":464,"line":2358},37,[462,2360,2097],{"class":718},[462,2362,707],{"class":706},[462,2364,2102],{"class":615},[462,2366,529],{"class":484},[462,2368,2370],{"class":464,"line":2369},38,[462,2371,2109],{"class":484},[462,2373,2375,2377,2379,2382,2384,2386,2389,2391],{"class":464,"line":2374},39,[462,2376,1828],{"class":472},[462,2378,448],{"class":484},[462,2380,2381],{"class":608},"set_title",[462,2383,612],{"class":484},[462,2385,1164],{"class":1880},[462,2387,2388],{"class":1146},"The matching problem in 2D — which detection continues which tracklet?",[462,2390,1164],{"class":1880},[462,2392,575],{"class":484},[462,2394,2396,2398,2400,2403,2405,2407,2410,2412],{"class":464,"line":2395},40,[462,2397,1828],{"class":472},[462,2399,448],{"class":484},[462,2401,2402],{"class":608},"set_xlabel",[462,2404,612],{"class":484},[462,2406,1164],{"class":1880},[462,2408,2409],{"class":1146},"x",[462,2411,1164],{"class":1880},[462,2413,575],{"class":484},[462,2415,2417,2419,2421,2424,2426,2428,2431,2433],{"class":464,"line":2416},41,[462,2418,1828],{"class":472},[462,2420,448],{"class":484},[462,2422,2423],{"class":608},"set_ylabel",[462,2425,612],{"class":484},[462,2427,1164],{"class":1880},[462,2429,2430],{"class":1146},"y",[462,2432,1164],{"class":1880},[462,2434,575],{"class":484},[462,2436,2438,2440,2442,2445,2447,2450,2452,2454],{"class":464,"line":2437},42,[462,2439,1828],{"class":472},[462,2441,448],{"class":484},[462,2443,2444],{"class":608},"legend",[462,2446,612],{"class":484},[462,2448,2449],{"class":718},"fontsize",[462,2451,707],{"class":706},[462,2453,2085],{"class":615},[462,2455,575],{"class":484},[462,2457,2459,2461,2463,2466,2468,2471,2473,2476],{"class":464,"line":2458},43,[462,2460,1828],{"class":472},[462,2462,448],{"class":484},[462,2464,2465],{"class":608},"grid",[462,2467,612],{"class":484},[462,2469,2470],{"class":718},"alpha",[462,2472,707],{"class":706},[462,2474,2475],{"class":615},"0.3",[462,2477,575],{"class":484},[462,2479,2481,2484,2486,2489],{"class":464,"line":2480},44,[462,2482,2483],{"class":472},"plt",[462,2485,448],{"class":484},[462,2487,2488],{"class":608},"show",[462,2490,2491],{"class":484},"()\n",[338,2493,2494],{},[2495,2496],"img",{"alt":458,"src":2497},"\u002F_nb\u002F3be53588a8891686.png",[338,2499,2500],{},"Detections 0, 1, 3 each sit beside a tracklet; detection 2 (far\ntop-right) has no nearby tracklet — it should fall through as a\nnew identity. Keep that picture in mind as we build the cost.",[625,2502,2504],{"id":2503},"costexpression-cost-matrix-with-un-applied-gates","CostExpression — cost matrix with un-applied gates",[338,2506,2507,2508,2511,2512,2514,2515,2518,2519,2523],{},"After a ",[347,2509,2510],{},"CostProducer"," runs, it returns a ",[347,2513,422],{},": an\n(N, M) cost matrix together with optional ",[342,2516,2517],{},"un-applied"," gates\nand bias. Carrying the gates separately lets a downstream\nnode decide ",[2520,2521,2522],"em",{},"when"," to apply them — handy if you want to merge\ncosts from multiple branches before applying gates.",[338,2525,2526],{},"Below: a simple 3×4 cost matrix (Euclidean distance between\nthe tracklets' and detections' positions), with no gates yet.",[453,2528,2530],{"className":455,"code":2529,"language":457,"meta":458,"style":458},"dist = torch.cdist(t.position, d.position, p=2.0)\ncost = CostExpression.from_matrix(dist)\nprint(\"matrix (lower = closer):\")\nprint(cost.matrix.round(decimals=2))\nprint(f\"\\ngates attached: pair={cost.gate_pair}, cs={cost.gate_cs}, ds={cost.gate_ds}\")\n\n",[347,2531,2532,2575,2597,2612,2642],{"__ignoreMap":458},[462,2533,2534,2537,2539,2542,2544,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2568,2570,2573],{"class":464,"line":465},[462,2535,2536],{"class":472},"dist ",[462,2538,707],{"class":706},[462,2540,2541],{"class":472}," torch",[462,2543,448],{"class":484},[462,2545,2546],{"class":608},"cdist",[462,2548,612],{"class":484},[462,2550,1153],{"class":608},[462,2552,448],{"class":484},[462,2554,1286],{"class":487},[462,2556,737],{"class":484},[462,2558,1818],{"class":608},[462,2560,448],{"class":484},[462,2562,1286],{"class":487},[462,2564,737],{"class":484},[462,2566,2567],{"class":718}," p",[462,2569,707],{"class":706},[462,2571,2572],{"class":615},"2.0",[462,2574,575],{"class":484},[462,2576,2577,2580,2582,2585,2587,2590,2592,2595],{"class":464,"line":476},[462,2578,2579],{"class":472},"cost ",[462,2581,707],{"class":706},[462,2583,2584],{"class":472}," CostExpression",[462,2586,448],{"class":484},[462,2588,2589],{"class":608},"from_matrix",[462,2591,612],{"class":484},[462,2593,2594],{"class":608},"dist",[462,2596,575],{"class":484},[462,2598,2599,2601,2603,2605,2608,2610],{"class":464,"line":497},[462,2600,1137],{"class":1136},[462,2602,612],{"class":484},[462,2604,1164],{"class":1880},[462,2606,2607],{"class":1146},"matrix (lower = closer):",[462,2609,1164],{"class":1880},[462,2611,575],{"class":484},[462,2613,2614,2616,2618,2620,2622,2625,2627,2630,2632,2635,2637,2640],{"class":464,"line":504},[462,2615,1137],{"class":1136},[462,2617,612],{"class":484},[462,2619,203],{"class":608},[462,2621,448],{"class":484},[462,2623,2624],{"class":487},"matrix",[462,2626,448],{"class":484},[462,2628,2629],{"class":608},"round",[462,2631,612],{"class":484},[462,2633,2634],{"class":718},"decimals",[462,2636,707],{"class":706},[462,2638,2639],{"class":615},"2",[462,2641,1795],{"class":484},[462,2643,2644,2646,2648,2650,2652,2656,2659,2661,2663,2665,2668,2670,2673,2675,2677,2679,2682,2684,2687,2689,2691,2693,2696,2698,2700],{"class":464,"line":523},[462,2645,1137],{"class":1136},[462,2647,612],{"class":484},[462,2649,1143],{"class":1142},[462,2651,1164],{"class":1146},[462,2653,2655],{"class":2654},"s_hVV","\\n",[462,2657,2658],{"class":1146},"gates attached: pair=",[462,2660,1150],{"class":615},[462,2662,203],{"class":608},[462,2664,448],{"class":484},[462,2666,2667],{"class":487},"gate_pair",[462,2669,1161],{"class":615},[462,2671,2672],{"class":1146},", cs=",[462,2674,1150],{"class":615},[462,2676,203],{"class":608},[462,2678,448],{"class":484},[462,2680,2681],{"class":487},"gate_cs",[462,2683,1161],{"class":615},[462,2685,2686],{"class":1146},", ds=",[462,2688,1150],{"class":615},[462,2690,203],{"class":608},[462,2692,448],{"class":484},[462,2694,2695],{"class":487},"gate_ds",[462,2697,1161],{"class":615},[462,2699,1164],{"class":1146},[462,2701,575],{"class":484},[620,2703],{"data":2704,"kind":1302},"bWF0cml4IChsb3dlciA9IGNsb3Nlcik6CnRlbnNvcihbWyAxMC4yMDAwLCAxMDUuNjUwMCwgMjUwLjAwMDAsICA1NC40MjAwXSwKICAgICAgICBbIDk0LjI1MDAsICAgMS40MTAwLCAxNTYuMjAwMCwgMTU4Ljc1MDBdLAogICAgICAgIFsgNjMuOTEwMCwgMTU5LjM4MDAsIDMwMi4zMjAwLCAgIDEuNDEwMF1dKQoKZ2F0ZXMgYXR0YWNoZWQ6IHBhaXI9Tm9uZSwgY3M9Tm9uZSwgZHM9Tm9uZQo=",[338,2706,2707,2708,2710,2711,2713],{},"Visualizing the cost matrix as a heatmap makes the structure\nobvious: tracklet ",[2520,2709,2017],{}," should match detection ",[2520,2712,2282],{}," where the\ncell is dark.",[453,2715,2717],{"className":455,"code":2716,"language":457,"meta":458,"style":458},"fig, ax = plt.subplots(figsize=(5, 4))\nim = ax.imshow(cost.matrix.numpy(), cmap=\"viridis\")\nax.set_xlabel(\"detection index\")\nax.set_ylabel(\"tracklet index\")\nax.set_title(\"CostExpression.matrix — Euclidean distance over positions\")\nax.set_xticks(range(d.batch_size[0]))\nax.set_yticks(range(t.batch_size[0]))\nfor i in range(t.batch_size[0]):\n    for j in range(d.batch_size[0]):\n        ax.text(\n            j,\n            i,\n            f\"{cost.matrix[i, j]:.0f}\",\n            ha=\"center\",\n            va=\"center\",\n            color=\"white\",\n            fontsize=9,\n        )\nplt.colorbar(im, ax=ax, label=\"cost (lower = match)\")\nplt.show()\n\n",[347,2718,2719,2751,2796,2815,2834,2853,2882,2909,2933,2958,2970,2977,2984,3019,3035,3050,3066,3077,3082,3120],{"__ignoreMap":458},[462,2720,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749],{"class":464,"line":465},[462,2722,1760],{"class":472},[462,2724,737],{"class":484},[462,2726,1765],{"class":472},[462,2728,707],{"class":706},[462,2730,1770],{"class":472},[462,2732,448],{"class":484},[462,2734,1775],{"class":608},[462,2736,612],{"class":484},[462,2738,1780],{"class":718},[462,2740,707],{"class":706},[462,2742,612],{"class":484},[462,2744,849],{"class":615},[462,2746,737],{"class":484},[462,2748,1792],{"class":615},[462,2750,1795],{"class":484},[462,2752,2753,2756,2758,2761,2763,2766,2768,2770,2772,2774,2776,2779,2782,2785,2787,2789,2792,2794],{"class":464,"line":476},[462,2754,2755],{"class":472},"im ",[462,2757,707],{"class":706},[462,2759,2760],{"class":472}," ax",[462,2762,448],{"class":484},[462,2764,2765],{"class":608},"imshow",[462,2767,612],{"class":484},[462,2769,203],{"class":608},[462,2771,448],{"class":484},[462,2773,2624],{"class":487},[462,2775,448],{"class":484},[462,2777,2778],{"class":608},"numpy",[462,2780,2781],{"class":484},"(),",[462,2783,2784],{"class":718}," cmap",[462,2786,707],{"class":706},[462,2788,1164],{"class":1880},[462,2790,2791],{"class":1146},"viridis",[462,2793,1164],{"class":1880},[462,2795,575],{"class":484},[462,2797,2798,2800,2802,2804,2806,2808,2811,2813],{"class":464,"line":497},[462,2799,1828],{"class":472},[462,2801,448],{"class":484},[462,2803,2402],{"class":608},[462,2805,612],{"class":484},[462,2807,1164],{"class":1880},[462,2809,2810],{"class":1146},"detection index",[462,2812,1164],{"class":1880},[462,2814,575],{"class":484},[462,2816,2817,2819,2821,2823,2825,2827,2830,2832],{"class":464,"line":504},[462,2818,1828],{"class":472},[462,2820,448],{"class":484},[462,2822,2423],{"class":608},[462,2824,612],{"class":484},[462,2826,1164],{"class":1880},[462,2828,2829],{"class":1146},"tracklet index",[462,2831,1164],{"class":1880},[462,2833,575],{"class":484},[462,2835,2836,2838,2840,2842,2844,2846,2849,2851],{"class":464,"line":523},[462,2837,1828],{"class":472},[462,2839,448],{"class":484},[462,2841,2381],{"class":608},[462,2843,612],{"class":484},[462,2845,1164],{"class":1880},[462,2847,2848],{"class":1146},"CostExpression.matrix — Euclidean distance over positions",[462,2850,1164],{"class":1880},[462,2852,575],{"class":484},[462,2854,2855,2857,2859,2862,2864,2867,2869,2871,2873,2875,2877,2879],{"class":464,"line":532},[462,2856,1828],{"class":472},[462,2858,448],{"class":484},[462,2860,2861],{"class":608},"set_xticks",[462,2863,612],{"class":484},[462,2865,2866],{"class":1136},"range",[462,2868,612],{"class":484},[462,2870,1663],{"class":608},[462,2872,448],{"class":484},[462,2874,1158],{"class":487},[462,2876,1121],{"class":484},[462,2878,616],{"class":615},[462,2880,2881],{"class":484},"]))\n",[462,2883,2884,2886,2888,2891,2893,2895,2897,2899,2901,2903,2905,2907],{"class":464,"line":540},[462,2885,1828],{"class":472},[462,2887,448],{"class":484},[462,2889,2890],{"class":608},"set_yticks",[462,2892,612],{"class":484},[462,2894,2866],{"class":1136},[462,2896,612],{"class":484},[462,2898,1153],{"class":608},[462,2900,448],{"class":484},[462,2902,1158],{"class":487},[462,2904,1121],{"class":484},[462,2906,616],{"class":615},[462,2908,2881],{"class":484},[462,2910,2911,2913,2915,2917,2919,2921,2923,2925,2927,2929,2931],{"class":464,"line":548},[462,2912,1955],{"class":468},[462,2914,1958],{"class":472},[462,2916,1961],{"class":468},[462,2918,1964],{"class":1136},[462,2920,612],{"class":484},[462,2922,1153],{"class":608},[462,2924,448],{"class":484},[462,2926,1158],{"class":487},[462,2928,1121],{"class":484},[462,2930,616],{"class":615},[462,2932,1979],{"class":484},[462,2934,2935,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956],{"class":464,"line":556},[462,2936,2937],{"class":468},"    for",[462,2939,2240],{"class":472},[462,2941,1961],{"class":468},[462,2943,1964],{"class":1136},[462,2945,612],{"class":484},[462,2947,1663],{"class":608},[462,2949,448],{"class":484},[462,2951,1158],{"class":487},[462,2953,1121],{"class":484},[462,2955,616],{"class":615},[462,2957,1979],{"class":484},[462,2959,2960,2963,2965,2968],{"class":464,"line":564},[462,2961,2962],{"class":472},"        ax",[462,2964,448],{"class":484},[462,2966,2967],{"class":608},"text",[462,2969,713],{"class":484},[462,2971,2972,2975],{"class":464,"line":572},[462,2973,2974],{"class":608},"            j",[462,2976,529],{"class":484},[462,2978,2979,2982],{"class":464,"line":578},[462,2980,2981],{"class":608},"            i",[462,2983,529],{"class":484},[462,2985,2986,2989,2991,2993,2995,2997,2999,3001,3003,3005,3008,3010,3013,3015,3017],{"class":464,"line":595},[462,2987,2988],{"class":1142},"            f",[462,2990,1164],{"class":1146},[462,2992,1150],{"class":615},[462,2994,203],{"class":608},[462,2996,448],{"class":484},[462,2998,2624],{"class":487},[462,3000,1121],{"class":484},[462,3002,2017],{"class":487},[462,3004,737],{"class":484},[462,3006,3007],{"class":487}," j",[462,3009,1377],{"class":484},[462,3011,3012],{"class":1142},":.0f",[462,3014,1161],{"class":615},[462,3016,1164],{"class":1146},[462,3018,529],{"class":484},[462,3020,3021,3024,3026,3028,3031,3033],{"class":464,"line":600},[462,3022,3023],{"class":718},"            ha",[462,3025,707],{"class":706},[462,3027,1164],{"class":1880},[462,3029,3030],{"class":1146},"center",[462,3032,1164],{"class":1880},[462,3034,529],{"class":484},[462,3036,3037,3040,3042,3044,3046,3048],{"class":464,"line":1060},[462,3038,3039],{"class":718},"            va",[462,3041,707],{"class":706},[462,3043,1164],{"class":1880},[462,3045,3030],{"class":1146},[462,3047,1164],{"class":1880},[462,3049,529],{"class":484},[462,3051,3052,3055,3057,3059,3062,3064],{"class":464,"line":1113},[462,3053,3054],{"class":718},"            color",[462,3056,707],{"class":706},[462,3058,1164],{"class":1880},[462,3060,3061],{"class":1146},"white",[462,3063,1164],{"class":1880},[462,3065,529],{"class":484},[462,3067,3068,3071,3073,3075],{"class":464,"line":1128},[462,3069,3070],{"class":718},"            fontsize",[462,3072,707],{"class":706},[462,3074,2102],{"class":615},[462,3076,529],{"class":484},[462,3078,3079],{"class":464,"line":1133},[462,3080,3081],{"class":484},"        )\n",[462,3083,3084,3086,3088,3091,3093,3096,3098,3100,3102,3104,3106,3109,3111,3113,3116,3118],{"class":464,"line":1169},[462,3085,2483],{"class":472},[462,3087,448],{"class":484},[462,3089,3090],{"class":608},"colorbar",[462,3092,612],{"class":484},[462,3094,3095],{"class":608},"im",[462,3097,737],{"class":484},[462,3099,2760],{"class":718},[462,3101,707],{"class":706},[462,3103,1828],{"class":608},[462,3105,737],{"class":484},[462,3107,3108],{"class":718}," label",[462,3110,707],{"class":706},[462,3112,1164],{"class":1880},[462,3114,3115],{"class":1146},"cost (lower = match)",[462,3117,1164],{"class":1880},[462,3119,575],{"class":484},[462,3121,3122,3124,3126,3128],{"class":464,"line":1203},[462,3123,2483],{"class":472},[462,3125,448],{"class":484},[462,3127,2488],{"class":608},[462,3129,2491],{"class":484},[338,3131,3132],{},[2495,3133],{"alt":458,"src":3134},"\u002F_nb\u002Fa32eaa6b2498e90e.png",[625,3136,3138],{"id":3137},"gate-algebraic-variant-for-filtering-pairs","Gate — algebraic variant for filtering pairs",[338,3140,631,3141,3144],{},[347,3142,3143],{},"Gate"," is a small union type with four constructors:",[3146,3147,3148,3155,3161,3167],"ul",{},[3149,3150,3151,3154],"li",{},[347,3152,3153],{},"Gate.PerPair(mask: (N, M))"," — pairwise boolean accept\u002Freject.",[3149,3156,3157,3160],{},[347,3158,3159],{},"Gate.PerCs(mask: (N,))"," — drop entire tracklet rows.",[3149,3162,3163,3166],{},[347,3164,3165],{},"Gate.PerDs(mask: (M,))"," — drop entire detection columns.",[3149,3168,3169,3172],{},[347,3170,3171],{},"Gate.CostBias(matrix: (N, M))"," — additive cost penalty.",[338,3174,3175,3176,3179,3180,3183],{},"Gates compose under conjunction via ",[347,3177,3178],{},"Gate.combine(a, b)"," —\ncross-kind combinations are promoted to the smallest common\nrepresentation (e.g., ",[347,3181,3182],{},"PerCs ∧ PerDs → PerPair",").",[338,3185,3186,3187,3189,3190,3192],{},"Below: build a per-pair gate that only allows tracklet ",[2520,3188,2017],{}," to\nmatch detection ",[2520,3191,2282],{}," if their classes agree, then visualize\nthe gated cost.",[453,3194,3196],{"className":455,"code":3195,"language":457,"meta":458,"style":458},"# Pretend the user adds a class field to both tracklets and detections.\nt_class = torch.tensor([0, 1, 0])  # tracklet classes\nd_class = torch.tensor([0, 1, 2, 0])  # detection classes\nsame_class = t_class[:, None] == d_class[None, :]  # (N, M) bool\n\ngate = Gate.PerPair(mask=same_class)\ncost_gated = gate.apply(cost)\n\n# ``materialize`` applies all attached gates to produce a final cost\n# matrix where blocked pairs become +inf.\nmaterialized = cost_gated.materialize()\nprint(\"After ClassGate (only same-class pairs allowed):\")\nprint(materialized.round(decimals=1))\n\n",[347,3197,3198,3203,3233,3267,3303,3307,3334,3355,3359,3364,3369,3386,3401],{"__ignoreMap":458},[462,3199,3200],{"class":464,"line":465},[462,3201,3202],{"class":697},"# Pretend the user adds a class field to both tracklets and detections.\n",[462,3204,3205,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230],{"class":464,"line":476},[462,3206,3207],{"class":472},"t_class ",[462,3209,707],{"class":706},[462,3211,2541],{"class":472},[462,3213,448],{"class":484},[462,3215,728],{"class":608},[462,3217,731],{"class":484},[462,3219,616],{"class":615},[462,3221,737],{"class":484},[462,3223,859],{"class":615},[462,3225,737],{"class":484},[462,3227,1846],{"class":615},[462,3229,2020],{"class":484},[462,3231,3232],{"class":697},"  # tracklet classes\n",[462,3234,3235,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262,3264],{"class":464,"line":497},[462,3236,3237],{"class":472},"d_class ",[462,3239,707],{"class":706},[462,3241,2541],{"class":472},[462,3243,448],{"class":484},[462,3245,728],{"class":608},[462,3247,731],{"class":484},[462,3249,616],{"class":615},[462,3251,737],{"class":484},[462,3253,859],{"class":615},[462,3255,737],{"class":484},[462,3257,969],{"class":615},[462,3259,737],{"class":484},[462,3261,1846],{"class":615},[462,3263,2020],{"class":484},[462,3265,3266],{"class":697},"  # detection classes\n",[462,3268,3269,3272,3274,3277,3279,3283,3285,3287,3290,3292,3295,3297,3300],{"class":464,"line":504},[462,3270,3271],{"class":472},"same_class ",[462,3273,707],{"class":706},[462,3275,3276],{"class":472}," t_class",[462,3278,1843],{"class":484},[462,3280,3282],{"class":3281},"s39Yj"," None",[462,3284,1377],{"class":484},[462,3286,1336],{"class":706},[462,3288,3289],{"class":472}," d_class",[462,3291,1121],{"class":484},[462,3293,3294],{"class":3281},"None",[462,3296,737],{"class":484},[462,3298,3299],{"class":484}," :]",[462,3301,3302],{"class":697},"  # (N, M) bool\n",[462,3304,3305],{"class":464,"line":523},[462,3306,501],{"emptyLinePlaceholder":500},[462,3308,3309,3312,3314,3317,3319,3322,3324,3327,3329,3332],{"class":464,"line":532},[462,3310,3311],{"class":472},"gate ",[462,3313,707],{"class":706},[462,3315,3316],{"class":472}," Gate",[462,3318,448],{"class":484},[462,3320,3321],{"class":608},"PerPair",[462,3323,612],{"class":484},[462,3325,3326],{"class":718},"mask",[462,3328,707],{"class":706},[462,3330,3331],{"class":608},"same_class",[462,3333,575],{"class":484},[462,3335,3336,3339,3341,3344,3346,3349,3351,3353],{"class":464,"line":540},[462,3337,3338],{"class":472},"cost_gated ",[462,3340,707],{"class":706},[462,3342,3343],{"class":472}," gate",[462,3345,448],{"class":484},[462,3347,3348],{"class":608},"apply",[462,3350,612],{"class":484},[462,3352,203],{"class":608},[462,3354,575],{"class":484},[462,3356,3357],{"class":464,"line":548},[462,3358,501],{"emptyLinePlaceholder":500},[462,3360,3361],{"class":464,"line":556},[462,3362,3363],{"class":697},"# ``materialize`` applies all attached gates to produce a final cost\n",[462,3365,3366],{"class":464,"line":564},[462,3367,3368],{"class":697},"# matrix where blocked pairs become +inf.\n",[462,3370,3371,3374,3376,3379,3381,3384],{"class":464,"line":572},[462,3372,3373],{"class":472},"materialized ",[462,3375,707],{"class":706},[462,3377,3378],{"class":472}," cost_gated",[462,3380,448],{"class":484},[462,3382,3383],{"class":608},"materialize",[462,3385,2491],{"class":484},[462,3387,3388,3390,3392,3394,3397,3399],{"class":464,"line":578},[462,3389,1137],{"class":1136},[462,3391,612],{"class":484},[462,3393,1164],{"class":1880},[462,3395,3396],{"class":1146},"After ClassGate (only same-class pairs allowed):",[462,3398,1164],{"class":1880},[462,3400,575],{"class":484},[462,3402,3403,3405,3407,3410,3412,3414,3416,3418,3420,3423],{"class":464,"line":595},[462,3404,1137],{"class":1136},[462,3406,612],{"class":484},[462,3408,3409],{"class":608},"materialized",[462,3411,448],{"class":484},[462,3413,2629],{"class":608},[462,3415,612],{"class":484},[462,3417,2634],{"class":718},[462,3419,707],{"class":706},[462,3421,3422],{"class":615},"1",[462,3424,1795],{"class":484},[620,3426],{"data":3427,"kind":1302},"QWZ0ZXIgQ2xhc3NHYXRlIChvbmx5IHNhbWUtY2xhc3MgcGFpcnMgYWxsb3dlZCk6CnRlbnNvcihbWzEwLjIwMDAsICAgICBpbmYsICAgICBpbmYsIDU0LjQwMDBdLAogICAgICAgIFsgICAgaW5mLCAgMS40MDAwLCAgICAgaW5mLCAgICAgaW5mXSwKICAgICAgICBbNjMuOTAwMCwgICAgIGluZiwgICAgIGluZiwgIDEuNDAwMF1dKQo=",[453,3429,3431],{"className":455,"code":3430,"language":457,"meta":458,"style":458},"fig, axes = plt.subplots(1, 2, figsize=(10, 4))\nfor ax, (m, title) in zip(\n    axes, [(cost.matrix, \"before gate\"), (materialized, \"after class gate\")]\n):\n    disp = m.clone()\n    disp[torch.isinf(disp)] = m[~torch.isinf(disp)].max() * 2\n    im = ax.imshow(disp.numpy(), cmap=\"viridis\")\n    ax.set_xlabel(\"detection index\")\n    ax.set_ylabel(\"tracklet index\")\n    ax.set_title(title)\n    for i in range(t.batch_size[0]):\n        for j in range(d.batch_size[0]):\n            label = \"∞\" if torch.isinf(m[i, j]) else f\"{m[i, j]:.0f}\"\n            ax.text(j, i, label, ha=\"center\", va=\"center\", color=\"white\", fontsize=9)\nplt.tight_layout()\nplt.show()\n\n",[347,3432,3433,3475,3505,3549,3554,3571,3627,3662,3680,3698,3713,3737,3762,3828,3900,3911],{"__ignoreMap":458},[462,3434,3435,3437,3439,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3463,3465,3467,3469,3471,3473],{"class":464,"line":465},[462,3436,1760],{"class":472},[462,3438,737],{"class":484},[462,3440,3441],{"class":472}," axes ",[462,3443,707],{"class":706},[462,3445,1770],{"class":472},[462,3447,448],{"class":484},[462,3449,1775],{"class":608},[462,3451,612],{"class":484},[462,3453,3422],{"class":615},[462,3455,737],{"class":484},[462,3457,969],{"class":615},[462,3459,737],{"class":484},[462,3461,3462],{"class":718}," figsize",[462,3464,707],{"class":706},[462,3466,612],{"class":484},[462,3468,734],{"class":615},[462,3470,737],{"class":484},[462,3472,1792],{"class":615},[462,3474,1795],{"class":484},[462,3476,3477,3479,3481,3483,3486,3489,3491,3494,3497,3500,3503],{"class":464,"line":476},[462,3478,1955],{"class":468},[462,3480,2760],{"class":472},[462,3482,737],{"class":484},[462,3484,3485],{"class":484}," (",[462,3487,3488],{"class":472},"m",[462,3490,737],{"class":484},[462,3492,3493],{"class":472}," title",[462,3495,3496],{"class":484},")",[462,3498,3499],{"class":468}," in",[462,3501,3502],{"class":1136}," zip",[462,3504,713],{"class":484},[462,3506,3507,3510,3512,3515,3517,3519,3521,3523,3526,3529,3531,3534,3536,3538,3540,3542,3545,3547],{"class":464,"line":497},[462,3508,3509],{"class":608},"    axes",[462,3511,737],{"class":484},[462,3513,3514],{"class":484}," [(",[462,3516,203],{"class":608},[462,3518,448],{"class":484},[462,3520,2624],{"class":487},[462,3522,737],{"class":484},[462,3524,3525],{"class":1880}," \"",[462,3527,3528],{"class":1146},"before gate",[462,3530,1164],{"class":1880},[462,3532,3533],{"class":484},"),",[462,3535,3485],{"class":484},[462,3537,3409],{"class":608},[462,3539,737],{"class":484},[462,3541,3525],{"class":1880},[462,3543,3544],{"class":1146},"after class gate",[462,3546,1164],{"class":1880},[462,3548,1350],{"class":484},[462,3550,3551],{"class":464,"line":504},[462,3552,3553],{"class":484},"):\n",[462,3555,3556,3559,3561,3564,3566,3569],{"class":464,"line":523},[462,3557,3558],{"class":472},"    disp ",[462,3560,707],{"class":706},[462,3562,3563],{"class":472}," m",[462,3565,448],{"class":484},[462,3567,3568],{"class":608},"clone",[462,3570,2491],{"class":484},[462,3572,3573,3576,3578,3580,3582,3585,3587,3590,3593,3596,3598,3600,3603,3605,3607,3609,3611,3613,3616,3619,3621,3624],{"class":464,"line":532},[462,3574,3575],{"class":472},"    disp",[462,3577,1121],{"class":484},[462,3579,603],{"class":472},[462,3581,448],{"class":484},[462,3583,3584],{"class":608},"isinf",[462,3586,612],{"class":484},[462,3588,3589],{"class":608},"disp",[462,3591,3592],{"class":484},")]",[462,3594,3595],{"class":706}," =",[462,3597,3563],{"class":472},[462,3599,1121],{"class":484},[462,3601,3602],{"class":706},"~",[462,3604,603],{"class":472},[462,3606,448],{"class":484},[462,3608,3584],{"class":608},[462,3610,612],{"class":484},[462,3612,3589],{"class":608},[462,3614,3615],{"class":484},")].",[462,3617,3618],{"class":608},"max",[462,3620,1194],{"class":484},[462,3622,3623],{"class":706}," *",[462,3625,3626],{"class":615}," 2\n",[462,3628,3629,3632,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660],{"class":464,"line":540},[462,3630,3631],{"class":472},"    im ",[462,3633,707],{"class":706},[462,3635,2760],{"class":472},[462,3637,448],{"class":484},[462,3639,2765],{"class":608},[462,3641,612],{"class":484},[462,3643,3589],{"class":608},[462,3645,448],{"class":484},[462,3647,2778],{"class":608},[462,3649,2781],{"class":484},[462,3651,2784],{"class":718},[462,3653,707],{"class":706},[462,3655,1164],{"class":1880},[462,3657,2791],{"class":1146},[462,3659,1164],{"class":1880},[462,3661,575],{"class":484},[462,3663,3664,3666,3668,3670,3672,3674,3676,3678],{"class":464,"line":548},[462,3665,1984],{"class":472},[462,3667,448],{"class":484},[462,3669,2402],{"class":608},[462,3671,612],{"class":484},[462,3673,1164],{"class":1880},[462,3675,2810],{"class":1146},[462,3677,1164],{"class":1880},[462,3679,575],{"class":484},[462,3681,3682,3684,3686,3688,3690,3692,3694,3696],{"class":464,"line":556},[462,3683,1984],{"class":472},[462,3685,448],{"class":484},[462,3687,2423],{"class":608},[462,3689,612],{"class":484},[462,3691,1164],{"class":1880},[462,3693,2829],{"class":1146},[462,3695,1164],{"class":1880},[462,3697,575],{"class":484},[462,3699,3700,3702,3704,3706,3708,3711],{"class":464,"line":564},[462,3701,1984],{"class":472},[462,3703,448],{"class":484},[462,3705,2381],{"class":608},[462,3707,612],{"class":484},[462,3709,3710],{"class":608},"title",[462,3712,575],{"class":484},[462,3714,3715,3717,3719,3721,3723,3725,3727,3729,3731,3733,3735],{"class":464,"line":572},[462,3716,2937],{"class":468},[462,3718,1958],{"class":472},[462,3720,1961],{"class":468},[462,3722,1964],{"class":1136},[462,3724,612],{"class":484},[462,3726,1153],{"class":608},[462,3728,448],{"class":484},[462,3730,1158],{"class":487},[462,3732,1121],{"class":484},[462,3734,616],{"class":615},[462,3736,1979],{"class":484},[462,3738,3739,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760],{"class":464,"line":578},[462,3740,3741],{"class":468},"        for",[462,3743,2240],{"class":472},[462,3745,1961],{"class":468},[462,3747,1964],{"class":1136},[462,3749,612],{"class":484},[462,3751,1663],{"class":608},[462,3753,448],{"class":484},[462,3755,1158],{"class":487},[462,3757,1121],{"class":484},[462,3759,616],{"class":615},[462,3761,1979],{"class":484},[462,3763,3764,3767,3769,3771,3774,3776,3779,3781,3783,3785,3787,3789,3791,3793,3795,3797,3799,3802,3805,3807,3809,3811,3813,3815,3817,3819,3821,3823,3825],{"class":464,"line":595},[462,3765,3766],{"class":472},"            label ",[462,3768,707],{"class":706},[462,3770,3525],{"class":1880},[462,3772,3773],{"class":1146},"∞",[462,3775,1164],{"class":1880},[462,3777,3778],{"class":468}," if",[462,3780,2541],{"class":472},[462,3782,448],{"class":484},[462,3784,3584],{"class":608},[462,3786,612],{"class":484},[462,3788,3488],{"class":608},[462,3790,1121],{"class":484},[462,3792,2017],{"class":608},[462,3794,737],{"class":484},[462,3796,3007],{"class":608},[462,3798,2020],{"class":484},[462,3800,3801],{"class":468}," else",[462,3803,3804],{"class":1142}," f",[462,3806,1164],{"class":1146},[462,3808,1150],{"class":615},[462,3810,3488],{"class":472},[462,3812,1121],{"class":484},[462,3814,2017],{"class":472},[462,3816,737],{"class":484},[462,3818,3007],{"class":472},[462,3820,1377],{"class":484},[462,3822,3012],{"class":1142},[462,3824,1161],{"class":615},[462,3826,3827],{"class":1146},"\"\n",[462,3829,3830,3833,3835,3837,3839,3841,3843,3846,3848,3850,3852,3855,3857,3859,3861,3863,3865,3868,3870,3872,3874,3876,3878,3881,3883,3885,3887,3889,3891,3894,3896,3898],{"class":464,"line":600},[462,3831,3832],{"class":472},"            ax",[462,3834,448],{"class":484},[462,3836,2967],{"class":608},[462,3838,612],{"class":484},[462,3840,2282],{"class":608},[462,3842,737],{"class":484},[462,3844,3845],{"class":608}," i",[462,3847,737],{"class":484},[462,3849,3108],{"class":608},[462,3851,737],{"class":484},[462,3853,3854],{"class":718}," ha",[462,3856,707],{"class":706},[462,3858,1164],{"class":1880},[462,3860,3030],{"class":1146},[462,3862,1164],{"class":1880},[462,3864,737],{"class":484},[462,3866,3867],{"class":718}," va",[462,3869,707],{"class":706},[462,3871,1164],{"class":1880},[462,3873,3030],{"class":1146},[462,3875,1164],{"class":1880},[462,3877,737],{"class":484},[462,3879,3880],{"class":718}," color",[462,3882,707],{"class":706},[462,3884,1164],{"class":1880},[462,3886,3061],{"class":1146},[462,3888,1164],{"class":1880},[462,3890,737],{"class":484},[462,3892,3893],{"class":718}," fontsize",[462,3895,707],{"class":706},[462,3897,2102],{"class":615},[462,3899,575],{"class":484},[462,3901,3902,3904,3906,3909],{"class":464,"line":1060},[462,3903,2483],{"class":472},[462,3905,448],{"class":484},[462,3907,3908],{"class":608},"tight_layout",[462,3910,2491],{"class":484},[462,3912,3913,3915,3917,3919],{"class":464,"line":1113},[462,3914,2483],{"class":472},[462,3916,448],{"class":484},[462,3918,2488],{"class":608},[462,3920,2491],{"class":484},[338,3922,3923],{},[2495,3924],{"alt":458,"src":3925},"\u002F_nb\u002Fd6e92ec97e4d01ab.png",[625,3927,3929],{"id":3928},"matchoutcome-what-the-associator-returns","MatchOutcome — what the associator returns",[338,3931,3932,3933,3936,3937,3939],{},"After running an ",[347,3934,3935],{},"Associator"," (Jonker, Hungarian, Greedy, …),\nyou get a ",[347,3938,435],{}," that records:",[3146,3941,3942,3952,3958,3964],{},[3149,3943,3944,3947,3948,3951],{},[347,3945,3946],{},"matched_pairs",": (K, 2) — ",[347,3949,3950],{},"(tracklet_index, detection_index)"," rows.",[3149,3953,3954,3957],{},[347,3955,3956],{},"tracklets_residual_index",": which tracklets did NOT match.",[3149,3959,3960,3963],{},[347,3961,3962],{},"detections_residual_index",": which detections did NOT match.",[3149,3965,3966,3969],{},[347,3967,3968],{},"per_match_cost",": per-pair assignment cost (telemetry\u002FHPO).",[453,3971,3973],{"className":455,"code":3972,"language":457,"meta":458,"style":458},"from unitrack.assignment import Associate, Jonker\n\nm = MatchOutcome.empty()\nprint(f\"empty MatchOutcome: matched_pairs={m.matched_pairs.shape}\")\n\n# Build an Associator and run it on the gated cost.\nctx = FrameContext.make(frame_idx=0, delta=0.0)\noutcome = Associate(Jonker(threshold=200.0))(t, d, ctx, cost_gated)\nprint(f\"matched_pairs: {outcome.matched_pairs.tolist()}\")\nprint(f\"residual tracklets: {outcome.tracklets_residual_index.tolist()}\")\nprint(f\"residual detections: {outcome.detections_residual_index.tolist()}\")\n\n",[347,3974,3975,3996,4000,4017,4046,4050,4055,4091,4134,4166,4197],{"__ignoreMap":458},[462,3976,3977,3979,3981,3983,3986,3988,3991,3993],{"class":464,"line":465},[462,3978,507],{"class":468},[462,3980,510],{"class":472},[462,3982,448],{"class":484},[462,3984,3985],{"class":472},"assignment ",[462,3987,469],{"class":468},[462,3989,3990],{"class":472}," Associate",[462,3992,737],{"class":484},[462,3994,3995],{"class":472}," Jonker\n",[462,3997,3998],{"class":464,"line":476},[462,3999,501],{"emptyLinePlaceholder":500},[462,4001,4002,4005,4007,4010,4012,4015],{"class":464,"line":497},[462,4003,4004],{"class":472},"m ",[462,4006,707],{"class":706},[462,4008,4009],{"class":472}," MatchOutcome",[462,4011,448],{"class":484},[462,4013,4014],{"class":608},"empty",[462,4016,2491],{"class":484},[462,4018,4019,4021,4023,4025,4028,4030,4032,4034,4036,4038,4040,4042,4044],{"class":464,"line":504},[462,4020,1137],{"class":1136},[462,4022,612],{"class":484},[462,4024,1143],{"class":1142},[462,4026,4027],{"class":1146},"\"empty MatchOutcome: matched_pairs=",[462,4029,1150],{"class":615},[462,4031,3488],{"class":608},[462,4033,448],{"class":484},[462,4035,3946],{"class":487},[462,4037,448],{"class":484},[462,4039,1259],{"class":487},[462,4041,1161],{"class":615},[462,4043,1164],{"class":1146},[462,4045,575],{"class":484},[462,4047,4048],{"class":464,"line":523},[462,4049,501],{"emptyLinePlaceholder":500},[462,4051,4052],{"class":464,"line":532},[462,4053,4054],{"class":697},"# Build an Associator and run it on the gated cost.\n",[462,4056,4057,4060,4062,4065,4067,4070,4072,4075,4077,4079,4081,4084,4086,4089],{"class":464,"line":540},[462,4058,4059],{"class":472},"ctx ",[462,4061,707],{"class":706},[462,4063,4064],{"class":472}," FrameContext",[462,4066,448],{"class":484},[462,4068,4069],{"class":608},"make",[462,4071,612],{"class":484},[462,4073,4074],{"class":718},"frame_idx",[462,4076,707],{"class":706},[462,4078,616],{"class":615},[462,4080,737],{"class":484},[462,4082,4083],{"class":718}," delta",[462,4085,707],{"class":706},[462,4087,4088],{"class":615},"0.0",[462,4090,575],{"class":484},[462,4092,4093,4096,4098,4100,4102,4105,4107,4110,4112,4114,4117,4119,4121,4123,4125,4128,4130,4132],{"class":464,"line":548},[462,4094,4095],{"class":472},"outcome ",[462,4097,707],{"class":706},[462,4099,3990],{"class":608},[462,4101,612],{"class":484},[462,4103,4104],{"class":608},"Jonker",[462,4106,612],{"class":484},[462,4108,4109],{"class":718},"threshold",[462,4111,707],{"class":706},[462,4113,1090],{"class":615},[462,4115,4116],{"class":484},"))(",[462,4118,1153],{"class":608},[462,4120,737],{"class":484},[462,4122,1818],{"class":608},[462,4124,737],{"class":484},[462,4126,4127],{"class":608}," ctx",[462,4129,737],{"class":484},[462,4131,3378],{"class":608},[462,4133,575],{"class":484},[462,4135,4136,4138,4140,4142,4145,4147,4150,4152,4154,4156,4158,4160,4162,4164],{"class":464,"line":556},[462,4137,1137],{"class":1136},[462,4139,612],{"class":484},[462,4141,1143],{"class":1142},[462,4143,4144],{"class":1146},"\"matched_pairs: ",[462,4146,1150],{"class":615},[462,4148,4149],{"class":608},"outcome",[462,4151,448],{"class":484},[462,4153,3946],{"class":487},[462,4155,448],{"class":484},[462,4157,1191],{"class":608},[462,4159,1194],{"class":484},[462,4161,1161],{"class":615},[462,4163,1164],{"class":1146},[462,4165,575],{"class":484},[462,4167,4168,4170,4172,4174,4177,4179,4181,4183,4185,4187,4189,4191,4193,4195],{"class":464,"line":564},[462,4169,1137],{"class":1136},[462,4171,612],{"class":484},[462,4173,1143],{"class":1142},[462,4175,4176],{"class":1146},"\"residual tracklets: ",[462,4178,1150],{"class":615},[462,4180,4149],{"class":608},[462,4182,448],{"class":484},[462,4184,3956],{"class":487},[462,4186,448],{"class":484},[462,4188,1191],{"class":608},[462,4190,1194],{"class":484},[462,4192,1161],{"class":615},[462,4194,1164],{"class":1146},[462,4196,575],{"class":484},[462,4198,4199,4201,4203,4205,4208,4210,4212,4214,4216,4218,4220,4222,4224,4226],{"class":464,"line":572},[462,4200,1137],{"class":1136},[462,4202,612],{"class":484},[462,4204,1143],{"class":1142},[462,4206,4207],{"class":1146},"\"residual detections: ",[462,4209,1150],{"class":615},[462,4211,4149],{"class":608},[462,4213,448],{"class":484},[462,4215,3962],{"class":487},[462,4217,448],{"class":484},[462,4219,1191],{"class":608},[462,4221,1194],{"class":484},[462,4223,1161],{"class":615},[462,4225,1164],{"class":1146},[462,4227,575],{"class":484},[620,4229],{"data":4230,"kind":1302},"ZW1wdHkgTWF0Y2hPdXRjb21lOiBtYXRjaGVkX3BhaXJzPXRvcmNoLlNpemUoWzAsIDJdKQptYXRjaGVkX3BhaXJzOiBbWzAsIDBdLCBbMSwgMV0sIFsyLCAzXV0KcmVzaWR1YWwgdHJhY2tsZXRzOiBbXQpyZXNpZHVhbCBkZXRlY3Rpb25zOiBbMl0K",[338,4232,4233],{},"Reading the matched pairs:",[3146,4235,4236,4239,4242],{},[3149,4237,4238],{},"tracklet 0 (class 0) ↔ detection 0 (class 0)",[3149,4240,4241],{},"tracklet 1 (class 1) ↔ detection 1 (class 1)",[3149,4243,4244],{},"tracklet 2 (class 0) ↔ detection 3 (class 0)",[338,4246,4247,4248,4250,4251,448],{},"Detection 2 (class 2) had no class-matching tracklet, so it lands\nin ",[347,4249,3962],{}," — ready to be promoted to a brand-\nnew tracklet by the rest of ",[347,4252,4253],{},"Tracker.step",[625,4255,4257],{"id":4256},"whats-next","What's next",[338,4259,4260,4261,4263],{},"Notebook ",[342,4262,893],{}," visualizes the cost zoo (cosine, IoU, BiSoftmax,\nMahalanobis, …) and the gate zoo (Class, Score, Spatial, Motion)\nside by side, showing how each shape fits the algebra above.",[4265,4266,4267],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":458,"searchDepth":497,"depth":497,"links":4269},[4270,4271,4272,4273,4274,4275,4276],{"id":627,"depth":476,"text":628},{"id":1449,"depth":476,"text":1450},{"id":1746,"depth":476,"text":1747},{"id":2503,"depth":476,"text":2504},{"id":3137,"depth":476,"text":3138},{"id":3928,"depth":476,"text":3929},{"id":4256,"depth":476,"text":4257},"unitrack 2.0 is built around a small set of immutable, typed\nrecords backed by tensordict.tensorclass. Every interesting\ndata shape passing between stages of a tracker is one of these\ntypes. This makes the pipeline easy to reason about: a stage's\nsignature tells you exactly what it consumes and produces.","md",{"notebook":500},{"icon":63},{"title":99,"description":4277},"ietSsz6Lzp9pYO6m5Na6PYkB-Wovrxp2b7pljazhTqI",{},1785139889447]