[{"data":1,"prerenderedAt":4573},["ShallowReactive",2],{"navigation":3,"api-navigation":126,"\u002Fnotebooks\u002Ftutorials\u002Fpipeline_tree":328,"docyard:crossref-index":4572},[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":107,"body":330,"description":4566,"extension":4567,"meta":4568,"navigation":4569,"path":108,"seo":4570,"stem":109,"__hash__":4571},"content\u002F5.notebooks\u002Ftutorials\u002F4.pipeline_tree.md",{"type":331,"value":332,"toc":4552},"minimark",[333,337,346,366,369,411,414,778,783,786,1721,1878,1882,1893,3167,3173,3177,3180,3273,3278,3282,3285,3448,3451,3455,3461,3623,3626,3629,3637,3643,3794,3797,3801,3815,3969,3972,3976,3984,3998,4143,4146,4152,4156,4165,4233,4236,4240,4243,4526,4529,4533,4548],[334,335,107],"h1",{"id":336},"_4-the-composable-pipeline-tree",[338,339,340,341,345],"p",{},"unitrack 2.0 builds trackers from a ",[342,343,344],"strong",{},"typed tree of stages",".\nThere are three leaf signatures:",[347,348,349,356,361],"ul",{},[350,351,352],"li",{},[353,354,355],"code",{},"GateProducer: (cs, ds, ctx) → Gate",[350,357,358],{},[353,359,360],{},"CostProducer: (cs, ds, ctx) → CostExpression",[350,362,363],{},[353,364,365],{},"Associator: (cs, ds, ctx, cost?) → MatchOutcome",[338,367,368],{},"and a small set of combinators that compose them:",[347,370,371,377,387,393,399,405],{},[350,372,373,376],{},[353,374,375],{},"Pipe(cost, assoc)"," — bridge: cost → match.",[350,378,379,382,383,386],{},[353,380,381],{},"Sequential[T]([s1, s2, …])"," — chain of T-producers.\nFor T=MatchOutcome: cascaded matching (residuals chain through).\nFor T=Gate: gates fold under ",[353,384,385],{},"Gate.combine",".",[350,388,389,392],{},[353,390,391],{},"Parallel(children, merge)"," — cost-level merge of K branches.",[350,394,395,398],{},[353,396,397],{},"Gated(gate, then)"," — apply a gate, then run the body.",[350,400,401,404],{},[353,402,403],{},"Filter(predicate, on, then)"," — drop rows of cs and\u002For ds.",[350,406,407,410],{},[353,408,409],{},"Iterate(n, body)"," — repeat a body n times.",[338,412,413],{},"This notebook builds and visualizes each combinator.",[415,416,421],"pre",{"className":417,"code":418,"language":419,"meta":420,"style":420},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import torch\nimport matplotlib.pyplot as plt\n\nfrom unitrack.assignment import Associate, Greedy, Jonker\nfrom unitrack.costs import CDist, Cosine, MaskIoU, Reduce\nfrom unitrack.data import Detections, FrameContext, Tracklets\nfrom unitrack.gates import ClassGate, ScoreGate, SpatialGate2D\nfrom unitrack.lifecycle import (\n    MaxAgeFilter,\n    StatusFilter,\n    TrackletStatus,\n)\nfrom unitrack.pipeline import (\n    Filter,\n    Gated,\n    Iterate,\n    Parallel,\n    Pipe,\n    Sequential,\n)\nfrom unitrack.pipeline.merge import WeightedSum\n\ntorch.manual_seed(0)\nctx = FrameContext.make(0, delta=0.0)\n\n","python","",[353,422,423,436,457,464,494,526,553,580,597,606,614,622,628,644,652,660,668,676,684,692,697,718,723,744],{"__ignoreMap":420},[424,425,428,432],"span",{"class":426,"line":427},"line",1,[424,429,431],{"class":430},"sVHd0","import",[424,433,435],{"class":434},"su5hD"," torch\n",[424,437,439,441,444,447,451,454],{"class":426,"line":438},2,[424,440,431],{"class":430},[424,442,443],{"class":434}," matplotlib",[424,445,386],{"class":446},"sP7_E",[424,448,450],{"class":449},"skxfh","pyplot",[424,452,453],{"class":430}," as",[424,455,456],{"class":434}," plt\n",[424,458,460],{"class":426,"line":459},3,[424,461,463],{"emptyLinePlaceholder":462},true,"\n",[424,465,467,470,473,475,478,480,483,486,489,491],{"class":426,"line":466},4,[424,468,469],{"class":430},"from",[424,471,472],{"class":434}," unitrack",[424,474,386],{"class":446},[424,476,477],{"class":434},"assignment ",[424,479,431],{"class":430},[424,481,482],{"class":434}," Associate",[424,484,485],{"class":446},",",[424,487,488],{"class":434}," Greedy",[424,490,485],{"class":446},[424,492,493],{"class":434}," Jonker\n",[424,495,497,499,501,503,506,508,511,513,516,518,521,523],{"class":426,"line":496},5,[424,498,469],{"class":430},[424,500,472],{"class":434},[424,502,386],{"class":446},[424,504,505],{"class":434},"costs ",[424,507,431],{"class":430},[424,509,510],{"class":434}," CDist",[424,512,485],{"class":446},[424,514,515],{"class":434}," Cosine",[424,517,485],{"class":446},[424,519,520],{"class":434}," MaskIoU",[424,522,485],{"class":446},[424,524,525],{"class":434}," Reduce\n",[424,527,529,531,533,535,538,540,543,545,548,550],{"class":426,"line":528},6,[424,530,469],{"class":430},[424,532,472],{"class":434},[424,534,386],{"class":446},[424,536,537],{"class":434},"data ",[424,539,431],{"class":430},[424,541,542],{"class":434}," Detections",[424,544,485],{"class":446},[424,546,547],{"class":434}," FrameContext",[424,549,485],{"class":446},[424,551,552],{"class":434}," Tracklets\n",[424,554,556,558,560,562,565,567,570,572,575,577],{"class":426,"line":555},7,[424,557,469],{"class":430},[424,559,472],{"class":434},[424,561,386],{"class":446},[424,563,564],{"class":434},"gates ",[424,566,431],{"class":430},[424,568,569],{"class":434}," ClassGate",[424,571,485],{"class":446},[424,573,574],{"class":434}," ScoreGate",[424,576,485],{"class":446},[424,578,579],{"class":434}," SpatialGate2D\n",[424,581,583,585,587,589,592,594],{"class":426,"line":582},8,[424,584,469],{"class":430},[424,586,472],{"class":434},[424,588,386],{"class":446},[424,590,591],{"class":434},"lifecycle ",[424,593,431],{"class":430},[424,595,596],{"class":446}," (\n",[424,598,600,603],{"class":426,"line":599},9,[424,601,602],{"class":434},"    MaxAgeFilter",[424,604,605],{"class":446},",\n",[424,607,609,612],{"class":426,"line":608},10,[424,610,611],{"class":434},"    StatusFilter",[424,613,605],{"class":446},[424,615,617,620],{"class":426,"line":616},11,[424,618,619],{"class":434},"    TrackletStatus",[424,621,605],{"class":446},[424,623,625],{"class":426,"line":624},12,[424,626,627],{"class":446},")\n",[424,629,631,633,635,637,640,642],{"class":426,"line":630},13,[424,632,469],{"class":430},[424,634,472],{"class":434},[424,636,386],{"class":446},[424,638,639],{"class":434},"pipeline ",[424,641,431],{"class":430},[424,643,596],{"class":446},[424,645,647,650],{"class":426,"line":646},14,[424,648,649],{"class":434},"    Filter",[424,651,605],{"class":446},[424,653,655,658],{"class":426,"line":654},15,[424,656,657],{"class":434},"    Gated",[424,659,605],{"class":446},[424,661,663,666],{"class":426,"line":662},16,[424,664,665],{"class":434},"    Iterate",[424,667,605],{"class":446},[424,669,671,674],{"class":426,"line":670},17,[424,672,673],{"class":434},"    Parallel",[424,675,605],{"class":446},[424,677,679,682],{"class":426,"line":678},18,[424,680,681],{"class":434},"    Pipe",[424,683,605],{"class":446},[424,685,687,690],{"class":426,"line":686},19,[424,688,689],{"class":434},"    Sequential",[424,691,605],{"class":446},[424,693,695],{"class":426,"line":694},20,[424,696,627],{"class":446},[424,698,700,702,704,706,708,710,713,715],{"class":426,"line":699},21,[424,701,469],{"class":430},[424,703,472],{"class":434},[424,705,386],{"class":446},[424,707,256],{"class":434},[424,709,386],{"class":446},[424,711,712],{"class":434},"merge ",[424,714,431],{"class":430},[424,716,717],{"class":434}," WeightedSum\n",[424,719,721],{"class":426,"line":720},22,[424,722,463],{"emptyLinePlaceholder":462},[424,724,726,729,731,735,738,742],{"class":426,"line":725},23,[424,727,728],{"class":434},"torch",[424,730,386],{"class":446},[424,732,734],{"class":733},"slqww","manual_seed",[424,736,737],{"class":446},"(",[424,739,741],{"class":740},"srdBf","0",[424,743,627],{"class":446},[424,745,747,750,754,756,758,761,763,765,767,771,773,776],{"class":426,"line":746},24,[424,748,749],{"class":434},"ctx ",[424,751,753],{"class":752},"smGrS","=",[424,755,547],{"class":434},[424,757,386],{"class":446},[424,759,760],{"class":733},"make",[424,762,737],{"class":446},[424,764,741],{"class":740},[424,766,485],{"class":446},[424,768,770],{"class":769},"s99_P"," delta",[424,772,753],{"class":752},[424,774,775],{"class":740},"0.0",[424,777,627],{"class":446},[779,780,782],"h2",{"id":781},"common-fixture","Common fixture",[338,784,785],{},"Three tracklets, four detections; all share a kernel field and\na class. We use the same data across each combinator so the\ndifferences in their behavior are visible.",[415,787,789],{"className":417,"code":788,"language":419,"meta":420,"style":420},"N, M = 3, 4\ncs = Tracklets(\n    id=torch.arange(N, dtype=torch.int64),\n    status=torch.full((N,), int(TrackletStatus.Active), dtype=torch.int8),\n    hits=torch.ones(N, dtype=torch.int32),\n    time_since_update=torch.zeros(N, dtype=torch.int32),\n    age=torch.tensor([1, 1, 6], dtype=torch.int32),  # last one is older\n    frame_started=torch.zeros(N, dtype=torch.int32),\n    frame_last_seen=torch.zeros(N, dtype=torch.int32),\n    kernel=torch.tensor(\n        [\n            [1, 0, 0, 0, 0, 0, 0, 0],\n            [0, 1, 0, 0, 0, 0, 0, 0],\n            [0, 0, 1, 0, 0, 0, 0, 0],\n        ],\n        dtype=torch.float32,\n    ),\n    klass=torch.tensor([0, 1, 0]),\n    position=torch.tensor([[0.0, 0.0], [50.0, 0.0], [100.0, 0.0]]),\n    batch_size=[N],\n)\nds = Detections(\n    index=torch.arange(M, dtype=torch.int64),\n    kernel=torch.tensor(\n        [\n            [0.95, 0.05, 0, 0, 0, 0, 0, 0],\n            [0.05, 0.95, 0, 0, 0, 0, 0, 0],\n            [0, 0.05, 0.95, 0, 0, 0, 0, 0],\n            [0, 0, 0, 1, 0, 0, 0, 0],\n        ],\n        dtype=torch.float32,\n    ),\n    klass=torch.tensor([0, 1, 0, 2]),\n    score=torch.tensor([0.9, 0.6, 0.4, 0.95]),\n    position=torch.tensor([[2.0, 0.0], [49.0, 1.0], [98.0, 0.0], [200.0, 0.0]]),\n    batch_size=[M],\n)\n\n",[353,790,791,811,824,859,911,944,976,1025,1056,1087,1102,1107,1146,1182,1218,1223,1239,1244,1272,1321,1335,1339,1350,1382,1396,1401,1440,1479,1516,1553,1558,1573,1578,1610,1645,1703,1716],{"__ignoreMap":420},[424,792,793,796,798,801,803,806,808],{"class":426,"line":427},[424,794,795],{"class":434},"N",[424,797,485],{"class":446},[424,799,800],{"class":434}," M ",[424,802,753],{"class":752},[424,804,805],{"class":740}," 3",[424,807,485],{"class":446},[424,809,810],{"class":740}," 4\n",[424,812,813,816,818,821],{"class":426,"line":438},[424,814,815],{"class":434},"cs ",[424,817,753],{"class":752},[424,819,820],{"class":733}," Tracklets",[424,822,823],{"class":446},"(\n",[424,825,826,829,831,833,835,838,840,842,844,847,849,851,853,856],{"class":426,"line":459},[424,827,828],{"class":769},"    id",[424,830,753],{"class":752},[424,832,728],{"class":733},[424,834,386],{"class":446},[424,836,837],{"class":733},"arange",[424,839,737],{"class":446},[424,841,795],{"class":733},[424,843,485],{"class":446},[424,845,846],{"class":769}," dtype",[424,848,753],{"class":752},[424,850,728],{"class":733},[424,852,386],{"class":446},[424,854,855],{"class":449},"int64",[424,857,858],{"class":446},"),\n",[424,860,861,864,866,868,870,873,876,878,881,885,887,890,892,895,898,900,902,904,906,909],{"class":426,"line":466},[424,862,863],{"class":769},"    status",[424,865,753],{"class":752},[424,867,728],{"class":733},[424,869,386],{"class":446},[424,871,872],{"class":733},"full",[424,874,875],{"class":446},"((",[424,877,795],{"class":733},[424,879,880],{"class":446},",),",[424,882,884],{"class":883},"sZMiF"," int",[424,886,737],{"class":446},[424,888,889],{"class":733},"TrackletStatus",[424,891,386],{"class":446},[424,893,894],{"class":449},"Active",[424,896,897],{"class":446},"),",[424,899,846],{"class":769},[424,901,753],{"class":752},[424,903,728],{"class":733},[424,905,386],{"class":446},[424,907,908],{"class":449},"int8",[424,910,858],{"class":446},[424,912,913,916,918,920,922,925,927,929,931,933,935,937,939,942],{"class":426,"line":496},[424,914,915],{"class":769},"    hits",[424,917,753],{"class":752},[424,919,728],{"class":733},[424,921,386],{"class":446},[424,923,924],{"class":733},"ones",[424,926,737],{"class":446},[424,928,795],{"class":733},[424,930,485],{"class":446},[424,932,846],{"class":769},[424,934,753],{"class":752},[424,936,728],{"class":733},[424,938,386],{"class":446},[424,940,941],{"class":449},"int32",[424,943,858],{"class":446},[424,945,946,949,951,953,955,958,960,962,964,966,968,970,972,974],{"class":426,"line":528},[424,947,948],{"class":769},"    time_since_update",[424,950,753],{"class":752},[424,952,728],{"class":733},[424,954,386],{"class":446},[424,956,957],{"class":733},"zeros",[424,959,737],{"class":446},[424,961,795],{"class":733},[424,963,485],{"class":446},[424,965,846],{"class":769},[424,967,753],{"class":752},[424,969,728],{"class":733},[424,971,386],{"class":446},[424,973,941],{"class":449},[424,975,858],{"class":446},[424,977,978,981,983,985,987,990,993,996,998,1001,1003,1006,1009,1011,1013,1015,1017,1019,1021],{"class":426,"line":555},[424,979,980],{"class":769},"    age",[424,982,753],{"class":752},[424,984,728],{"class":733},[424,986,386],{"class":446},[424,988,989],{"class":733},"tensor",[424,991,992],{"class":446},"([",[424,994,995],{"class":740},"1",[424,997,485],{"class":446},[424,999,1000],{"class":740}," 1",[424,1002,485],{"class":446},[424,1004,1005],{"class":740}," 6",[424,1007,1008],{"class":446},"],",[424,1010,846],{"class":769},[424,1012,753],{"class":752},[424,1014,728],{"class":733},[424,1016,386],{"class":446},[424,1018,941],{"class":449},[424,1020,897],{"class":446},[424,1022,1024],{"class":1023},"sutJx","  # last one is older\n",[424,1026,1027,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052,1054],{"class":426,"line":582},[424,1028,1029],{"class":769},"    frame_started",[424,1031,753],{"class":752},[424,1033,728],{"class":733},[424,1035,386],{"class":446},[424,1037,957],{"class":733},[424,1039,737],{"class":446},[424,1041,795],{"class":733},[424,1043,485],{"class":446},[424,1045,846],{"class":769},[424,1047,753],{"class":752},[424,1049,728],{"class":733},[424,1051,386],{"class":446},[424,1053,941],{"class":449},[424,1055,858],{"class":446},[424,1057,1058,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085],{"class":426,"line":599},[424,1059,1060],{"class":769},"    frame_last_seen",[424,1062,753],{"class":752},[424,1064,728],{"class":733},[424,1066,386],{"class":446},[424,1068,957],{"class":733},[424,1070,737],{"class":446},[424,1072,795],{"class":733},[424,1074,485],{"class":446},[424,1076,846],{"class":769},[424,1078,753],{"class":752},[424,1080,728],{"class":733},[424,1082,386],{"class":446},[424,1084,941],{"class":449},[424,1086,858],{"class":446},[424,1088,1089,1092,1094,1096,1098,1100],{"class":426,"line":608},[424,1090,1091],{"class":769},"    kernel",[424,1093,753],{"class":752},[424,1095,728],{"class":733},[424,1097,386],{"class":446},[424,1099,989],{"class":733},[424,1101,823],{"class":446},[424,1103,1104],{"class":426,"line":616},[424,1105,1106],{"class":446},"        [\n",[424,1108,1109,1112,1114,1116,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143],{"class":426,"line":624},[424,1110,1111],{"class":446},"            [",[424,1113,995],{"class":740},[424,1115,485],{"class":446},[424,1117,1118],{"class":740}," 0",[424,1120,485],{"class":446},[424,1122,1118],{"class":740},[424,1124,485],{"class":446},[424,1126,1118],{"class":740},[424,1128,485],{"class":446},[424,1130,1118],{"class":740},[424,1132,485],{"class":446},[424,1134,1118],{"class":740},[424,1136,485],{"class":446},[424,1138,1118],{"class":740},[424,1140,485],{"class":446},[424,1142,1118],{"class":740},[424,1144,1145],{"class":446},"],\n",[424,1147,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180],{"class":426,"line":630},[424,1149,1111],{"class":446},[424,1151,741],{"class":740},[424,1153,485],{"class":446},[424,1155,1000],{"class":740},[424,1157,485],{"class":446},[424,1159,1118],{"class":740},[424,1161,485],{"class":446},[424,1163,1118],{"class":740},[424,1165,485],{"class":446},[424,1167,1118],{"class":740},[424,1169,485],{"class":446},[424,1171,1118],{"class":740},[424,1173,485],{"class":446},[424,1175,1118],{"class":740},[424,1177,485],{"class":446},[424,1179,1118],{"class":740},[424,1181,1145],{"class":446},[424,1183,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216],{"class":426,"line":646},[424,1185,1111],{"class":446},[424,1187,741],{"class":740},[424,1189,485],{"class":446},[424,1191,1118],{"class":740},[424,1193,485],{"class":446},[424,1195,1000],{"class":740},[424,1197,485],{"class":446},[424,1199,1118],{"class":740},[424,1201,485],{"class":446},[424,1203,1118],{"class":740},[424,1205,485],{"class":446},[424,1207,1118],{"class":740},[424,1209,485],{"class":446},[424,1211,1118],{"class":740},[424,1213,485],{"class":446},[424,1215,1118],{"class":740},[424,1217,1145],{"class":446},[424,1219,1220],{"class":426,"line":654},[424,1221,1222],{"class":446},"        ],\n",[424,1224,1225,1228,1230,1232,1234,1237],{"class":426,"line":662},[424,1226,1227],{"class":769},"        dtype",[424,1229,753],{"class":752},[424,1231,728],{"class":733},[424,1233,386],{"class":446},[424,1235,1236],{"class":449},"float32",[424,1238,605],{"class":446},[424,1240,1241],{"class":426,"line":670},[424,1242,1243],{"class":446},"    ),\n",[424,1245,1246,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269],{"class":426,"line":678},[424,1247,1248],{"class":769},"    klass",[424,1250,753],{"class":752},[424,1252,728],{"class":733},[424,1254,386],{"class":446},[424,1256,989],{"class":733},[424,1258,992],{"class":446},[424,1260,741],{"class":740},[424,1262,485],{"class":446},[424,1264,1000],{"class":740},[424,1266,485],{"class":446},[424,1268,1118],{"class":740},[424,1270,1271],{"class":446},"]),\n",[424,1273,1274,1277,1279,1281,1283,1285,1288,1290,1292,1295,1297,1300,1303,1305,1307,1309,1311,1314,1316,1318],{"class":426,"line":686},[424,1275,1276],{"class":769},"    position",[424,1278,753],{"class":752},[424,1280,728],{"class":733},[424,1282,386],{"class":446},[424,1284,989],{"class":733},[424,1286,1287],{"class":446},"([[",[424,1289,775],{"class":740},[424,1291,485],{"class":446},[424,1293,1294],{"class":740}," 0.0",[424,1296,1008],{"class":446},[424,1298,1299],{"class":446}," [",[424,1301,1302],{"class":740},"50.0",[424,1304,485],{"class":446},[424,1306,1294],{"class":740},[424,1308,1008],{"class":446},[424,1310,1299],{"class":446},[424,1312,1313],{"class":740},"100.0",[424,1315,485],{"class":446},[424,1317,1294],{"class":740},[424,1319,1320],{"class":446},"]]),\n",[424,1322,1323,1326,1328,1331,1333],{"class":426,"line":694},[424,1324,1325],{"class":769},"    batch_size",[424,1327,753],{"class":752},[424,1329,1330],{"class":446},"[",[424,1332,795],{"class":733},[424,1334,1145],{"class":446},[424,1336,1337],{"class":426,"line":699},[424,1338,627],{"class":446},[424,1340,1341,1344,1346,1348],{"class":426,"line":720},[424,1342,1343],{"class":434},"ds ",[424,1345,753],{"class":752},[424,1347,542],{"class":733},[424,1349,823],{"class":446},[424,1351,1352,1355,1357,1359,1361,1363,1365,1368,1370,1372,1374,1376,1378,1380],{"class":426,"line":725},[424,1353,1354],{"class":769},"    index",[424,1356,753],{"class":752},[424,1358,728],{"class":733},[424,1360,386],{"class":446},[424,1362,837],{"class":733},[424,1364,737],{"class":446},[424,1366,1367],{"class":733},"M",[424,1369,485],{"class":446},[424,1371,846],{"class":769},[424,1373,753],{"class":752},[424,1375,728],{"class":733},[424,1377,386],{"class":446},[424,1379,855],{"class":449},[424,1381,858],{"class":446},[424,1383,1384,1386,1388,1390,1392,1394],{"class":426,"line":746},[424,1385,1091],{"class":769},[424,1387,753],{"class":752},[424,1389,728],{"class":733},[424,1391,386],{"class":446},[424,1393,989],{"class":733},[424,1395,823],{"class":446},[424,1397,1399],{"class":426,"line":1398},25,[424,1400,1106],{"class":446},[424,1402,1404,1406,1409,1411,1414,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434,1436,1438],{"class":426,"line":1403},26,[424,1405,1111],{"class":446},[424,1407,1408],{"class":740},"0.95",[424,1410,485],{"class":446},[424,1412,1413],{"class":740}," 0.05",[424,1415,485],{"class":446},[424,1417,1118],{"class":740},[424,1419,485],{"class":446},[424,1421,1118],{"class":740},[424,1423,485],{"class":446},[424,1425,1118],{"class":740},[424,1427,485],{"class":446},[424,1429,1118],{"class":740},[424,1431,485],{"class":446},[424,1433,1118],{"class":740},[424,1435,485],{"class":446},[424,1437,1118],{"class":740},[424,1439,1145],{"class":446},[424,1441,1443,1445,1448,1450,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477],{"class":426,"line":1442},27,[424,1444,1111],{"class":446},[424,1446,1447],{"class":740},"0.05",[424,1449,485],{"class":446},[424,1451,1452],{"class":740}," 0.95",[424,1454,485],{"class":446},[424,1456,1118],{"class":740},[424,1458,485],{"class":446},[424,1460,1118],{"class":740},[424,1462,485],{"class":446},[424,1464,1118],{"class":740},[424,1466,485],{"class":446},[424,1468,1118],{"class":740},[424,1470,485],{"class":446},[424,1472,1118],{"class":740},[424,1474,485],{"class":446},[424,1476,1118],{"class":740},[424,1478,1145],{"class":446},[424,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514],{"class":426,"line":1481},28,[424,1483,1111],{"class":446},[424,1485,741],{"class":740},[424,1487,485],{"class":446},[424,1489,1413],{"class":740},[424,1491,485],{"class":446},[424,1493,1452],{"class":740},[424,1495,485],{"class":446},[424,1497,1118],{"class":740},[424,1499,485],{"class":446},[424,1501,1118],{"class":740},[424,1503,485],{"class":446},[424,1505,1118],{"class":740},[424,1507,485],{"class":446},[424,1509,1118],{"class":740},[424,1511,485],{"class":446},[424,1513,1118],{"class":740},[424,1515,1145],{"class":446},[424,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551],{"class":426,"line":1518},29,[424,1520,1111],{"class":446},[424,1522,741],{"class":740},[424,1524,485],{"class":446},[424,1526,1118],{"class":740},[424,1528,485],{"class":446},[424,1530,1118],{"class":740},[424,1532,485],{"class":446},[424,1534,1000],{"class":740},[424,1536,485],{"class":446},[424,1538,1118],{"class":740},[424,1540,485],{"class":446},[424,1542,1118],{"class":740},[424,1544,485],{"class":446},[424,1546,1118],{"class":740},[424,1548,485],{"class":446},[424,1550,1118],{"class":740},[424,1552,1145],{"class":446},[424,1554,1556],{"class":426,"line":1555},30,[424,1557,1222],{"class":446},[424,1559,1561,1563,1565,1567,1569,1571],{"class":426,"line":1560},31,[424,1562,1227],{"class":769},[424,1564,753],{"class":752},[424,1566,728],{"class":733},[424,1568,386],{"class":446},[424,1570,1236],{"class":449},[424,1572,605],{"class":446},[424,1574,1576],{"class":426,"line":1575},32,[424,1577,1243],{"class":446},[424,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1608],{"class":426,"line":1580},33,[424,1582,1248],{"class":769},[424,1584,753],{"class":752},[424,1586,728],{"class":733},[424,1588,386],{"class":446},[424,1590,989],{"class":733},[424,1592,992],{"class":446},[424,1594,741],{"class":740},[424,1596,485],{"class":446},[424,1598,1000],{"class":740},[424,1600,485],{"class":446},[424,1602,1118],{"class":740},[424,1604,485],{"class":446},[424,1606,1607],{"class":740}," 2",[424,1609,1271],{"class":446},[424,1611,1613,1616,1618,1620,1622,1624,1626,1629,1631,1634,1636,1639,1641,1643],{"class":426,"line":1612},34,[424,1614,1615],{"class":769},"    score",[424,1617,753],{"class":752},[424,1619,728],{"class":733},[424,1621,386],{"class":446},[424,1623,989],{"class":733},[424,1625,992],{"class":446},[424,1627,1628],{"class":740},"0.9",[424,1630,485],{"class":446},[424,1632,1633],{"class":740}," 0.6",[424,1635,485],{"class":446},[424,1637,1638],{"class":740}," 0.4",[424,1640,485],{"class":446},[424,1642,1452],{"class":740},[424,1644,1271],{"class":446},[424,1646,1648,1650,1652,1654,1656,1658,1660,1663,1665,1667,1669,1671,1674,1676,1679,1681,1683,1686,1688,1690,1692,1694,1697,1699,1701],{"class":426,"line":1647},35,[424,1649,1276],{"class":769},[424,1651,753],{"class":752},[424,1653,728],{"class":733},[424,1655,386],{"class":446},[424,1657,989],{"class":733},[424,1659,1287],{"class":446},[424,1661,1662],{"class":740},"2.0",[424,1664,485],{"class":446},[424,1666,1294],{"class":740},[424,1668,1008],{"class":446},[424,1670,1299],{"class":446},[424,1672,1673],{"class":740},"49.0",[424,1675,485],{"class":446},[424,1677,1678],{"class":740}," 1.0",[424,1680,1008],{"class":446},[424,1682,1299],{"class":446},[424,1684,1685],{"class":740},"98.0",[424,1687,485],{"class":446},[424,1689,1294],{"class":740},[424,1691,1008],{"class":446},[424,1693,1299],{"class":446},[424,1695,1696],{"class":740},"200.0",[424,1698,485],{"class":446},[424,1700,1294],{"class":740},[424,1702,1320],{"class":446},[424,1704,1706,1708,1710,1712,1714],{"class":426,"line":1705},36,[424,1707,1325],{"class":769},[424,1709,753],{"class":752},[424,1711,1330],{"class":446},[424,1713,1367],{"class":733},[424,1715,1145],{"class":446},[424,1717,1719],{"class":426,"line":1718},37,[424,1720,627],{"class":446},[415,1722,1724],{"className":417,"code":1723,"language":419,"meta":420,"style":420},"def report(name: str, outcome):\n    pairs = outcome.matched_pairs.tolist()\n    res_cs = outcome.tracklets_residual_index.tolist()\n    res_ds = outcome.detections_residual_index.tolist()\n    print(f\"{name:30s} matched={pairs}, residual cs={res_cs}, ds={res_ds}\")\n\n",[353,1725,1726,1756,1778,1798,1818],{"__ignoreMap":420},[424,1727,1728,1732,1736,1738,1742,1745,1748,1750,1753],{"class":426,"line":427},[424,1729,1731],{"class":1730},"sbsja","def",[424,1733,1735],{"class":1734},"sGLFI"," report",[424,1737,737],{"class":446},[424,1739,1741],{"class":1740},"sFwrP","name",[424,1743,1744],{"class":446},":",[424,1746,1747],{"class":883}," str",[424,1749,485],{"class":446},[424,1751,1752],{"class":1740}," outcome",[424,1754,1755],{"class":446},"):\n",[424,1757,1758,1761,1763,1765,1767,1770,1772,1775],{"class":426,"line":438},[424,1759,1760],{"class":434},"    pairs ",[424,1762,753],{"class":752},[424,1764,1752],{"class":434},[424,1766,386],{"class":446},[424,1768,1769],{"class":449},"matched_pairs",[424,1771,386],{"class":446},[424,1773,1774],{"class":733},"tolist",[424,1776,1777],{"class":446},"()\n",[424,1779,1780,1783,1785,1787,1789,1792,1794,1796],{"class":426,"line":459},[424,1781,1782],{"class":434},"    res_cs ",[424,1784,753],{"class":752},[424,1786,1752],{"class":434},[424,1788,386],{"class":446},[424,1790,1791],{"class":449},"tracklets_residual_index",[424,1793,386],{"class":446},[424,1795,1774],{"class":733},[424,1797,1777],{"class":446},[424,1799,1800,1803,1805,1807,1809,1812,1814,1816],{"class":426,"line":466},[424,1801,1802],{"class":434},"    res_ds ",[424,1804,753],{"class":752},[424,1806,1752],{"class":434},[424,1808,386],{"class":446},[424,1810,1811],{"class":449},"detections_residual_index",[424,1813,386],{"class":446},[424,1815,1774],{"class":733},[424,1817,1777],{"class":446},[424,1819,1820,1824,1826,1829,1833,1836,1838,1841,1844,1847,1849,1852,1854,1857,1859,1862,1864,1867,1869,1872,1874,1876],{"class":426,"line":496},[424,1821,1823],{"class":1822},"sptTA","    print",[424,1825,737],{"class":446},[424,1827,1828],{"class":1730},"f",[424,1830,1832],{"class":1831},"s_sjI","\"",[424,1834,1835],{"class":740},"{",[424,1837,1741],{"class":733},[424,1839,1840],{"class":1730},":30s",[424,1842,1843],{"class":740},"}",[424,1845,1846],{"class":1831}," matched=",[424,1848,1835],{"class":740},[424,1850,1851],{"class":733},"pairs",[424,1853,1843],{"class":740},[424,1855,1856],{"class":1831},", residual cs=",[424,1858,1835],{"class":740},[424,1860,1861],{"class":733},"res_cs",[424,1863,1843],{"class":740},[424,1865,1866],{"class":1831},", ds=",[424,1868,1835],{"class":740},[424,1870,1871],{"class":733},"res_ds",[424,1873,1843],{"class":740},[424,1875,1832],{"class":1831},[424,1877,627],{"class":446},[779,1879,1881],{"id":1880},"the-fixture-at-a-glance","The fixture, at a glance",[338,1883,1884,1885,1888,1889,1892],{},"Every combinator below runs on this same data, so it's worth\nseeing it once. Squares are tracklets, circles are detections,\ncolored by class. The right panel is the appearance similarity\n(cosine over ",[353,1886,1887],{},"kernel",") between every tracklet and detection — the\ndiagonal three are near-matches, and ",[353,1890,1891],{},"ds3"," (class 2, novel\nkernel) matches nothing. Watch how each combinator carves up\nexactly this picture.",[415,1894,1896],{"className":417,"code":1895,"language":419,"meta":420,"style":420},"fig, (axp, axk) = plt.subplots(1, 2, figsize=(12, 4))\ncmap = plt.get_cmap(\"tab10\")\n\n# (left) spatial layout, annotated with class \u002F score \u002F age.\nfor i in range(N):\n    p = cs.position[i]\n    axp.scatter(\n        p[0],\n        p[1],\n        marker=\"s\",\n        s=170,\n        color=cmap(int(cs.klass[i])),\n        edgecolor=\"black\",\n        zorder=3,\n    )\n    axp.annotate(\n        f\"cs{i} cls={int(cs.klass[i])} age={int(cs.age[i])}\",\n        (p[0], p[1]),\n        textcoords=\"offset points\",\n        xytext=(8, 8),\n        fontsize=8,\n    )\nfor j in range(M):\n    p = ds.position[j]\n    axp.scatter(\n        p[0],\n        p[1],\n        marker=\"o\",\n        s=110,\n        color=cmap(int(ds.klass[j])),\n        edgecolor=\"black\",\n        zorder=3,\n    )\n    axp.annotate(\n        f\"ds{j} cls={int(ds.klass[j])} s={ds.score[j]:.2f}\",\n        (p[0], p[1]),\n        textcoords=\"offset points\",\n        xytext=(8, -16),\n        fontsize=8,\n    )\naxp.set_title(\"Fixture in 2D — squares=tracklets, circles=detections (color=class)\")\naxp.set_xlabel(\"x\")\naxp.set_ylabel(\"y\")\naxp.grid(alpha=0.3)\n\n# (right) appearance similarity, cs x ds.\nkn = torch.nn.functional.normalize\nsim = kn(cs.kernel, dim=-1) @ kn(ds.kernel, dim=-1).T\nim = axk.imshow(sim.numpy(), cmap=\"viridis\", vmin=0, vmax=1)\naxk.set_title(\"Appearance similarity (cs × ds)\")\naxk.set_xlabel(\"ds\")\naxk.set_ylabel(\"cs\")\naxk.set_xticks(range(M))\naxk.set_yticks(range(N))\nfor i in range(N):\n    for j in range(M):\n        axk.text(\n            j,\n            i,\n            f\"{sim[i, j]:.2f}\",\n            ha=\"center\",\n            va=\"center\",\n            color=\"white\",\n            fontsize=8,\n        )\nfig.colorbar(im, ax=axk, fraction=0.046)\nplt.tight_layout()\nplt.show()\n\n",[353,1897,1898,1958,1984,1988,1993,2013,2036,2048,2059,2069,2085,2097,2129,2145,2157,2162,2173,2239,2261,2277,2296,2307,2311,2328,2348,2358,2368,2378,2393,2404,2431,2445,2455,2459,2469,2532,2552,2566,2587,2598,2603,2624,2645,2666,2688,2693,2699,2725,2783,2843,2864,2883,2902,2923,2943,2960,2978,2991,2999,3007,3038,3055,3071,3088,3100,3106,3142,3155],{"__ignoreMap":420},[424,1899,1900,1903,1905,1908,1911,1913,1916,1919,1922,1925,1927,1930,1932,1934,1936,1938,1940,1943,1945,1947,1950,1952,1955],{"class":426,"line":427},[424,1901,1902],{"class":434},"fig",[424,1904,485],{"class":446},[424,1906,1907],{"class":446}," (",[424,1909,1910],{"class":434},"axp",[424,1912,485],{"class":446},[424,1914,1915],{"class":434}," axk",[424,1917,1918],{"class":446},")",[424,1920,1921],{"class":752}," =",[424,1923,1924],{"class":434}," plt",[424,1926,386],{"class":446},[424,1928,1929],{"class":733},"subplots",[424,1931,737],{"class":446},[424,1933,995],{"class":740},[424,1935,485],{"class":446},[424,1937,1607],{"class":740},[424,1939,485],{"class":446},[424,1941,1942],{"class":769}," figsize",[424,1944,753],{"class":752},[424,1946,737],{"class":446},[424,1948,1949],{"class":740},"12",[424,1951,485],{"class":446},[424,1953,1954],{"class":740}," 4",[424,1956,1957],{"class":446},"))\n",[424,1959,1960,1963,1965,1967,1969,1972,1974,1977,1980,1982],{"class":426,"line":438},[424,1961,1962],{"class":434},"cmap ",[424,1964,753],{"class":752},[424,1966,1924],{"class":434},[424,1968,386],{"class":446},[424,1970,1971],{"class":733},"get_cmap",[424,1973,737],{"class":446},[424,1975,1832],{"class":1976},"sjJ54",[424,1978,1979],{"class":1831},"tab10",[424,1981,1832],{"class":1976},[424,1983,627],{"class":446},[424,1985,1986],{"class":426,"line":459},[424,1987,463],{"emptyLinePlaceholder":462},[424,1989,1990],{"class":426,"line":466},[424,1991,1992],{"class":1023},"# (left) spatial layout, annotated with class \u002F score \u002F age.\n",[424,1994,1995,1998,2001,2004,2007,2009,2011],{"class":426,"line":496},[424,1996,1997],{"class":430},"for",[424,1999,2000],{"class":434}," i ",[424,2002,2003],{"class":430},"in",[424,2005,2006],{"class":1822}," range",[424,2008,737],{"class":446},[424,2010,795],{"class":733},[424,2012,1755],{"class":446},[424,2014,2015,2018,2020,2023,2025,2028,2030,2033],{"class":426,"line":528},[424,2016,2017],{"class":434},"    p ",[424,2019,753],{"class":752},[424,2021,2022],{"class":434}," cs",[424,2024,386],{"class":446},[424,2026,2027],{"class":449},"position",[424,2029,1330],{"class":446},[424,2031,2032],{"class":449},"i",[424,2034,2035],{"class":446},"]\n",[424,2037,2038,2041,2043,2046],{"class":426,"line":555},[424,2039,2040],{"class":434},"    axp",[424,2042,386],{"class":446},[424,2044,2045],{"class":733},"scatter",[424,2047,823],{"class":446},[424,2049,2050,2053,2055,2057],{"class":426,"line":582},[424,2051,2052],{"class":733},"        p",[424,2054,1330],{"class":446},[424,2056,741],{"class":740},[424,2058,1145],{"class":446},[424,2060,2061,2063,2065,2067],{"class":426,"line":599},[424,2062,2052],{"class":733},[424,2064,1330],{"class":446},[424,2066,995],{"class":740},[424,2068,1145],{"class":446},[424,2070,2071,2074,2076,2078,2081,2083],{"class":426,"line":608},[424,2072,2073],{"class":769},"        marker",[424,2075,753],{"class":752},[424,2077,1832],{"class":1976},[424,2079,2080],{"class":1831},"s",[424,2082,1832],{"class":1976},[424,2084,605],{"class":446},[424,2086,2087,2090,2092,2095],{"class":426,"line":616},[424,2088,2089],{"class":769},"        s",[424,2091,753],{"class":752},[424,2093,2094],{"class":740},"170",[424,2096,605],{"class":446},[424,2098,2099,2102,2104,2107,2109,2112,2114,2117,2119,2122,2124,2126],{"class":426,"line":624},[424,2100,2101],{"class":769},"        color",[424,2103,753],{"class":752},[424,2105,2106],{"class":733},"cmap",[424,2108,737],{"class":446},[424,2110,2111],{"class":883},"int",[424,2113,737],{"class":446},[424,2115,2116],{"class":733},"cs",[424,2118,386],{"class":446},[424,2120,2121],{"class":449},"klass",[424,2123,1330],{"class":446},[424,2125,2032],{"class":449},[424,2127,2128],{"class":446},"])),\n",[424,2130,2131,2134,2136,2138,2141,2143],{"class":426,"line":630},[424,2132,2133],{"class":769},"        edgecolor",[424,2135,753],{"class":752},[424,2137,1832],{"class":1976},[424,2139,2140],{"class":1831},"black",[424,2142,1832],{"class":1976},[424,2144,605],{"class":446},[424,2146,2147,2150,2152,2155],{"class":426,"line":646},[424,2148,2149],{"class":769},"        zorder",[424,2151,753],{"class":752},[424,2153,2154],{"class":740},"3",[424,2156,605],{"class":446},[424,2158,2159],{"class":426,"line":654},[424,2160,2161],{"class":446},"    )\n",[424,2163,2164,2166,2168,2171],{"class":426,"line":662},[424,2165,2040],{"class":434},[424,2167,386],{"class":446},[424,2169,2170],{"class":733},"annotate",[424,2172,823],{"class":446},[424,2174,2175,2178,2181,2183,2185,2187,2190,2192,2194,2196,2198,2200,2202,2204,2206,2209,2211,2214,2216,2218,2220,2222,2224,2227,2229,2231,2233,2235,2237],{"class":426,"line":670},[424,2176,2177],{"class":1730},"        f",[424,2179,2180],{"class":1831},"\"cs",[424,2182,1835],{"class":740},[424,2184,2032],{"class":733},[424,2186,1843],{"class":740},[424,2188,2189],{"class":1831}," cls=",[424,2191,1835],{"class":740},[424,2193,2111],{"class":883},[424,2195,737],{"class":446},[424,2197,2116],{"class":733},[424,2199,386],{"class":446},[424,2201,2121],{"class":449},[424,2203,1330],{"class":446},[424,2205,2032],{"class":449},[424,2207,2208],{"class":446},"])",[424,2210,1843],{"class":740},[424,2212,2213],{"class":1831}," age=",[424,2215,1835],{"class":740},[424,2217,2111],{"class":883},[424,2219,737],{"class":446},[424,2221,2116],{"class":733},[424,2223,386],{"class":446},[424,2225,2226],{"class":449},"age",[424,2228,1330],{"class":446},[424,2230,2032],{"class":449},[424,2232,2208],{"class":446},[424,2234,1843],{"class":740},[424,2236,1832],{"class":1831},[424,2238,605],{"class":446},[424,2240,2241,2244,2246,2248,2250,2252,2255,2257,2259],{"class":426,"line":678},[424,2242,2243],{"class":446},"        (",[424,2245,338],{"class":733},[424,2247,1330],{"class":446},[424,2249,741],{"class":740},[424,2251,1008],{"class":446},[424,2253,2254],{"class":733}," p",[424,2256,1330],{"class":446},[424,2258,995],{"class":740},[424,2260,1271],{"class":446},[424,2262,2263,2266,2268,2270,2273,2275],{"class":426,"line":686},[424,2264,2265],{"class":769},"        textcoords",[424,2267,753],{"class":752},[424,2269,1832],{"class":1976},[424,2271,2272],{"class":1831},"offset points",[424,2274,1832],{"class":1976},[424,2276,605],{"class":446},[424,2278,2279,2282,2284,2286,2289,2291,2294],{"class":426,"line":694},[424,2280,2281],{"class":769},"        xytext",[424,2283,753],{"class":752},[424,2285,737],{"class":446},[424,2287,2288],{"class":740},"8",[424,2290,485],{"class":446},[424,2292,2293],{"class":740}," 8",[424,2295,858],{"class":446},[424,2297,2298,2301,2303,2305],{"class":426,"line":699},[424,2299,2300],{"class":769},"        fontsize",[424,2302,753],{"class":752},[424,2304,2288],{"class":740},[424,2306,605],{"class":446},[424,2308,2309],{"class":426,"line":720},[424,2310,2161],{"class":446},[424,2312,2313,2315,2318,2320,2322,2324,2326],{"class":426,"line":725},[424,2314,1997],{"class":430},[424,2316,2317],{"class":434}," j ",[424,2319,2003],{"class":430},[424,2321,2006],{"class":1822},[424,2323,737],{"class":446},[424,2325,1367],{"class":733},[424,2327,1755],{"class":446},[424,2329,2330,2332,2334,2337,2339,2341,2343,2346],{"class":426,"line":746},[424,2331,2017],{"class":434},[424,2333,753],{"class":752},[424,2335,2336],{"class":434}," ds",[424,2338,386],{"class":446},[424,2340,2027],{"class":449},[424,2342,1330],{"class":446},[424,2344,2345],{"class":449},"j",[424,2347,2035],{"class":446},[424,2349,2350,2352,2354,2356],{"class":426,"line":1398},[424,2351,2040],{"class":434},[424,2353,386],{"class":446},[424,2355,2045],{"class":733},[424,2357,823],{"class":446},[424,2359,2360,2362,2364,2366],{"class":426,"line":1403},[424,2361,2052],{"class":733},[424,2363,1330],{"class":446},[424,2365,741],{"class":740},[424,2367,1145],{"class":446},[424,2369,2370,2372,2374,2376],{"class":426,"line":1442},[424,2371,2052],{"class":733},[424,2373,1330],{"class":446},[424,2375,995],{"class":740},[424,2377,1145],{"class":446},[424,2379,2380,2382,2384,2386,2389,2391],{"class":426,"line":1481},[424,2381,2073],{"class":769},[424,2383,753],{"class":752},[424,2385,1832],{"class":1976},[424,2387,2388],{"class":1831},"o",[424,2390,1832],{"class":1976},[424,2392,605],{"class":446},[424,2394,2395,2397,2399,2402],{"class":426,"line":1518},[424,2396,2089],{"class":769},[424,2398,753],{"class":752},[424,2400,2401],{"class":740},"110",[424,2403,605],{"class":446},[424,2405,2406,2408,2410,2412,2414,2416,2418,2421,2423,2425,2427,2429],{"class":426,"line":1555},[424,2407,2101],{"class":769},[424,2409,753],{"class":752},[424,2411,2106],{"class":733},[424,2413,737],{"class":446},[424,2415,2111],{"class":883},[424,2417,737],{"class":446},[424,2419,2420],{"class":733},"ds",[424,2422,386],{"class":446},[424,2424,2121],{"class":449},[424,2426,1330],{"class":446},[424,2428,2345],{"class":449},[424,2430,2128],{"class":446},[424,2432,2433,2435,2437,2439,2441,2443],{"class":426,"line":1560},[424,2434,2133],{"class":769},[424,2436,753],{"class":752},[424,2438,1832],{"class":1976},[424,2440,2140],{"class":1831},[424,2442,1832],{"class":1976},[424,2444,605],{"class":446},[424,2446,2447,2449,2451,2453],{"class":426,"line":1575},[424,2448,2149],{"class":769},[424,2450,753],{"class":752},[424,2452,2154],{"class":740},[424,2454,605],{"class":446},[424,2456,2457],{"class":426,"line":1580},[424,2458,2161],{"class":446},[424,2460,2461,2463,2465,2467],{"class":426,"line":1612},[424,2462,2040],{"class":434},[424,2464,386],{"class":446},[424,2466,2170],{"class":733},[424,2468,823],{"class":446},[424,2470,2471,2473,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2507,2509,2511,2513,2516,2518,2520,2523,2526,2528,2530],{"class":426,"line":1647},[424,2472,2177],{"class":1730},[424,2474,2475],{"class":1831},"\"ds",[424,2477,1835],{"class":740},[424,2479,2345],{"class":733},[424,2481,1843],{"class":740},[424,2483,2189],{"class":1831},[424,2485,1835],{"class":740},[424,2487,2111],{"class":883},[424,2489,737],{"class":446},[424,2491,2420],{"class":733},[424,2493,386],{"class":446},[424,2495,2121],{"class":449},[424,2497,1330],{"class":446},[424,2499,2345],{"class":449},[424,2501,2208],{"class":446},[424,2503,1843],{"class":740},[424,2505,2506],{"class":1831}," s=",[424,2508,1835],{"class":740},[424,2510,2420],{"class":733},[424,2512,386],{"class":446},[424,2514,2515],{"class":449},"score",[424,2517,1330],{"class":446},[424,2519,2345],{"class":449},[424,2521,2522],{"class":446},"]",[424,2524,2525],{"class":1730},":.2f",[424,2527,1843],{"class":740},[424,2529,1832],{"class":1831},[424,2531,605],{"class":446},[424,2533,2534,2536,2538,2540,2542,2544,2546,2548,2550],{"class":426,"line":1705},[424,2535,2243],{"class":446},[424,2537,338],{"class":733},[424,2539,1330],{"class":446},[424,2541,741],{"class":740},[424,2543,1008],{"class":446},[424,2545,2254],{"class":733},[424,2547,1330],{"class":446},[424,2549,995],{"class":740},[424,2551,1271],{"class":446},[424,2553,2554,2556,2558,2560,2562,2564],{"class":426,"line":1718},[424,2555,2265],{"class":769},[424,2557,753],{"class":752},[424,2559,1832],{"class":1976},[424,2561,2272],{"class":1831},[424,2563,1832],{"class":1976},[424,2565,605],{"class":446},[424,2567,2569,2571,2573,2575,2577,2579,2582,2585],{"class":426,"line":2568},38,[424,2570,2281],{"class":769},[424,2572,753],{"class":752},[424,2574,737],{"class":446},[424,2576,2288],{"class":740},[424,2578,485],{"class":446},[424,2580,2581],{"class":752}," -",[424,2583,2584],{"class":740},"16",[424,2586,858],{"class":446},[424,2588,2590,2592,2594,2596],{"class":426,"line":2589},39,[424,2591,2300],{"class":769},[424,2593,753],{"class":752},[424,2595,2288],{"class":740},[424,2597,605],{"class":446},[424,2599,2601],{"class":426,"line":2600},40,[424,2602,2161],{"class":446},[424,2604,2606,2608,2610,2613,2615,2617,2620,2622],{"class":426,"line":2605},41,[424,2607,1910],{"class":434},[424,2609,386],{"class":446},[424,2611,2612],{"class":733},"set_title",[424,2614,737],{"class":446},[424,2616,1832],{"class":1976},[424,2618,2619],{"class":1831},"Fixture in 2D — squares=tracklets, circles=detections (color=class)",[424,2621,1832],{"class":1976},[424,2623,627],{"class":446},[424,2625,2627,2629,2631,2634,2636,2638,2641,2643],{"class":426,"line":2626},42,[424,2628,1910],{"class":434},[424,2630,386],{"class":446},[424,2632,2633],{"class":733},"set_xlabel",[424,2635,737],{"class":446},[424,2637,1832],{"class":1976},[424,2639,2640],{"class":1831},"x",[424,2642,1832],{"class":1976},[424,2644,627],{"class":446},[424,2646,2648,2650,2652,2655,2657,2659,2662,2664],{"class":426,"line":2647},43,[424,2649,1910],{"class":434},[424,2651,386],{"class":446},[424,2653,2654],{"class":733},"set_ylabel",[424,2656,737],{"class":446},[424,2658,1832],{"class":1976},[424,2660,2661],{"class":1831},"y",[424,2663,1832],{"class":1976},[424,2665,627],{"class":446},[424,2667,2669,2671,2673,2676,2678,2681,2683,2686],{"class":426,"line":2668},44,[424,2670,1910],{"class":434},[424,2672,386],{"class":446},[424,2674,2675],{"class":733},"grid",[424,2677,737],{"class":446},[424,2679,2680],{"class":769},"alpha",[424,2682,753],{"class":752},[424,2684,2685],{"class":740},"0.3",[424,2687,627],{"class":446},[424,2689,2691],{"class":426,"line":2690},45,[424,2692,463],{"emptyLinePlaceholder":462},[424,2694,2696],{"class":426,"line":2695},46,[424,2697,2698],{"class":1023},"# (right) appearance similarity, cs x ds.\n",[424,2700,2702,2705,2707,2710,2712,2715,2717,2720,2722],{"class":426,"line":2701},47,[424,2703,2704],{"class":434},"kn ",[424,2706,753],{"class":752},[424,2708,2709],{"class":434}," torch",[424,2711,386],{"class":446},[424,2713,2714],{"class":449},"nn",[424,2716,386],{"class":446},[424,2718,2719],{"class":449},"functional",[424,2721,386],{"class":446},[424,2723,2724],{"class":449},"normalize\n",[424,2726,2728,2731,2733,2736,2738,2740,2742,2744,2746,2749,2752,2754,2756,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2780],{"class":426,"line":2727},48,[424,2729,2730],{"class":434},"sim ",[424,2732,753],{"class":752},[424,2734,2735],{"class":733}," kn",[424,2737,737],{"class":446},[424,2739,2116],{"class":733},[424,2741,386],{"class":446},[424,2743,1887],{"class":449},[424,2745,485],{"class":446},[424,2747,2748],{"class":769}," dim",[424,2750,2751],{"class":752},"=-",[424,2753,995],{"class":740},[424,2755,1918],{"class":446},[424,2757,2758],{"class":752}," @",[424,2760,2735],{"class":733},[424,2762,737],{"class":446},[424,2764,2420],{"class":733},[424,2766,386],{"class":446},[424,2768,1887],{"class":449},[424,2770,485],{"class":446},[424,2772,2748],{"class":769},[424,2774,2751],{"class":752},[424,2776,995],{"class":740},[424,2778,2779],{"class":446},").",[424,2781,2782],{"class":449},"T\n",[424,2784,2786,2789,2791,2793,2795,2798,2800,2803,2805,2808,2811,2814,2816,2818,2821,2823,2825,2828,2830,2832,2834,2837,2839,2841],{"class":426,"line":2785},49,[424,2787,2788],{"class":434},"im ",[424,2790,753],{"class":752},[424,2792,1915],{"class":434},[424,2794,386],{"class":446},[424,2796,2797],{"class":733},"imshow",[424,2799,737],{"class":446},[424,2801,2802],{"class":733},"sim",[424,2804,386],{"class":446},[424,2806,2807],{"class":733},"numpy",[424,2809,2810],{"class":446},"(),",[424,2812,2813],{"class":769}," cmap",[424,2815,753],{"class":752},[424,2817,1832],{"class":1976},[424,2819,2820],{"class":1831},"viridis",[424,2822,1832],{"class":1976},[424,2824,485],{"class":446},[424,2826,2827],{"class":769}," vmin",[424,2829,753],{"class":752},[424,2831,741],{"class":740},[424,2833,485],{"class":446},[424,2835,2836],{"class":769}," vmax",[424,2838,753],{"class":752},[424,2840,995],{"class":740},[424,2842,627],{"class":446},[424,2844,2846,2849,2851,2853,2855,2857,2860,2862],{"class":426,"line":2845},50,[424,2847,2848],{"class":434},"axk",[424,2850,386],{"class":446},[424,2852,2612],{"class":733},[424,2854,737],{"class":446},[424,2856,1832],{"class":1976},[424,2858,2859],{"class":1831},"Appearance similarity (cs × ds)",[424,2861,1832],{"class":1976},[424,2863,627],{"class":446},[424,2865,2867,2869,2871,2873,2875,2877,2879,2881],{"class":426,"line":2866},51,[424,2868,2848],{"class":434},[424,2870,386],{"class":446},[424,2872,2633],{"class":733},[424,2874,737],{"class":446},[424,2876,1832],{"class":1976},[424,2878,2420],{"class":1831},[424,2880,1832],{"class":1976},[424,2882,627],{"class":446},[424,2884,2886,2888,2890,2892,2894,2896,2898,2900],{"class":426,"line":2885},52,[424,2887,2848],{"class":434},[424,2889,386],{"class":446},[424,2891,2654],{"class":733},[424,2893,737],{"class":446},[424,2895,1832],{"class":1976},[424,2897,2116],{"class":1831},[424,2899,1832],{"class":1976},[424,2901,627],{"class":446},[424,2903,2905,2907,2909,2912,2914,2917,2919,2921],{"class":426,"line":2904},53,[424,2906,2848],{"class":434},[424,2908,386],{"class":446},[424,2910,2911],{"class":733},"set_xticks",[424,2913,737],{"class":446},[424,2915,2916],{"class":1822},"range",[424,2918,737],{"class":446},[424,2920,1367],{"class":733},[424,2922,1957],{"class":446},[424,2924,2926,2928,2930,2933,2935,2937,2939,2941],{"class":426,"line":2925},54,[424,2927,2848],{"class":434},[424,2929,386],{"class":446},[424,2931,2932],{"class":733},"set_yticks",[424,2934,737],{"class":446},[424,2936,2916],{"class":1822},[424,2938,737],{"class":446},[424,2940,795],{"class":733},[424,2942,1957],{"class":446},[424,2944,2946,2948,2950,2952,2954,2956,2958],{"class":426,"line":2945},55,[424,2947,1997],{"class":430},[424,2949,2000],{"class":434},[424,2951,2003],{"class":430},[424,2953,2006],{"class":1822},[424,2955,737],{"class":446},[424,2957,795],{"class":733},[424,2959,1755],{"class":446},[424,2961,2963,2966,2968,2970,2972,2974,2976],{"class":426,"line":2962},56,[424,2964,2965],{"class":430},"    for",[424,2967,2317],{"class":434},[424,2969,2003],{"class":430},[424,2971,2006],{"class":1822},[424,2973,737],{"class":446},[424,2975,1367],{"class":733},[424,2977,1755],{"class":446},[424,2979,2981,2984,2986,2989],{"class":426,"line":2980},57,[424,2982,2983],{"class":434},"        axk",[424,2985,386],{"class":446},[424,2987,2988],{"class":733},"text",[424,2990,823],{"class":446},[424,2992,2994,2997],{"class":426,"line":2993},58,[424,2995,2996],{"class":733},"            j",[424,2998,605],{"class":446},[424,3000,3002,3005],{"class":426,"line":3001},59,[424,3003,3004],{"class":733},"            i",[424,3006,605],{"class":446},[424,3008,3010,3013,3015,3017,3019,3021,3023,3025,3028,3030,3032,3034,3036],{"class":426,"line":3009},60,[424,3011,3012],{"class":1730},"            f",[424,3014,1832],{"class":1831},[424,3016,1835],{"class":740},[424,3018,2802],{"class":733},[424,3020,1330],{"class":446},[424,3022,2032],{"class":733},[424,3024,485],{"class":446},[424,3026,3027],{"class":733}," j",[424,3029,2522],{"class":446},[424,3031,2525],{"class":1730},[424,3033,1843],{"class":740},[424,3035,1832],{"class":1831},[424,3037,605],{"class":446},[424,3039,3041,3044,3046,3048,3051,3053],{"class":426,"line":3040},61,[424,3042,3043],{"class":769},"            ha",[424,3045,753],{"class":752},[424,3047,1832],{"class":1976},[424,3049,3050],{"class":1831},"center",[424,3052,1832],{"class":1976},[424,3054,605],{"class":446},[424,3056,3058,3061,3063,3065,3067,3069],{"class":426,"line":3057},62,[424,3059,3060],{"class":769},"            va",[424,3062,753],{"class":752},[424,3064,1832],{"class":1976},[424,3066,3050],{"class":1831},[424,3068,1832],{"class":1976},[424,3070,605],{"class":446},[424,3072,3074,3077,3079,3081,3084,3086],{"class":426,"line":3073},63,[424,3075,3076],{"class":769},"            color",[424,3078,753],{"class":752},[424,3080,1832],{"class":1976},[424,3082,3083],{"class":1831},"white",[424,3085,1832],{"class":1976},[424,3087,605],{"class":446},[424,3089,3091,3094,3096,3098],{"class":426,"line":3090},64,[424,3092,3093],{"class":769},"            fontsize",[424,3095,753],{"class":752},[424,3097,2288],{"class":740},[424,3099,605],{"class":446},[424,3101,3103],{"class":426,"line":3102},65,[424,3104,3105],{"class":446},"        )\n",[424,3107,3109,3111,3113,3116,3118,3121,3123,3126,3128,3130,3132,3135,3137,3140],{"class":426,"line":3108},66,[424,3110,1902],{"class":434},[424,3112,386],{"class":446},[424,3114,3115],{"class":733},"colorbar",[424,3117,737],{"class":446},[424,3119,3120],{"class":733},"im",[424,3122,485],{"class":446},[424,3124,3125],{"class":769}," ax",[424,3127,753],{"class":752},[424,3129,2848],{"class":733},[424,3131,485],{"class":446},[424,3133,3134],{"class":769}," fraction",[424,3136,753],{"class":752},[424,3138,3139],{"class":740},"0.046",[424,3141,627],{"class":446},[424,3143,3145,3148,3150,3153],{"class":426,"line":3144},67,[424,3146,3147],{"class":434},"plt",[424,3149,386],{"class":446},[424,3151,3152],{"class":733},"tight_layout",[424,3154,1777],{"class":446},[424,3156,3158,3160,3162,3165],{"class":426,"line":3157},68,[424,3159,3147],{"class":434},[424,3161,386],{"class":446},[424,3163,3164],{"class":733},"show",[424,3166,1777],{"class":446},[338,3168,3169],{},[3170,3171],"img",{"alt":420,"src":3172},"\u002F_nb\u002F914ea008076e991d.png",[779,3174,3176],{"id":3175},"pipe-the-costmatch-bridge","Pipe — the cost→match bridge",[338,3178,3179],{},"The simplest end-to-end stage: compute a cost, run an\nassignment.",[415,3181,3183],{"className":417,"code":3182,"language":419,"meta":420,"style":420},"pipe = Pipe(cost=Cosine(\"kernel\"), assoc=Associate(Jonker(threshold=0.5)))\nreport(\"Pipe(Cosine + Jonker)\", pipe(cs, ds, ctx))\n\n",[353,3184,3185,3240],{"__ignoreMap":420},[424,3186,3187,3190,3192,3195,3197,3199,3201,3204,3206,3208,3210,3212,3214,3217,3219,3222,3224,3227,3229,3232,3234,3237],{"class":426,"line":427},[424,3188,3189],{"class":434},"pipe ",[424,3191,753],{"class":752},[424,3193,3194],{"class":733}," Pipe",[424,3196,737],{"class":446},[424,3198,203],{"class":769},[424,3200,753],{"class":752},[424,3202,3203],{"class":733},"Cosine",[424,3205,737],{"class":446},[424,3207,1832],{"class":1976},[424,3209,1887],{"class":1831},[424,3211,1832],{"class":1976},[424,3213,897],{"class":446},[424,3215,3216],{"class":769}," assoc",[424,3218,753],{"class":752},[424,3220,3221],{"class":733},"Associate",[424,3223,737],{"class":446},[424,3225,3226],{"class":733},"Jonker",[424,3228,737],{"class":446},[424,3230,3231],{"class":769},"threshold",[424,3233,753],{"class":752},[424,3235,3236],{"class":740},"0.5",[424,3238,3239],{"class":446},")))\n",[424,3241,3242,3244,3246,3248,3251,3253,3255,3258,3260,3262,3264,3266,3268,3271],{"class":426,"line":438},[424,3243,167],{"class":733},[424,3245,737],{"class":446},[424,3247,1832],{"class":1976},[424,3249,3250],{"class":1831},"Pipe(Cosine + Jonker)",[424,3252,1832],{"class":1976},[424,3254,485],{"class":446},[424,3256,3257],{"class":733}," pipe",[424,3259,737],{"class":446},[424,3261,2116],{"class":733},[424,3263,485],{"class":446},[424,3265,2336],{"class":733},[424,3267,485],{"class":446},[424,3269,3270],{"class":733}," ctx",[424,3272,1957],{"class":446},[3274,3275],"docyard-notebook-output",{"data":3276,"kind":3277},"UGlwZShDb3NpbmUgKyBKb25rZXIpICAgICAgICAgIG1hdGNoZWQ9W1swLCAwXSwgWzEsIDFdLCBbMiwgMl1dLCByZXNpZHVhbCBjcz1bXSwgZHM9WzNdCg==","stream",[779,3279,3281],{"id":3280},"gated-apply-a-gate-before-the-body","Gated — apply a gate before the body",[338,3283,3284],{},"Gated is the wrap-this-with-a-gate combinator. With a per-pair\nClassGate, only same-class pairs are allowed before matching.",[415,3286,3288],{"className":417,"code":3287,"language":419,"meta":420,"style":420},"gated = Gated(gate=ClassGate(\"klass\"), then=pipe)\nreport(\"Gated(ClassGate, Pipe)\", gated(cs, ds, ctx))\n\n# Same Pipe gated by ScoreGate (per-detection)\ngated_score = Gated(gate=ScoreGate(\"score\", threshold=0.7), then=pipe)\nreport(\"Gated(ScoreGate>0.7, Pipe)\", gated_score(cs, ds, ctx))\n\n",[353,3289,3290,3329,3361,3365,3370,3416],{"__ignoreMap":420},[424,3291,3292,3295,3297,3300,3302,3304,3306,3309,3311,3313,3315,3317,3319,3322,3324,3327],{"class":426,"line":427},[424,3293,3294],{"class":434},"gated ",[424,3296,753],{"class":752},[424,3298,3299],{"class":733}," Gated",[424,3301,737],{"class":446},[424,3303,212],{"class":769},[424,3305,753],{"class":752},[424,3307,3308],{"class":733},"ClassGate",[424,3310,737],{"class":446},[424,3312,1832],{"class":1976},[424,3314,2121],{"class":1831},[424,3316,1832],{"class":1976},[424,3318,897],{"class":446},[424,3320,3321],{"class":769}," then",[424,3323,753],{"class":752},[424,3325,3326],{"class":733},"pipe",[424,3328,627],{"class":446},[424,3330,3331,3333,3335,3337,3340,3342,3344,3347,3349,3351,3353,3355,3357,3359],{"class":426,"line":438},[424,3332,167],{"class":733},[424,3334,737],{"class":446},[424,3336,1832],{"class":1976},[424,3338,3339],{"class":1831},"Gated(ClassGate, Pipe)",[424,3341,1832],{"class":1976},[424,3343,485],{"class":446},[424,3345,3346],{"class":733}," gated",[424,3348,737],{"class":446},[424,3350,2116],{"class":733},[424,3352,485],{"class":446},[424,3354,2336],{"class":733},[424,3356,485],{"class":446},[424,3358,3270],{"class":733},[424,3360,1957],{"class":446},[424,3362,3363],{"class":426,"line":459},[424,3364,463],{"emptyLinePlaceholder":462},[424,3366,3367],{"class":426,"line":466},[424,3368,3369],{"class":1023},"# Same Pipe gated by ScoreGate (per-detection)\n",[424,3371,3372,3375,3377,3379,3381,3383,3385,3388,3390,3392,3394,3396,3398,3401,3403,3406,3408,3410,3412,3414],{"class":426,"line":496},[424,3373,3374],{"class":434},"gated_score ",[424,3376,753],{"class":752},[424,3378,3299],{"class":733},[424,3380,737],{"class":446},[424,3382,212],{"class":769},[424,3384,753],{"class":752},[424,3386,3387],{"class":733},"ScoreGate",[424,3389,737],{"class":446},[424,3391,1832],{"class":1976},[424,3393,2515],{"class":1831},[424,3395,1832],{"class":1976},[424,3397,485],{"class":446},[424,3399,3400],{"class":769}," threshold",[424,3402,753],{"class":752},[424,3404,3405],{"class":740},"0.7",[424,3407,897],{"class":446},[424,3409,3321],{"class":769},[424,3411,753],{"class":752},[424,3413,3326],{"class":733},[424,3415,627],{"class":446},[424,3417,3418,3420,3422,3424,3427,3429,3431,3434,3436,3438,3440,3442,3444,3446],{"class":426,"line":528},[424,3419,167],{"class":733},[424,3421,737],{"class":446},[424,3423,1832],{"class":1976},[424,3425,3426],{"class":1831},"Gated(ScoreGate>0.7, Pipe)",[424,3428,1832],{"class":1976},[424,3430,485],{"class":446},[424,3432,3433],{"class":733}," gated_score",[424,3435,737],{"class":446},[424,3437,2116],{"class":733},[424,3439,485],{"class":446},[424,3441,2336],{"class":733},[424,3443,485],{"class":446},[424,3445,3270],{"class":733},[424,3447,1957],{"class":446},[3274,3449],{"data":3450,"kind":3277},"R2F0ZWQoQ2xhc3NHYXRlLCBQaXBlKSAgICAgICAgIG1hdGNoZWQ9W1swLCAwXSwgWzEsIDFdLCBbMiwgMl1dLCByZXNpZHVhbCBjcz1bXSwgZHM9WzNdCkdhdGVkKFNjb3JlR2F0ZT4wLjcsIFBpcGUpICAgICBtYXRjaGVkPVtbMCwgMF1dLCByZXNpZHVhbCBjcz1bMSwgMl0sIGRzPVszLCAxLCAyXQo=",[779,3452,3454],{"id":3453},"sequential-cascaded-matching","Sequential — cascaded matching",[338,3456,3457,3460],{},[353,3458,3459],{},"Sequential[MatchOutcome]([s1, s2, …])"," chains stages: each\nchild's residuals (unmatched cs, unmatched ds) feed the next.\nThis is cascaded fusion.",[415,3462,3464],{"className":417,"code":3463,"language":419,"meta":420,"style":420},"# Stage 1: strict cosine match (only near-perfect kernel similarity).\n# Stage 2: relaxed CDist on position for the leftovers.\nseq = Sequential(\n    [\n        Pipe(cost=Cosine(\"kernel\"), assoc=Associate(Jonker(threshold=0.06))),\n        Pipe(cost=CDist(\"position\"), assoc=Associate(Jonker(threshold=10.0))),\n    ]\n)\nreport(\"Sequential(strict, then relaxed)\", seq(cs, ds, ctx))\n\n",[353,3465,3466,3471,3476,3488,3493,3538,3582,3587,3591],{"__ignoreMap":420},[424,3467,3468],{"class":426,"line":427},[424,3469,3470],{"class":1023},"# Stage 1: strict cosine match (only near-perfect kernel similarity).\n",[424,3472,3473],{"class":426,"line":438},[424,3474,3475],{"class":1023},"# Stage 2: relaxed CDist on position for the leftovers.\n",[424,3477,3478,3481,3483,3486],{"class":426,"line":459},[424,3479,3480],{"class":434},"seq ",[424,3482,753],{"class":752},[424,3484,3485],{"class":733}," Sequential",[424,3487,823],{"class":446},[424,3489,3490],{"class":426,"line":466},[424,3491,3492],{"class":446},"    [\n",[424,3494,3495,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532,3535],{"class":426,"line":496},[424,3496,3497],{"class":733},"        Pipe",[424,3499,737],{"class":446},[424,3501,203],{"class":769},[424,3503,753],{"class":752},[424,3505,3203],{"class":733},[424,3507,737],{"class":446},[424,3509,1832],{"class":1976},[424,3511,1887],{"class":1831},[424,3513,1832],{"class":1976},[424,3515,897],{"class":446},[424,3517,3216],{"class":769},[424,3519,753],{"class":752},[424,3521,3221],{"class":733},[424,3523,737],{"class":446},[424,3525,3226],{"class":733},[424,3527,737],{"class":446},[424,3529,3231],{"class":769},[424,3531,753],{"class":752},[424,3533,3534],{"class":740},"0.06",[424,3536,3537],{"class":446},"))),\n",[424,3539,3540,3542,3544,3546,3548,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3580],{"class":426,"line":528},[424,3541,3497],{"class":733},[424,3543,737],{"class":446},[424,3545,203],{"class":769},[424,3547,753],{"class":752},[424,3549,3550],{"class":733},"CDist",[424,3552,737],{"class":446},[424,3554,1832],{"class":1976},[424,3556,2027],{"class":1831},[424,3558,1832],{"class":1976},[424,3560,897],{"class":446},[424,3562,3216],{"class":769},[424,3564,753],{"class":752},[424,3566,3221],{"class":733},[424,3568,737],{"class":446},[424,3570,3226],{"class":733},[424,3572,737],{"class":446},[424,3574,3231],{"class":769},[424,3576,753],{"class":752},[424,3578,3579],{"class":740},"10.0",[424,3581,3537],{"class":446},[424,3583,3584],{"class":426,"line":555},[424,3585,3586],{"class":446},"    ]\n",[424,3588,3589],{"class":426,"line":582},[424,3590,627],{"class":446},[424,3592,3593,3595,3597,3599,3602,3604,3606,3609,3611,3613,3615,3617,3619,3621],{"class":426,"line":599},[424,3594,167],{"class":733},[424,3596,737],{"class":446},[424,3598,1832],{"class":1976},[424,3600,3601],{"class":1831},"Sequential(strict, then relaxed)",[424,3603,1832],{"class":1976},[424,3605,485],{"class":446},[424,3607,3608],{"class":733}," seq",[424,3610,737],{"class":446},[424,3612,2116],{"class":733},[424,3614,485],{"class":446},[424,3616,2336],{"class":733},[424,3618,485],{"class":446},[424,3620,3270],{"class":733},[424,3622,1957],{"class":446},[3274,3624],{"data":3625,"kind":3277},"U2VxdWVudGlhbChzdHJpY3QsIHRoZW4gcmVsYXhlZCkgbWF0Y2hlZD1bWzAsIDBdLCBbMSwgMV0sIFsyLCAyXV0sIHJlc2lkdWFsIGNzPVtdLCBkcz1bM10K",[338,3627,3628],{},"Reading the result: stage 1 found two strong cosine matches;\nstage 2 picked up the remaining tracklet via position\nproximity.",[779,3630,3632,3633,3636],{"id":3631},"sequentialgate-folding-gates","Sequential",[424,3634,3635],{},"Gate"," — folding gates",[338,3638,3639,3640,3642],{},"Sequential of gate-producers folds children with ",[353,3641,385],{},".\nThat gives you a single gate that's the conjunction of all the\nchild gates.",[415,3644,3646],{"className":417,"code":3645,"language":419,"meta":420,"style":420},"gate_chain = Sequential(\n    [\n        ClassGate(\"klass\"),\n        ScoreGate(\"score\", threshold=0.5),\n    ]\n)\ncomposed = gate_chain(cs, ds, ctx)\nprint(f\"composed gate kind: {composed.kind}\")\nprint(f\"composed mask:\")\nprint(composed.mask.int())\n\n",[353,3647,3648,3659,3663,3678,3701,3705,3709,3733,3761,3774],{"__ignoreMap":420},[424,3649,3650,3653,3655,3657],{"class":426,"line":427},[424,3651,3652],{"class":434},"gate_chain ",[424,3654,753],{"class":752},[424,3656,3485],{"class":733},[424,3658,823],{"class":446},[424,3660,3661],{"class":426,"line":438},[424,3662,3492],{"class":446},[424,3664,3665,3668,3670,3672,3674,3676],{"class":426,"line":459},[424,3666,3667],{"class":733},"        ClassGate",[424,3669,737],{"class":446},[424,3671,1832],{"class":1976},[424,3673,2121],{"class":1831},[424,3675,1832],{"class":1976},[424,3677,858],{"class":446},[424,3679,3680,3683,3685,3687,3689,3691,3693,3695,3697,3699],{"class":426,"line":466},[424,3681,3682],{"class":733},"        ScoreGate",[424,3684,737],{"class":446},[424,3686,1832],{"class":1976},[424,3688,2515],{"class":1831},[424,3690,1832],{"class":1976},[424,3692,485],{"class":446},[424,3694,3400],{"class":769},[424,3696,753],{"class":752},[424,3698,3236],{"class":740},[424,3700,858],{"class":446},[424,3702,3703],{"class":426,"line":496},[424,3704,3586],{"class":446},[424,3706,3707],{"class":426,"line":528},[424,3708,627],{"class":446},[424,3710,3711,3714,3716,3719,3721,3723,3725,3727,3729,3731],{"class":426,"line":555},[424,3712,3713],{"class":434},"composed ",[424,3715,753],{"class":752},[424,3717,3718],{"class":733}," gate_chain",[424,3720,737],{"class":446},[424,3722,2116],{"class":733},[424,3724,485],{"class":446},[424,3726,2336],{"class":733},[424,3728,485],{"class":446},[424,3730,3270],{"class":733},[424,3732,627],{"class":446},[424,3734,3735,3738,3740,3742,3745,3747,3750,3752,3755,3757,3759],{"class":426,"line":582},[424,3736,3737],{"class":1822},"print",[424,3739,737],{"class":446},[424,3741,1828],{"class":1730},[424,3743,3744],{"class":1831},"\"composed gate kind: ",[424,3746,1835],{"class":740},[424,3748,3749],{"class":733},"composed",[424,3751,386],{"class":446},[424,3753,3754],{"class":449},"kind",[424,3756,1843],{"class":740},[424,3758,1832],{"class":1831},[424,3760,627],{"class":446},[424,3762,3763,3765,3767,3769,3772],{"class":426,"line":599},[424,3764,3737],{"class":1822},[424,3766,737],{"class":446},[424,3768,1828],{"class":1730},[424,3770,3771],{"class":1831},"\"composed mask:\"",[424,3773,627],{"class":446},[424,3775,3776,3778,3780,3782,3784,3787,3789,3791],{"class":426,"line":608},[424,3777,3737],{"class":1822},[424,3779,737],{"class":446},[424,3781,3749],{"class":733},[424,3783,386],{"class":446},[424,3785,3786],{"class":449},"mask",[424,3788,386],{"class":446},[424,3790,2111],{"class":733},[424,3792,3793],{"class":446},"())\n",[3274,3795],{"data":3796,"kind":3277},"Y29tcG9zZWQgZ2F0ZSBraW5kOiBwZXJfcGFpcgpjb21wb3NlZCBtYXNrOgp0ZW5zb3IoW1sxLCAwLCAwLCAwXSwKICAgICAgICBbMCwgMSwgMCwgMF0sCiAgICAgICAgWzEsIDAsIDAsIDBdXSwgZHR5cGU9dG9yY2guaW50MzIpCg==",[779,3798,3800],{"id":3799},"parallel-cost-level-merge","Parallel — cost-level merge",[338,3802,3803,3805,3806,3810,3811,3814],{},[353,3804,391],{}," runs each child ",[3807,3808,3809],"em",{},"on the same input","\nand combines their CostExpressions via a ",[353,3812,3813],{},"Merge"," strategy.\nThis is parallel fusion. Branches must be cost-\nproducers (not associators).",[415,3816,3818],{"className":417,"code":3817,"language":419,"meta":420,"style":420},"parallel = Parallel(\n    children=[Cosine(\"kernel\"), CDist(\"position\")],\n    merge=WeightedSum([1.0, 0.05]),\n)\n# Wrap in a Pipe so we can run it end-to-end.\npipe_parallel = Pipe(cost=parallel, assoc=Associate(Jonker(threshold=0.6)))\nreport(\"Parallel(Cosine, 0.05·CDist)\", pipe_parallel(cs, ds, ctx))\n\n",[353,3819,3820,3832,3866,3887,3891,3896,3937],{"__ignoreMap":420},[424,3821,3822,3825,3827,3830],{"class":426,"line":427},[424,3823,3824],{"class":434},"parallel ",[424,3826,753],{"class":752},[424,3828,3829],{"class":733}," Parallel",[424,3831,823],{"class":446},[424,3833,3834,3837,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857,3859,3861,3863],{"class":426,"line":438},[424,3835,3836],{"class":769},"    children",[424,3838,753],{"class":752},[424,3840,1330],{"class":446},[424,3842,3203],{"class":733},[424,3844,737],{"class":446},[424,3846,1832],{"class":1976},[424,3848,1887],{"class":1831},[424,3850,1832],{"class":1976},[424,3852,897],{"class":446},[424,3854,510],{"class":733},[424,3856,737],{"class":446},[424,3858,1832],{"class":1976},[424,3860,2027],{"class":1831},[424,3862,1832],{"class":1976},[424,3864,3865],{"class":446},")],\n",[424,3867,3868,3871,3873,3876,3878,3881,3883,3885],{"class":426,"line":459},[424,3869,3870],{"class":769},"    merge",[424,3872,753],{"class":752},[424,3874,3875],{"class":733},"WeightedSum",[424,3877,992],{"class":446},[424,3879,3880],{"class":740},"1.0",[424,3882,485],{"class":446},[424,3884,1413],{"class":740},[424,3886,1271],{"class":446},[424,3888,3889],{"class":426,"line":466},[424,3890,627],{"class":446},[424,3892,3893],{"class":426,"line":496},[424,3894,3895],{"class":1023},"# Wrap in a Pipe so we can run it end-to-end.\n",[424,3897,3898,3901,3903,3905,3907,3909,3911,3914,3916,3918,3920,3922,3924,3926,3928,3930,3932,3935],{"class":426,"line":528},[424,3899,3900],{"class":434},"pipe_parallel ",[424,3902,753],{"class":752},[424,3904,3194],{"class":733},[424,3906,737],{"class":446},[424,3908,203],{"class":769},[424,3910,753],{"class":752},[424,3912,3913],{"class":733},"parallel",[424,3915,485],{"class":446},[424,3917,3216],{"class":769},[424,3919,753],{"class":752},[424,3921,3221],{"class":733},[424,3923,737],{"class":446},[424,3925,3226],{"class":733},[424,3927,737],{"class":446},[424,3929,3231],{"class":769},[424,3931,753],{"class":752},[424,3933,3934],{"class":740},"0.6",[424,3936,3239],{"class":446},[424,3938,3939,3941,3943,3945,3948,3950,3952,3955,3957,3959,3961,3963,3965,3967],{"class":426,"line":555},[424,3940,167],{"class":733},[424,3942,737],{"class":446},[424,3944,1832],{"class":1976},[424,3946,3947],{"class":1831},"Parallel(Cosine, 0.05·CDist)",[424,3949,1832],{"class":1976},[424,3951,485],{"class":446},[424,3953,3954],{"class":733}," pipe_parallel",[424,3956,737],{"class":446},[424,3958,2116],{"class":733},[424,3960,485],{"class":446},[424,3962,2336],{"class":733},[424,3964,485],{"class":446},[424,3966,3270],{"class":733},[424,3968,1957],{"class":446},[3274,3970],{"data":3971,"kind":3277},"UGFyYWxsZWwoQ29zaW5lLCAwLjA1wrdDRGlzdCkgICBtYXRjaGVkPVtbMCwgMF0sIFsxLCAxXSwgWzIsIDJdXSwgcmVzaWR1YWwgY3M9W10sIGRzPVszXQo=",[779,3973,3975],{"id":3974},"filter-drop-rows-by-predicate","Filter — drop rows by predicate",[338,3977,3978,3980,3981,1744],{},[353,3979,403],{}," drops cs (or ds, or both) before\nthe body runs. Common predicates live in\n",[353,3982,3983],{},"unitrack.lifecycle",[347,3985,3986,3992],{},[350,3987,3988,3991],{},[353,3989,3990],{},"MaxAgeFilter(max_age=N)"," — keep tracklets matched within\nthe last N frames.",[350,3993,3994,3997],{},[353,3995,3996],{},"StatusFilter(*statuses)"," — keep tracklets in the listed\nstatus set.",[415,3999,4001],{"className":417,"code":4000,"language":419,"meta":420,"style":420},"# Drop tracklets aged > 4 (only cs[2] in our fixture has age=6).\nfiltered = Filter(MaxAgeFilter(max_age=4), on=\"cs\", then=pipe)\nreport(\"Filter(MaxAgeFilter(\u003C=4), Pipe)\", filtered(cs, ds, ctx))\n\n# Inspect what was filtered:\nprint(\"\\nages:\", cs.age.tolist())\nprint(\"After Filter, residual cs includes the filtered-out tracklet.\")\n\n",[353,4002,4003,4008,4056,4088,4092,4097,4128],{"__ignoreMap":420},[424,4004,4005],{"class":426,"line":427},[424,4006,4007],{"class":1023},"# Drop tracklets aged > 4 (only cs[2] in our fixture has age=6).\n",[424,4009,4010,4013,4015,4018,4020,4023,4025,4028,4030,4033,4035,4038,4040,4042,4044,4046,4048,4050,4052,4054],{"class":426,"line":438},[424,4011,4012],{"class":434},"filtered ",[424,4014,753],{"class":752},[424,4016,4017],{"class":733}," Filter",[424,4019,737],{"class":446},[424,4021,4022],{"class":733},"MaxAgeFilter",[424,4024,737],{"class":446},[424,4026,4027],{"class":769},"max_age",[424,4029,753],{"class":752},[424,4031,4032],{"class":740},"4",[424,4034,897],{"class":446},[424,4036,4037],{"class":769}," on",[424,4039,753],{"class":752},[424,4041,1832],{"class":1976},[424,4043,2116],{"class":1831},[424,4045,1832],{"class":1976},[424,4047,485],{"class":446},[424,4049,3321],{"class":769},[424,4051,753],{"class":752},[424,4053,3326],{"class":733},[424,4055,627],{"class":446},[424,4057,4058,4060,4062,4064,4067,4069,4071,4074,4076,4078,4080,4082,4084,4086],{"class":426,"line":459},[424,4059,167],{"class":733},[424,4061,737],{"class":446},[424,4063,1832],{"class":1976},[424,4065,4066],{"class":1831},"Filter(MaxAgeFilter(\u003C=4), Pipe)",[424,4068,1832],{"class":1976},[424,4070,485],{"class":446},[424,4072,4073],{"class":733}," filtered",[424,4075,737],{"class":446},[424,4077,2116],{"class":733},[424,4079,485],{"class":446},[424,4081,2336],{"class":733},[424,4083,485],{"class":446},[424,4085,3270],{"class":733},[424,4087,1957],{"class":446},[424,4089,4090],{"class":426,"line":466},[424,4091,463],{"emptyLinePlaceholder":462},[424,4093,4094],{"class":426,"line":496},[424,4095,4096],{"class":1023},"# Inspect what was filtered:\n",[424,4098,4099,4101,4103,4105,4109,4112,4114,4116,4118,4120,4122,4124,4126],{"class":426,"line":528},[424,4100,3737],{"class":1822},[424,4102,737],{"class":446},[424,4104,1832],{"class":1976},[424,4106,4108],{"class":4107},"s_hVV","\\n",[424,4110,4111],{"class":1831},"ages:",[424,4113,1832],{"class":1976},[424,4115,485],{"class":446},[424,4117,2022],{"class":733},[424,4119,386],{"class":446},[424,4121,2226],{"class":449},[424,4123,386],{"class":446},[424,4125,1774],{"class":733},[424,4127,3793],{"class":446},[424,4129,4130,4132,4134,4136,4139,4141],{"class":426,"line":555},[424,4131,3737],{"class":1822},[424,4133,737],{"class":446},[424,4135,1832],{"class":1976},[424,4137,4138],{"class":1831},"After Filter, residual cs includes the filtered-out tracklet.",[424,4140,1832],{"class":1976},[424,4142,627],{"class":446},[3274,4144],{"data":4145,"kind":3277},"RmlsdGVyKE1heEFnZUZpbHRlcig8PTQpLCBQaXBlKSBtYXRjaGVkPVtbMCwgMF0sIFsxLCAxXSwgWzIsIDJdXSwgcmVzaWR1YWwgY3M9W10sIGRzPVszXQoKYWdlczogWzEsIDEsIDZdCkFmdGVyIEZpbHRlciwgcmVzaWR1YWwgY3MgaW5jbHVkZXMgdGhlIGZpbHRlcmVkLW91dCB0cmFja2xldC4K",[338,4147,4148,4149,4151],{},"Note that the filtered-out tracklet (index 2, age=6) appears\nin ",[353,4150,1791],{}," — Filter remaps indices back to\nthe unfiltered space and adds the dropped rows to the residual,\nso the parent stage doesn't see \"missing\" tracklets.",[779,4153,4155],{"id":4154},"iterate-repeat-a-body","Iterate — repeat a body",[338,4157,4158,4160,4161,4164],{},[353,4159,409],{}," is ",[353,4162,4163],{},"Sequential[MatchOutcome]([body] * n)"," as\na single configuration knob — handy for HPO over the number of\ncascaded stages.",[415,4166,4168],{"className":417,"code":4167,"language":419,"meta":420,"style":420},"loop = Iterate(n=2, body=pipe)\nreport(\"Iterate(n=2, Pipe(Cosine))\", loop(cs, ds, ctx))\n\n",[353,4169,4170,4201],{"__ignoreMap":420},[424,4171,4172,4175,4177,4180,4182,4185,4187,4190,4192,4195,4197,4199],{"class":426,"line":427},[424,4173,4174],{"class":434},"loop ",[424,4176,753],{"class":752},[424,4178,4179],{"class":733}," Iterate",[424,4181,737],{"class":446},[424,4183,4184],{"class":769},"n",[424,4186,753],{"class":752},[424,4188,4189],{"class":740},"2",[424,4191,485],{"class":446},[424,4193,4194],{"class":769}," body",[424,4196,753],{"class":752},[424,4198,3326],{"class":733},[424,4200,627],{"class":446},[424,4202,4203,4205,4207,4209,4212,4214,4216,4219,4221,4223,4225,4227,4229,4231],{"class":426,"line":438},[424,4204,167],{"class":733},[424,4206,737],{"class":446},[424,4208,1832],{"class":1976},[424,4210,4211],{"class":1831},"Iterate(n=2, Pipe(Cosine))",[424,4213,1832],{"class":1976},[424,4215,485],{"class":446},[424,4217,4218],{"class":733}," loop",[424,4220,737],{"class":446},[424,4222,2116],{"class":733},[424,4224,485],{"class":446},[424,4226,2336],{"class":733},[424,4228,485],{"class":446},[424,4230,3270],{"class":733},[424,4232,1957],{"class":446},[3274,4234],{"data":4235,"kind":3277},"SXRlcmF0ZShuPTIsIFBpcGUoQ29zaW5lKSkgICAgIG1hdGNoZWQ9W1swLCAwXSwgWzEsIDFdLCBbMiwgMl1dLCByZXNpZHVhbCBjcz1bXSwgZHM9WzNdCg==",[779,4237,4239],{"id":4238},"side-by-side-cascaded-vs-parallel-fusion","Side-by-side: cascaded vs parallel fusion",[338,4241,4242],{},"On the same data, cascaded and parallel often produce different\nmatch sets. K=2 cascaded tends to outperform parallel.\nHere we verify the two paths produce the right shapes.",[415,4244,4246],{"className":417,"code":4245,"language":419,"meta":420,"style":420},"cascaded = Sequential(\n    [\n        Pipe(cost=Cosine(\"kernel\"), assoc=Associate(Jonker(threshold=0.4))),\n        Pipe(cost=CDist(\"position\"), assoc=Associate(Jonker(threshold=10.0))),\n    ]\n)\nparallel = Pipe(\n    cost=Parallel(\n        children=[Cosine(\"kernel\"), CDist(\"position\")],\n        merge=WeightedSum([1.0, 0.05]),\n    ),\n    assoc=Associate(Jonker(threshold=0.6)),\n)\nreport(\"CASCADED  (Cosine → CDist)\", cascaded(cs, ds, ctx))\nreport(\"PARALLEL  (Cosine + 0.05·CDist)\", parallel(cs, ds, ctx))\n\n",[353,4247,4248,4259,4263,4306,4348,4352,4356,4366,4378,4411,4430,4434,4458,4462,4494],{"__ignoreMap":420},[424,4249,4250,4253,4255,4257],{"class":426,"line":427},[424,4251,4252],{"class":434},"cascaded ",[424,4254,753],{"class":752},[424,4256,3485],{"class":733},[424,4258,823],{"class":446},[424,4260,4261],{"class":426,"line":438},[424,4262,3492],{"class":446},[424,4264,4265,4267,4269,4271,4273,4275,4277,4279,4281,4283,4285,4287,4289,4291,4293,4295,4297,4299,4301,4304],{"class":426,"line":459},[424,4266,3497],{"class":733},[424,4268,737],{"class":446},[424,4270,203],{"class":769},[424,4272,753],{"class":752},[424,4274,3203],{"class":733},[424,4276,737],{"class":446},[424,4278,1832],{"class":1976},[424,4280,1887],{"class":1831},[424,4282,1832],{"class":1976},[424,4284,897],{"class":446},[424,4286,3216],{"class":769},[424,4288,753],{"class":752},[424,4290,3221],{"class":733},[424,4292,737],{"class":446},[424,4294,3226],{"class":733},[424,4296,737],{"class":446},[424,4298,3231],{"class":769},[424,4300,753],{"class":752},[424,4302,4303],{"class":740},"0.4",[424,4305,3537],{"class":446},[424,4307,4308,4310,4312,4314,4316,4318,4320,4322,4324,4326,4328,4330,4332,4334,4336,4338,4340,4342,4344,4346],{"class":426,"line":466},[424,4309,3497],{"class":733},[424,4311,737],{"class":446},[424,4313,203],{"class":769},[424,4315,753],{"class":752},[424,4317,3550],{"class":733},[424,4319,737],{"class":446},[424,4321,1832],{"class":1976},[424,4323,2027],{"class":1831},[424,4325,1832],{"class":1976},[424,4327,897],{"class":446},[424,4329,3216],{"class":769},[424,4331,753],{"class":752},[424,4333,3221],{"class":733},[424,4335,737],{"class":446},[424,4337,3226],{"class":733},[424,4339,737],{"class":446},[424,4341,3231],{"class":769},[424,4343,753],{"class":752},[424,4345,3579],{"class":740},[424,4347,3537],{"class":446},[424,4349,4350],{"class":426,"line":496},[424,4351,3586],{"class":446},[424,4353,4354],{"class":426,"line":528},[424,4355,627],{"class":446},[424,4357,4358,4360,4362,4364],{"class":426,"line":555},[424,4359,3824],{"class":434},[424,4361,753],{"class":752},[424,4363,3194],{"class":733},[424,4365,823],{"class":446},[424,4367,4368,4371,4373,4376],{"class":426,"line":582},[424,4369,4370],{"class":769},"    cost",[424,4372,753],{"class":752},[424,4374,4375],{"class":733},"Parallel",[424,4377,823],{"class":446},[424,4379,4380,4383,4385,4387,4389,4391,4393,4395,4397,4399,4401,4403,4405,4407,4409],{"class":426,"line":599},[424,4381,4382],{"class":769},"        children",[424,4384,753],{"class":752},[424,4386,1330],{"class":446},[424,4388,3203],{"class":733},[424,4390,737],{"class":446},[424,4392,1832],{"class":1976},[424,4394,1887],{"class":1831},[424,4396,1832],{"class":1976},[424,4398,897],{"class":446},[424,4400,510],{"class":733},[424,4402,737],{"class":446},[424,4404,1832],{"class":1976},[424,4406,2027],{"class":1831},[424,4408,1832],{"class":1976},[424,4410,3865],{"class":446},[424,4412,4413,4416,4418,4420,4422,4424,4426,4428],{"class":426,"line":608},[424,4414,4415],{"class":769},"        merge",[424,4417,753],{"class":752},[424,4419,3875],{"class":733},[424,4421,992],{"class":446},[424,4423,3880],{"class":740},[424,4425,485],{"class":446},[424,4427,1413],{"class":740},[424,4429,1271],{"class":446},[424,4431,4432],{"class":426,"line":616},[424,4433,1243],{"class":446},[424,4435,4436,4439,4441,4443,4445,4447,4449,4451,4453,4455],{"class":426,"line":624},[424,4437,4438],{"class":769},"    assoc",[424,4440,753],{"class":752},[424,4442,3221],{"class":733},[424,4444,737],{"class":446},[424,4446,3226],{"class":733},[424,4448,737],{"class":446},[424,4450,3231],{"class":769},[424,4452,753],{"class":752},[424,4454,3934],{"class":740},[424,4456,4457],{"class":446},")),\n",[424,4459,4460],{"class":426,"line":630},[424,4461,627],{"class":446},[424,4463,4464,4466,4468,4470,4473,4475,4477,4480,4482,4484,4486,4488,4490,4492],{"class":426,"line":646},[424,4465,167],{"class":733},[424,4467,737],{"class":446},[424,4469,1832],{"class":1976},[424,4471,4472],{"class":1831},"CASCADED  (Cosine → CDist)",[424,4474,1832],{"class":1976},[424,4476,485],{"class":446},[424,4478,4479],{"class":733}," cascaded",[424,4481,737],{"class":446},[424,4483,2116],{"class":733},[424,4485,485],{"class":446},[424,4487,2336],{"class":733},[424,4489,485],{"class":446},[424,4491,3270],{"class":733},[424,4493,1957],{"class":446},[424,4495,4496,4498,4500,4502,4505,4507,4509,4512,4514,4516,4518,4520,4522,4524],{"class":426,"line":654},[424,4497,167],{"class":733},[424,4499,737],{"class":446},[424,4501,1832],{"class":1976},[424,4503,4504],{"class":1831},"PARALLEL  (Cosine + 0.05·CDist)",[424,4506,1832],{"class":1976},[424,4508,485],{"class":446},[424,4510,4511],{"class":733}," parallel",[424,4513,737],{"class":446},[424,4515,2116],{"class":733},[424,4517,485],{"class":446},[424,4519,2336],{"class":733},[424,4521,485],{"class":446},[424,4523,3270],{"class":733},[424,4525,1957],{"class":446},[3274,4527],{"data":4528,"kind":3277},"Q0FTQ0FERUQgIChDb3NpbmUg4oaSIENEaXN0KSAgICAgbWF0Y2hlZD1bWzAsIDBdLCBbMSwgMV0sIFsyLCAyXV0sIHJlc2lkdWFsIGNzPVtdLCBkcz1bM10KUEFSQUxMRUwgIChDb3NpbmUgKyAwLjA1wrdDRGlzdCkgbWF0Y2hlZD1bWzAsIDBdLCBbMSwgMV0sIFsyLCAyXV0sIHJlc2lkdWFsIGNzPVtdLCBkcz1bM10K",[779,4530,4532],{"id":4531},"whats-next","What's next",[338,4534,4535,4536,4539,4540,4543,4544,4547],{},"Notebook ",[342,4537,4538],{},"5"," introduces ",[342,4541,4542],{},"state evolution"," and the\n",[342,4545,4546],{},"lifecycle policy"," — the parts of unitrack that keep\ntracklets alive across frames, even when they aren't matched\non every frame.",[4549,4550,4551],"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 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 .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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--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 .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}",{"title":420,"searchDepth":459,"depth":459,"links":4553},[4554,4555,4556,4557,4558,4559,4561,4562,4563,4564,4565],{"id":781,"depth":438,"text":782},{"id":1880,"depth":438,"text":1881},{"id":3175,"depth":438,"text":3176},{"id":3280,"depth":438,"text":3281},{"id":3453,"depth":438,"text":3454},{"id":3631,"depth":438,"text":4560},"SequentialGate — folding gates",{"id":3799,"depth":438,"text":3800},{"id":3974,"depth":438,"text":3975},{"id":4154,"depth":438,"text":4155},{"id":4238,"depth":438,"text":4239},{"id":4531,"depth":438,"text":4532},"unitrack 2.0 builds trackers from a typed tree of stages.\nThere are three leaf signatures:","md",{"notebook":462},{"icon":63},{"title":107,"description":4566},"FCDl9Xwfxml1aInYoiyefoc_QrkU8DT68Fa3CcjSLew",{},1785139889609]