From ef3cd64475755fd3007cfaf16b141f50d7c78435 Mon Sep 17 00:00:00 2001 From: BruceChen Date: Tue, 14 Apr 2026 11:06:19 +0000 Subject: [PATCH] feat: generate theory-aligned pathing artifacts --- tools/pathing_data/canonical-live-cases.json | 327 +++ tools/pathing_data/theory-matrix.csv | 121 ++ tools/pathing_data/theory-matrix.json | 1922 ++++++++++++++++++ tools/pathing_data/theory-matrix.md | 124 ++ tools/pathing_theory/canonical.py | 90 + tools/pathing_theory/models.py | 19 + tools/pathing_theory/renderers.py | 48 + tools/pathing_theory/simulator.py | 2 +- tools/sim_jump_reach.py | 17 + tools/tests/test_pathing_canonical_cases.py | 47 + 10 files changed, 2716 insertions(+), 1 deletion(-) create mode 100644 tools/pathing_data/canonical-live-cases.json create mode 100644 tools/pathing_data/theory-matrix.csv create mode 100644 tools/pathing_data/theory-matrix.json create mode 100644 tools/pathing_data/theory-matrix.md create mode 100644 tools/pathing_theory/canonical.py create mode 100644 tools/pathing_theory/renderers.py create mode 100644 tools/tests/test_pathing_canonical_cases.py diff --git a/tools/pathing_data/canonical-live-cases.json b/tools/pathing_data/canonical-live-cases.json new file mode 100644 index 00000000..fed11b6f --- /dev/null +++ b/tools/pathing_data/canonical-live-cases.json @@ -0,0 +1,327 @@ +[ + { + "case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil4p0", + "bucket_id": "ceiling:headhitter:sprint:easy", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "easy", + "expected_result": "pass", + "world_recipe_id": "ceiling-headhitter", + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": 4.0, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 102.0, + "y": 80.0, + "z": 100.0 + } + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil1p8125", + "bucket_id": "ceiling:headhitter:sprint:boundary", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "boundary", + "expected_result": "pass", + "world_recipe_id": "ceiling-headhitter", + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": 1.8125, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 104.0, + "y": 80.0, + "z": 100.0 + } + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil2p0", + "bucket_id": "ceiling:headhitter:sprint:reject", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "reject", + "expected_result": "reject", + "world_recipe_id": "ceiling-headhitter", + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": 2.0, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 105.0, + "y": 80.0, + "z": 100.0 + } + }, + { + "case_id": "linear-ascend-sprint-mm12-gap0-dy1p0", + "bucket_id": "linear:ascend:sprint:easy", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "easy", + "expected_result": "pass", + "world_recipe_id": "linear-ascend", + "gap_blocks": 0, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 101.0, + "y": 81.0, + "z": 100.0 + } + }, + { + "case_id": "linear-ascend-sprint-mm12-gap5-dy1p0", + "bucket_id": "linear:ascend:sprint:boundary", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "boundary", + "expected_result": "pass", + "world_recipe_id": "linear-ascend", + "gap_blocks": 5, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 106.0, + "y": 81.0, + "z": 100.0 + } + }, + { + "case_id": "linear-ascend-sprint-mm12-gap6-dy1p0", + "bucket_id": "linear:ascend:sprint:reject", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "reject", + "expected_result": "reject", + "world_recipe_id": "linear-ascend", + "gap_blocks": 6, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 107.0, + "y": 81.0, + "z": 100.0 + } + }, + { + "case_id": "linear-descend-sprint-mm12-gap0-dym2p0", + "bucket_id": "linear:descend:sprint:easy", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "easy", + "expected_result": "pass", + "world_recipe_id": "linear-descend", + "gap_blocks": 0, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 101.0, + "y": 78.0, + "z": 100.0 + } + }, + { + "case_id": "linear-descend-sprint-mm12-gap7-dym1p0", + "bucket_id": "linear:descend:sprint:boundary", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "boundary", + "expected_result": "pass", + "world_recipe_id": "linear-descend", + "gap_blocks": 7, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 108.0, + "y": 79.0, + "z": 100.0 + } + }, + { + "case_id": "linear-flat-sprint-mm12-gap0-dy0p0", + "bucket_id": "linear:flat:sprint:easy", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "easy", + "expected_result": "pass", + "world_recipe_id": "linear-flat", + "gap_blocks": 0, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 101.0, + "y": 80.0, + "z": 100.0 + } + }, + { + "case_id": "linear-flat-sprint-mm12-gap6-dy0p0", + "bucket_id": "linear:flat:sprint:boundary", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "boundary", + "expected_result": "pass", + "world_recipe_id": "linear-flat", + "gap_blocks": 6, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 107.0, + "y": 80.0, + "z": 100.0 + } + }, + { + "case_id": "linear-flat-sprint-mm12-gap7-dy0p0", + "bucket_id": "linear:flat:sprint:reject", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "reject", + "expected_result": "reject", + "world_recipe_id": "linear-flat", + "gap_blocks": 7, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 108.0, + "y": 80.0, + "z": 100.0 + } + }, + { + "case_id": "neo-neo-sprint-mm12-wall1", + "bucket_id": "neo:neo:sprint:easy", + "family": "neo", + "subfamily": "neo", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "easy", + "expected_result": "pass", + "world_recipe_id": "neo-wall", + "gap_blocks": null, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": 1, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 102.0, + "y": 80.0, + "z": 101.0 + } + }, + { + "case_id": "neo-neo-sprint-mm12-wall4", + "bucket_id": "neo:neo:sprint:boundary", + "family": "neo", + "subfamily": "neo", + "movement_mode": "sprint", + "momentum_ticks": 12, + "difficulty_band": "boundary", + "expected_result": "pass", + "world_recipe_id": "neo-wall", + "gap_blocks": null, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": 4, + "start": { + "x": 100.5, + "y": 80.0, + "z": 100.5 + }, + "goal": { + "x": 102.0, + "y": 80.0, + "z": 104.0 + } + } +] diff --git a/tools/pathing_data/theory-matrix.csv b/tools/pathing_data/theory-matrix.csv new file mode 100644 index 00000000..4ccef3ce --- /dev/null +++ b/tools/pathing_data/theory-matrix.csv @@ -0,0 +1,121 @@ +case_id,family,subfamily,movement_mode,momentum_ticks,gap_blocks,delta_y,ceiling_height,wall_width,expected_reachable,landing_x,apex_y,margin,notes +linear-flat-walk-mm12-gap0-dy0p0,linear,flat,walk,12,0,0.0,,,True,6.222586344756974,1.2522033525119995,5.422586344756974, +linear-ascend-walk-mm12-gap0-dy1p0,linear,ascend,walk,12,0,1.0,,,True,5.4889195238454125,1.2522033525119995,4.688919523845413, +linear-descend-walk-mm12-gap0-dym1p0,linear,descend,walk,12,0,-1.0,,,True,6.700370323067186,1.2522033525119995,5.900370323067186, +linear-descend-walk-mm12-gap0-dym2p0,linear,descend,walk,12,0,-2.0,,,True,6.936456664658121,1.2522033525119995,6.136456664658121, +linear-flat-walk-mm12-gap1-dy0p0,linear,flat,walk,12,1,0.0,,,True,6.222586344756974,1.2522033525119995,4.422586344756974, +linear-ascend-walk-mm12-gap1-dy1p0,linear,ascend,walk,12,1,1.0,,,True,5.4889195238454125,1.2522033525119995,3.6889195238454127, +linear-descend-walk-mm12-gap1-dym1p0,linear,descend,walk,12,1,-1.0,,,True,6.700370323067186,1.2522033525119995,4.900370323067186, +linear-descend-walk-mm12-gap1-dym2p0,linear,descend,walk,12,1,-2.0,,,True,6.936456664658121,1.2522033525119995,5.136456664658121, +linear-flat-walk-mm12-gap2-dy0p0,linear,flat,walk,12,2,0.0,,,True,6.222586344756974,1.2522033525119995,3.422586344756974, +linear-ascend-walk-mm12-gap2-dy1p0,linear,ascend,walk,12,2,1.0,,,True,5.4889195238454125,1.2522033525119995,2.6889195238454127, +linear-descend-walk-mm12-gap2-dym1p0,linear,descend,walk,12,2,-1.0,,,True,6.700370323067186,1.2522033525119995,3.900370323067186, +linear-descend-walk-mm12-gap2-dym2p0,linear,descend,walk,12,2,-2.0,,,True,6.936456664658121,1.2522033525119995,4.136456664658121, +linear-flat-walk-mm12-gap3-dy0p0,linear,flat,walk,12,3,0.0,,,True,6.222586344756974,1.2522033525119995,2.422586344756974, +linear-ascend-walk-mm12-gap3-dy1p0,linear,ascend,walk,12,3,1.0,,,True,5.4889195238454125,1.2522033525119995,1.6889195238454127, +linear-descend-walk-mm12-gap3-dym1p0,linear,descend,walk,12,3,-1.0,,,True,6.700370323067186,1.2522033525119995,2.900370323067186, +linear-descend-walk-mm12-gap3-dym2p0,linear,descend,walk,12,3,-2.0,,,True,6.936456664658121,1.2522033525119995,3.1364566646581213, +linear-flat-walk-mm12-gap4-dy0p0,linear,flat,walk,12,4,0.0,,,True,6.222586344756974,1.2522033525119995,1.422586344756974, +linear-ascend-walk-mm12-gap4-dy1p0,linear,ascend,walk,12,4,1.0,,,True,5.4889195238454125,1.2522033525119995,0.6889195238454127, +linear-descend-walk-mm12-gap4-dym1p0,linear,descend,walk,12,4,-1.0,,,True,6.700370323067186,1.2522033525119995,1.900370323067186, +linear-descend-walk-mm12-gap4-dym2p0,linear,descend,walk,12,4,-2.0,,,True,6.936456664658121,1.2522033525119995,2.1364566646581213, +linear-flat-walk-mm12-gap5-dy0p0,linear,flat,walk,12,5,0.0,,,True,6.222586344756974,1.2522033525119995,0.422586344756974, +linear-ascend-walk-mm12-gap5-dy1p0,linear,ascend,walk,12,5,1.0,,,False,5.736036437366307,1.2522033525119995,-0.06396356263369274, +linear-descend-walk-mm12-gap5-dym1p0,linear,descend,walk,12,5,-1.0,,,True,6.700370323067186,1.2522033525119995,0.900370323067186, +linear-descend-walk-mm12-gap5-dym2p0,linear,descend,walk,12,5,-2.0,,,True,6.936456664658121,1.2522033525119995,1.1364566646581213, +linear-flat-walk-mm12-gap6-dy0p0,linear,flat,walk,12,6,0.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026, +linear-ascend-walk-mm12-gap6-dy1p0,linear,ascend,walk,12,6,1.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026, +linear-descend-walk-mm12-gap6-dym1p0,linear,descend,walk,12,6,-1.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026, +linear-descend-walk-mm12-gap6-dym2p0,linear,descend,walk,12,6,-2.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026, +linear-flat-walk-mm12-gap7-dy0p0,linear,flat,walk,12,7,0.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026, +linear-ascend-walk-mm12-gap7-dy1p0,linear,ascend,walk,12,7,1.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026, +linear-descend-walk-mm12-gap7-dym1p0,linear,descend,walk,12,7,-1.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026, +linear-descend-walk-mm12-gap7-dym2p0,linear,descend,walk,12,7,-2.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026, +linear-flat-sprint-mm0-gap0-dy0p0,linear,flat,sprint,0,0,0.0,,,True,3.45850527608291,1.2522033525119995,2.65850527608291, +linear-ascend-sprint-mm0-gap0-dy1p0,linear,ascend,sprint,0,0,1.0,,,True,2.67362389586132,1.2522033525119995,1.8736238958613198, +linear-descend-sprint-mm0-gap0-dym1p0,linear,descend,sprint,0,0,-1.0,,,True,3.9632109047152393,1.2522033525119995,3.163210904715239, +linear-descend-sprint-mm0-gap0-dym2p0,linear,descend,sprint,0,0,-2.0,,,True,4.210969402657874,1.2522033525119995,3.410969402657874, +linear-flat-sprint-mm0-gap1-dy0p0,linear,flat,sprint,0,1,0.0,,,True,3.45850527608291,1.2522033525119995,1.65850527608291, +linear-ascend-sprint-mm0-gap1-dy1p0,linear,ascend,sprint,0,1,1.0,,,True,2.67362389586132,1.2522033525119995,0.8736238958613198, +linear-descend-sprint-mm0-gap1-dym1p0,linear,descend,sprint,0,1,-1.0,,,True,3.9632109047152393,1.2522033525119995,2.163210904715239, +linear-descend-sprint-mm0-gap1-dym2p0,linear,descend,sprint,0,1,-2.0,,,True,4.210969402657874,1.2522033525119995,2.410969402657874, +linear-flat-sprint-mm0-gap2-dy0p0,linear,flat,sprint,0,2,0.0,,,True,3.45850527608291,1.2522033525119995,0.6585052760829102, +linear-ascend-sprint-mm0-gap2-dy1p0,linear,ascend,sprint,0,2,1.0,,,False,2.67362389586132,1.2522033525119995,-0.12637610413867995, +linear-descend-sprint-mm0-gap2-dym1p0,linear,descend,sprint,0,2,-1.0,,,True,3.9632109047152393,1.2522033525119995,1.1632109047152395, +linear-descend-sprint-mm0-gap2-dym2p0,linear,descend,sprint,0,2,-2.0,,,True,4.210969402657874,1.2522033525119995,1.4109694026578739, +linear-flat-sprint-mm0-gap3-dy0p0,linear,flat,sprint,0,3,0.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898, +linear-ascend-sprint-mm0-gap3-dy1p0,linear,ascend,sprint,0,3,1.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898, +linear-descend-sprint-mm0-gap3-dym1p0,linear,descend,sprint,0,3,-1.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898, +linear-descend-sprint-mm0-gap3-dym2p0,linear,descend,sprint,0,3,-2.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898, +linear-flat-sprint-mm0-gap4-dy0p0,linear,flat,sprint,0,4,0.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898, +linear-ascend-sprint-mm0-gap4-dy1p0,linear,ascend,sprint,0,4,1.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898, +linear-descend-sprint-mm0-gap4-dym1p0,linear,descend,sprint,0,4,-1.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898, +linear-descend-sprint-mm0-gap4-dym2p0,linear,descend,sprint,0,4,-2.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898, +linear-flat-sprint-mm0-gap5-dy0p0,linear,flat,sprint,0,5,0.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709, +linear-ascend-sprint-mm0-gap5-dy1p0,linear,ascend,sprint,0,5,1.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709, +linear-descend-sprint-mm0-gap5-dym1p0,linear,descend,sprint,0,5,-1.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709, +linear-descend-sprint-mm0-gap5-dym2p0,linear,descend,sprint,0,5,-2.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709, +linear-flat-sprint-mm0-gap6-dy0p0,linear,flat,sprint,0,6,0.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709, +linear-ascend-sprint-mm0-gap6-dy1p0,linear,ascend,sprint,0,6,1.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709, +linear-descend-sprint-mm0-gap6-dym1p0,linear,descend,sprint,0,6,-1.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709, +linear-descend-sprint-mm0-gap6-dym2p0,linear,descend,sprint,0,6,-2.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709, +linear-flat-sprint-mm0-gap7-dy0p0,linear,flat,sprint,0,7,0.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709, +linear-ascend-sprint-mm0-gap7-dy1p0,linear,ascend,sprint,0,7,1.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709, +linear-descend-sprint-mm0-gap7-dym1p0,linear,descend,sprint,0,7,-1.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709, +linear-descend-sprint-mm0-gap7-dym2p0,linear,descend,sprint,0,7,-2.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709, +linear-flat-sprint-mm12-gap0-dy0p0,linear,flat,sprint,12,0,0.0,,,True,7.728196372726743,1.2522033525119995,6.9281963727267435, +linear-ascend-sprint-mm12-gap0-dy1p0,linear,ascend,sprint,12,0,1.0,,,True,6.7601866346681065,1.2522033525119995,5.960186634668107, +linear-descend-sprint-mm12-gap0-dym1p0,linear,descend,sprint,12,0,-1.0,,,True,8.329165987228953,1.2522033525119995,7.529165987228953, +linear-descend-sprint-mm12-gap0-dym2p0,linear,descend,sprint,12,0,-2.0,,,True,8.618660719045328,1.2522033525119995,7.8186607190453286, +linear-flat-sprint-mm12-gap1-dy0p0,linear,flat,sprint,12,1,0.0,,,True,7.728196372726743,1.2522033525119995,5.9281963727267435, +linear-ascend-sprint-mm12-gap1-dy1p0,linear,ascend,sprint,12,1,1.0,,,True,6.7601866346681065,1.2522033525119995,4.960186634668107, +linear-descend-sprint-mm12-gap1-dym1p0,linear,descend,sprint,12,1,-1.0,,,True,8.329165987228953,1.2522033525119995,6.529165987228953, +linear-descend-sprint-mm12-gap1-dym2p0,linear,descend,sprint,12,1,-2.0,,,True,8.618660719045328,1.2522033525119995,6.8186607190453286, +linear-flat-sprint-mm12-gap2-dy0p0,linear,flat,sprint,12,2,0.0,,,True,7.728196372726743,1.2522033525119995,4.9281963727267435, +linear-ascend-sprint-mm12-gap2-dy1p0,linear,ascend,sprint,12,2,1.0,,,True,6.7601866346681065,1.2522033525119995,3.9601866346681067, +linear-descend-sprint-mm12-gap2-dym1p0,linear,descend,sprint,12,2,-1.0,,,True,8.329165987228953,1.2522033525119995,5.529165987228953, +linear-descend-sprint-mm12-gap2-dym2p0,linear,descend,sprint,12,2,-2.0,,,True,8.618660719045328,1.2522033525119995,5.8186607190453286, +linear-flat-sprint-mm12-gap3-dy0p0,linear,flat,sprint,12,3,0.0,,,True,7.728196372726743,1.2522033525119995,3.9281963727267435, +linear-ascend-sprint-mm12-gap3-dy1p0,linear,ascend,sprint,12,3,1.0,,,True,6.7601866346681065,1.2522033525119995,2.9601866346681067, +linear-descend-sprint-mm12-gap3-dym1p0,linear,descend,sprint,12,3,-1.0,,,True,8.329165987228953,1.2522033525119995,4.529165987228953, +linear-descend-sprint-mm12-gap3-dym2p0,linear,descend,sprint,12,3,-2.0,,,True,8.618660719045328,1.2522033525119995,4.8186607190453286, +linear-flat-sprint-mm12-gap4-dy0p0,linear,flat,sprint,12,4,0.0,,,True,7.728196372726743,1.2522033525119995,2.9281963727267435, +linear-ascend-sprint-mm12-gap4-dy1p0,linear,ascend,sprint,12,4,1.0,,,True,6.7601866346681065,1.2522033525119995,1.9601866346681067, +linear-descend-sprint-mm12-gap4-dym1p0,linear,descend,sprint,12,4,-1.0,,,True,8.329165987228953,1.2522033525119995,3.5291659872289527, +linear-descend-sprint-mm12-gap4-dym2p0,linear,descend,sprint,12,4,-2.0,,,True,8.618660719045328,1.2522033525119995,3.8186607190453286, +linear-flat-sprint-mm12-gap5-dy0p0,linear,flat,sprint,12,5,0.0,,,True,7.728196372726743,1.2522033525119995,1.9281963727267435, +linear-ascend-sprint-mm12-gap5-dy1p0,linear,ascend,sprint,12,5,1.0,,,True,6.7601866346681065,1.2522033525119995,0.9601866346681067, +linear-descend-sprint-mm12-gap5-dym1p0,linear,descend,sprint,12,5,-1.0,,,True,8.329165987228953,1.2522033525119995,2.5291659872289527, +linear-descend-sprint-mm12-gap5-dym2p0,linear,descend,sprint,12,5,-2.0,,,True,8.618660719045328,1.2522033525119995,2.8186607190453286, +linear-flat-sprint-mm12-gap6-dy0p0,linear,flat,sprint,12,6,0.0,,,True,7.728196372726743,1.2522033525119995,0.9281963727267435, +linear-ascend-sprint-mm12-gap6-dy1p0,linear,ascend,sprint,12,6,1.0,,,False,6.7601866346681065,1.2522033525119995,-0.03981336533189328, +linear-descend-sprint-mm12-gap6-dym1p0,linear,descend,sprint,12,6,-1.0,,,True,8.329165987228953,1.2522033525119995,1.5291659872289527, +linear-descend-sprint-mm12-gap6-dym2p0,linear,descend,sprint,12,6,-2.0,,,True,8.618660719045328,1.2522033525119995,1.8186607190453286, +linear-flat-sprint-mm12-gap7-dy0p0,linear,flat,sprint,12,7,0.0,,,False,7.728196372726743,1.2522033525119995,-0.07180362727325651, +linear-ascend-sprint-mm12-gap7-dy1p0,linear,ascend,sprint,12,7,1.0,,,False,7.728196372726743,1.2522033525119995,-0.07180362727325651, +linear-descend-sprint-mm12-gap7-dym1p0,linear,descend,sprint,12,7,-1.0,,,True,8.329165987228953,1.2522033525119995,0.5291659872289527, +linear-descend-sprint-mm12-gap7-dym2p0,linear,descend,sprint,12,7,-2.0,,,True,8.618660719045328,1.2522033525119995,0.8186607190453286, +neo-neo-sprint-mm12-wall1,neo,neo,sprint,12,,0.0,,1,True,7.728196372726743,1.2522033525119995,6.128196372726743, +neo-neo-sprint-mm12-wall2,neo,neo,sprint,12,,0.0,,2,True,7.728196372726743,1.2522033525119995,5.128196372726743, +neo-neo-sprint-mm12-wall3,neo,neo,sprint,12,,0.0,,3,True,7.728196372726743,1.2522033525119995,4.128196372726743, +neo-neo-sprint-mm12-wall4,neo,neo,sprint,12,,0.0,,4,True,7.728196372726743,1.2522033525119995,3.1281963727267437, +ceiling-headhitter-sprint-mm12-gap1-ceil4p0,ceiling,headhitter,sprint,12,1,0.0,4.0,,True,7.728196372726743,1.2522033525119995,5.9281963727267435, +ceiling-headhitter-sprint-mm12-gap2-ceil4p0,ceiling,headhitter,sprint,12,2,0.0,4.0,,True,7.728196372726743,1.2522033525119995,4.9281963727267435, +ceiling-headhitter-sprint-mm12-gap3-ceil4p0,ceiling,headhitter,sprint,12,3,0.0,4.0,,True,7.728196372726743,1.2522033525119995,3.9281963727267435, +ceiling-headhitter-sprint-mm12-gap4-ceil4p0,ceiling,headhitter,sprint,12,4,0.0,4.0,,True,7.728196372726743,1.2522033525119995,2.9281963727267435, +ceiling-headhitter-sprint-mm12-gap1-ceil3p0,ceiling,headhitter,sprint,12,1,0.0,3.0,,True,7.415249123142595,1.2,5.615249123142595, +ceiling-headhitter-sprint-mm12-gap2-ceil3p0,ceiling,headhitter,sprint,12,2,0.0,3.0,,True,7.415249123142595,1.2,4.615249123142595, +ceiling-headhitter-sprint-mm12-gap3-ceil3p0,ceiling,headhitter,sprint,12,3,0.0,3.0,,True,7.415249123142595,1.2,3.615249123142595, +ceiling-headhitter-sprint-mm12-gap4-ceil3p0,ceiling,headhitter,sprint,12,4,0.0,3.0,,True,7.415249123142595,1.2,2.615249123142595, +ceiling-headhitter-sprint-mm12-gap1-ceil2p5,ceiling,headhitter,sprint,12,1,0.0,2.5,,True,5.6892730007057635,0.7,3.8892730007057636, +ceiling-headhitter-sprint-mm12-gap2-ceil2p5,ceiling,headhitter,sprint,12,2,0.0,2.5,,True,5.6892730007057635,0.7,2.8892730007057636, +ceiling-headhitter-sprint-mm12-gap3-ceil2p5,ceiling,headhitter,sprint,12,3,0.0,2.5,,True,5.6892730007057635,0.7,1.8892730007057636, +ceiling-headhitter-sprint-mm12-gap4-ceil2p5,ceiling,headhitter,sprint,12,4,0.0,2.5,,True,5.6892730007057635,0.7,0.8892730007057636, +ceiling-headhitter-sprint-mm12-gap1-ceil2p0,ceiling,headhitter,sprint,12,1,0.0,2.0,,True,4.481804356129017,0.19999999999999996,2.6818043561290175, +ceiling-headhitter-sprint-mm12-gap2-ceil2p0,ceiling,headhitter,sprint,12,2,0.0,2.0,,True,4.481804356129017,0.19999999999999996,1.6818043561290175, +ceiling-headhitter-sprint-mm12-gap3-ceil2p0,ceiling,headhitter,sprint,12,3,0.0,2.0,,True,4.481804356129017,0.19999999999999996,0.6818043561290175, +ceiling-headhitter-sprint-mm12-gap4-ceil2p0,ceiling,headhitter,sprint,12,4,0.0,2.0,,False,4.481804356129017,0.19999999999999996,-0.31819564387098254, +ceiling-headhitter-sprint-mm12-gap1-ceil1p8125,ceiling,headhitter,sprint,12,1,0.0,1.8125,,True,4.041631522485753,0.012499999999999956,2.2416315224857533, +ceiling-headhitter-sprint-mm12-gap2-ceil1p8125,ceiling,headhitter,sprint,12,2,0.0,1.8125,,True,4.041631522485753,0.012499999999999956,1.2416315224857533, +ceiling-headhitter-sprint-mm12-gap3-ceil1p8125,ceiling,headhitter,sprint,12,3,0.0,1.8125,,True,4.041631522485753,0.012499999999999956,0.24163152248575326, +ceiling-headhitter-sprint-mm12-gap4-ceil1p8125,ceiling,headhitter,sprint,12,4,0.0,1.8125,,False,4.041631522485753,0.012499999999999956,-0.7583684775142467, diff --git a/tools/pathing_data/theory-matrix.json b/tools/pathing_data/theory-matrix.json new file mode 100644 index 00000000..052c4a17 --- /dev/null +++ b/tools/pathing_data/theory-matrix.json @@ -0,0 +1,1922 @@ +[ + { + "case_id": "linear-flat-walk-mm12-gap0-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": 5.422586344756974, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap0-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.4889195238454125, + "apex_y": 1.2522033525119995, + "margin": 4.688919523845413, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap0-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.700370323067186, + "apex_y": 1.2522033525119995, + "margin": 5.900370323067186, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap0-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.936456664658121, + "apex_y": 1.2522033525119995, + "margin": 6.136456664658121, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap1-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": 4.422586344756974, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap1-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.4889195238454125, + "apex_y": 1.2522033525119995, + "margin": 3.6889195238454127, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap1-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.700370323067186, + "apex_y": 1.2522033525119995, + "margin": 4.900370323067186, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap1-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.936456664658121, + "apex_y": 1.2522033525119995, + "margin": 5.136456664658121, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap2-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": 3.422586344756974, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap2-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.4889195238454125, + "apex_y": 1.2522033525119995, + "margin": 2.6889195238454127, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap2-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.700370323067186, + "apex_y": 1.2522033525119995, + "margin": 3.900370323067186, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap2-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.936456664658121, + "apex_y": 1.2522033525119995, + "margin": 4.136456664658121, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap3-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": 2.422586344756974, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap3-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.4889195238454125, + "apex_y": 1.2522033525119995, + "margin": 1.6889195238454127, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap3-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.700370323067186, + "apex_y": 1.2522033525119995, + "margin": 2.900370323067186, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap3-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.936456664658121, + "apex_y": 1.2522033525119995, + "margin": 3.1364566646581213, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap4-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": 1.422586344756974, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap4-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.4889195238454125, + "apex_y": 1.2522033525119995, + "margin": 0.6889195238454127, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap4-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.700370323067186, + "apex_y": 1.2522033525119995, + "margin": 1.900370323067186, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap4-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.936456664658121, + "apex_y": 1.2522033525119995, + "margin": 2.1364566646581213, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap5-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": 0.422586344756974, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap5-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 5.736036437366307, + "apex_y": 1.2522033525119995, + "margin": -0.06396356263369274, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap5-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.700370323067186, + "apex_y": 1.2522033525119995, + "margin": 0.900370323067186, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap5-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.936456664658121, + "apex_y": 1.2522033525119995, + "margin": 1.1364566646581213, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap6-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -0.577413655243026, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap6-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -0.577413655243026, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap6-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -0.577413655243026, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap6-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -0.577413655243026, + "notes": "" + }, + { + "case_id": "linear-flat-walk-mm12-gap7-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -1.577413655243026, + "notes": "" + }, + { + "case_id": "linear-ascend-walk-mm12-gap7-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -1.577413655243026, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap7-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -1.577413655243026, + "notes": "" + }, + { + "case_id": "linear-descend-walk-mm12-gap7-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "walk", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.222586344756974, + "apex_y": 1.2522033525119995, + "margin": -1.577413655243026, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap0-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 0, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": 2.65850527608291, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap0-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 0, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 2.67362389586132, + "apex_y": 1.2522033525119995, + "margin": 1.8736238958613198, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap0-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 0, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 3.9632109047152393, + "apex_y": 1.2522033525119995, + "margin": 3.163210904715239, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap0-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 0, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.210969402657874, + "apex_y": 1.2522033525119995, + "margin": 3.410969402657874, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap1-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": 1.65850527608291, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap1-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 1, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 2.67362389586132, + "apex_y": 1.2522033525119995, + "margin": 0.8736238958613198, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap1-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 1, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 3.9632109047152393, + "apex_y": 1.2522033525119995, + "margin": 2.163210904715239, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap1-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 1, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.210969402657874, + "apex_y": 1.2522033525119995, + "margin": 2.410969402657874, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap2-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": 0.6585052760829102, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap2-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 2, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 2.67362389586132, + "apex_y": 1.2522033525119995, + "margin": -0.12637610413867995, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap2-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 2, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 3.9632109047152393, + "apex_y": 1.2522033525119995, + "margin": 1.1632109047152395, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap2-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 2, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.210969402657874, + "apex_y": 1.2522033525119995, + "margin": 1.4109694026578739, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap3-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -0.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap3-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 3, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -0.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap3-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 3, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -0.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap3-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 3, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -0.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap4-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -1.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap4-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 4, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -1.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap4-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 4, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -1.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap4-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 4, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -1.3414947239170898, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap5-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 5, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -2.34149472391709, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap5-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 5, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -2.34149472391709, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap5-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 5, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -2.34149472391709, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap5-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 5, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -2.34149472391709, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap6-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 6, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -3.34149472391709, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap6-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 6, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -3.34149472391709, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap6-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 6, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -3.34149472391709, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap6-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 6, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -3.34149472391709, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm0-gap7-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 7, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -4.34149472391709, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm0-gap7-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 7, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -4.34149472391709, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap7-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 7, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -4.34149472391709, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm0-gap7-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 0, + "gap_blocks": 7, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 3.45850527608291, + "apex_y": 1.2522033525119995, + "margin": -4.34149472391709, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap0-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 6.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap0-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": 5.960186634668107, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap0-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 7.529165987228953, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap0-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 0, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 7.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap1-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 5.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap1-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": 4.960186634668107, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap1-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 6.529165987228953, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap1-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 6.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap2-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 4.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap2-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": 3.9601866346681067, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap2-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 5.529165987228953, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap2-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 5.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap3-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 3.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap3-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": 2.9601866346681067, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap3-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 4.529165987228953, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap3-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 4.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap4-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 2.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap4-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": 1.9601866346681067, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap4-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 3.5291659872289527, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap4-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 3.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap5-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 1.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap5-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": 0.9601866346681067, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap5-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 2.5291659872289527, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap5-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 5, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 2.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap6-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 0.9281963727267435, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap6-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 6.7601866346681065, + "apex_y": 1.2522033525119995, + "margin": -0.03981336533189328, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap6-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 1.5291659872289527, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap6-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 6, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 1.8186607190453286, + "notes": "" + }, + { + "case_id": "linear-flat-sprint-mm12-gap7-dy0p0", + "family": "linear", + "subfamily": "flat", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": -0.07180362727325651, + "notes": "" + }, + { + "case_id": "linear-ascend-sprint-mm12-gap7-dy1p0", + "family": "linear", + "subfamily": "ascend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": 1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": false, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": -0.07180362727325651, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap7-dym1p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": -1.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.329165987228953, + "apex_y": 1.2522033525119995, + "margin": 0.5291659872289527, + "notes": "" + }, + { + "case_id": "linear-descend-sprint-mm12-gap7-dym2p0", + "family": "linear", + "subfamily": "descend", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 7, + "delta_y": -2.0, + "ceiling_height": null, + "wall_width": null, + "expected_reachable": true, + "landing_x": 8.618660719045328, + "apex_y": 1.2522033525119995, + "margin": 0.8186607190453286, + "notes": "" + }, + { + "case_id": "neo-neo-sprint-mm12-wall1", + "family": "neo", + "subfamily": "neo", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": null, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": 1, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 6.128196372726743, + "notes": "" + }, + { + "case_id": "neo-neo-sprint-mm12-wall2", + "family": "neo", + "subfamily": "neo", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": null, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": 2, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 5.128196372726743, + "notes": "" + }, + { + "case_id": "neo-neo-sprint-mm12-wall3", + "family": "neo", + "subfamily": "neo", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": null, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": 3, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 4.128196372726743, + "notes": "" + }, + { + "case_id": "neo-neo-sprint-mm12-wall4", + "family": "neo", + "subfamily": "neo", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": null, + "delta_y": 0.0, + "ceiling_height": null, + "wall_width": 4, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 3.1281963727267437, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil4p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": 4.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 5.9281963727267435, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap2-ceil4p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": 4.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 4.9281963727267435, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil4p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": 4.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 3.9281963727267435, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil4p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": 4.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.728196372726743, + "apex_y": 1.2522033525119995, + "margin": 2.9281963727267435, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil3p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": 3.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.415249123142595, + "apex_y": 1.2, + "margin": 5.615249123142595, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap2-ceil3p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": 3.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.415249123142595, + "apex_y": 1.2, + "margin": 4.615249123142595, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil3p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": 3.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.415249123142595, + "apex_y": 1.2, + "margin": 3.615249123142595, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil3p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": 3.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 7.415249123142595, + "apex_y": 1.2, + "margin": 2.615249123142595, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil2p5", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": 2.5, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.6892730007057635, + "apex_y": 0.7, + "margin": 3.8892730007057636, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap2-ceil2p5", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": 2.5, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.6892730007057635, + "apex_y": 0.7, + "margin": 2.8892730007057636, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil2p5", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": 2.5, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.6892730007057635, + "apex_y": 0.7, + "margin": 1.8892730007057636, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil2p5", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": 2.5, + "wall_width": null, + "expected_reachable": true, + "landing_x": 5.6892730007057635, + "apex_y": 0.7, + "margin": 0.8892730007057636, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil2p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": 2.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.481804356129017, + "apex_y": 0.19999999999999996, + "margin": 2.6818043561290175, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap2-ceil2p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": 2.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.481804356129017, + "apex_y": 0.19999999999999996, + "margin": 1.6818043561290175, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil2p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": 2.0, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.481804356129017, + "apex_y": 0.19999999999999996, + "margin": 0.6818043561290175, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil2p0", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": 2.0, + "wall_width": null, + "expected_reachable": false, + "landing_x": 4.481804356129017, + "apex_y": 0.19999999999999996, + "margin": -0.31819564387098254, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil1p8125", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 1, + "delta_y": 0.0, + "ceiling_height": 1.8125, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.041631522485753, + "apex_y": 0.012499999999999956, + "margin": 2.2416315224857533, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap2-ceil1p8125", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 2, + "delta_y": 0.0, + "ceiling_height": 1.8125, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.041631522485753, + "apex_y": 0.012499999999999956, + "margin": 1.2416315224857533, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil1p8125", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 3, + "delta_y": 0.0, + "ceiling_height": 1.8125, + "wall_width": null, + "expected_reachable": true, + "landing_x": 4.041631522485753, + "apex_y": 0.012499999999999956, + "margin": 0.24163152248575326, + "notes": "" + }, + { + "case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil1p8125", + "family": "ceiling", + "subfamily": "headhitter", + "movement_mode": "sprint", + "momentum_ticks": 12, + "gap_blocks": 4, + "delta_y": 0.0, + "ceiling_height": 1.8125, + "wall_width": null, + "expected_reachable": false, + "landing_x": 4.041631522485753, + "apex_y": 0.012499999999999956, + "margin": -0.7583684775142467, + "notes": "" + } +] diff --git a/tools/pathing_data/theory-matrix.md b/tools/pathing_data/theory-matrix.md new file mode 100644 index 00000000..c450e733 --- /dev/null +++ b/tools/pathing_data/theory-matrix.md @@ -0,0 +1,124 @@ +# Theory Matrix + +| family | subfamily | movement_mode | case_id | expected_reachable | margin | +| --- | --- | --- | --- | --- | --- | +| linear | flat | walk | linear-flat-walk-mm12-gap0-dy0p0 | True | 5.422586344756974 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap0-dy1p0 | True | 4.688919523845413 | +| linear | descend | walk | linear-descend-walk-mm12-gap0-dym1p0 | True | 5.900370323067186 | +| linear | descend | walk | linear-descend-walk-mm12-gap0-dym2p0 | True | 6.136456664658121 | +| linear | flat | walk | linear-flat-walk-mm12-gap1-dy0p0 | True | 4.422586344756974 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap1-dy1p0 | True | 3.6889195238454127 | +| linear | descend | walk | linear-descend-walk-mm12-gap1-dym1p0 | True | 4.900370323067186 | +| linear | descend | walk | linear-descend-walk-mm12-gap1-dym2p0 | True | 5.136456664658121 | +| linear | flat | walk | linear-flat-walk-mm12-gap2-dy0p0 | True | 3.422586344756974 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap2-dy1p0 | True | 2.6889195238454127 | +| linear | descend | walk | linear-descend-walk-mm12-gap2-dym1p0 | True | 3.900370323067186 | +| linear | descend | walk | linear-descend-walk-mm12-gap2-dym2p0 | True | 4.136456664658121 | +| linear | flat | walk | linear-flat-walk-mm12-gap3-dy0p0 | True | 2.422586344756974 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap3-dy1p0 | True | 1.6889195238454127 | +| linear | descend | walk | linear-descend-walk-mm12-gap3-dym1p0 | True | 2.900370323067186 | +| linear | descend | walk | linear-descend-walk-mm12-gap3-dym2p0 | True | 3.1364566646581213 | +| linear | flat | walk | linear-flat-walk-mm12-gap4-dy0p0 | True | 1.422586344756974 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap4-dy1p0 | True | 0.6889195238454127 | +| linear | descend | walk | linear-descend-walk-mm12-gap4-dym1p0 | True | 1.900370323067186 | +| linear | descend | walk | linear-descend-walk-mm12-gap4-dym2p0 | True | 2.1364566646581213 | +| linear | flat | walk | linear-flat-walk-mm12-gap5-dy0p0 | True | 0.422586344756974 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap5-dy1p0 | False | -0.06396356263369274 | +| linear | descend | walk | linear-descend-walk-mm12-gap5-dym1p0 | True | 0.900370323067186 | +| linear | descend | walk | linear-descend-walk-mm12-gap5-dym2p0 | True | 1.1364566646581213 | +| linear | flat | walk | linear-flat-walk-mm12-gap6-dy0p0 | False | -0.577413655243026 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap6-dy1p0 | False | -0.577413655243026 | +| linear | descend | walk | linear-descend-walk-mm12-gap6-dym1p0 | False | -0.577413655243026 | +| linear | descend | walk | linear-descend-walk-mm12-gap6-dym2p0 | False | -0.577413655243026 | +| linear | flat | walk | linear-flat-walk-mm12-gap7-dy0p0 | False | -1.577413655243026 | +| linear | ascend | walk | linear-ascend-walk-mm12-gap7-dy1p0 | False | -1.577413655243026 | +| linear | descend | walk | linear-descend-walk-mm12-gap7-dym1p0 | False | -1.577413655243026 | +| linear | descend | walk | linear-descend-walk-mm12-gap7-dym2p0 | False | -1.577413655243026 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap0-dy0p0 | True | 2.65850527608291 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap0-dy1p0 | True | 1.8736238958613198 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap0-dym1p0 | True | 3.163210904715239 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap0-dym2p0 | True | 3.410969402657874 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap1-dy0p0 | True | 1.65850527608291 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap1-dy1p0 | True | 0.8736238958613198 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap1-dym1p0 | True | 2.163210904715239 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap1-dym2p0 | True | 2.410969402657874 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap2-dy0p0 | True | 0.6585052760829102 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap2-dy1p0 | False | -0.12637610413867995 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap2-dym1p0 | True | 1.1632109047152395 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap2-dym2p0 | True | 1.4109694026578739 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap3-dy0p0 | False | -0.3414947239170898 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap3-dy1p0 | False | -0.3414947239170898 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap3-dym1p0 | False | -0.3414947239170898 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap3-dym2p0 | False | -0.3414947239170898 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap4-dy0p0 | False | -1.3414947239170898 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap4-dy1p0 | False | -1.3414947239170898 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap4-dym1p0 | False | -1.3414947239170898 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap4-dym2p0 | False | -1.3414947239170898 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap5-dy0p0 | False | -2.34149472391709 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap5-dy1p0 | False | -2.34149472391709 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap5-dym1p0 | False | -2.34149472391709 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap5-dym2p0 | False | -2.34149472391709 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap6-dy0p0 | False | -3.34149472391709 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap6-dy1p0 | False | -3.34149472391709 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap6-dym1p0 | False | -3.34149472391709 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap6-dym2p0 | False | -3.34149472391709 | +| linear | flat | sprint | linear-flat-sprint-mm0-gap7-dy0p0 | False | -4.34149472391709 | +| linear | ascend | sprint | linear-ascend-sprint-mm0-gap7-dy1p0 | False | -4.34149472391709 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap7-dym1p0 | False | -4.34149472391709 | +| linear | descend | sprint | linear-descend-sprint-mm0-gap7-dym2p0 | False | -4.34149472391709 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap0-dy0p0 | True | 6.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap0-dy1p0 | True | 5.960186634668107 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap0-dym1p0 | True | 7.529165987228953 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap0-dym2p0 | True | 7.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap1-dy0p0 | True | 5.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap1-dy1p0 | True | 4.960186634668107 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap1-dym1p0 | True | 6.529165987228953 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap1-dym2p0 | True | 6.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap2-dy0p0 | True | 4.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap2-dy1p0 | True | 3.9601866346681067 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap2-dym1p0 | True | 5.529165987228953 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap2-dym2p0 | True | 5.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap3-dy0p0 | True | 3.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap3-dy1p0 | True | 2.9601866346681067 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap3-dym1p0 | True | 4.529165987228953 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap3-dym2p0 | True | 4.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap4-dy0p0 | True | 2.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap4-dy1p0 | True | 1.9601866346681067 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap4-dym1p0 | True | 3.5291659872289527 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap4-dym2p0 | True | 3.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap5-dy0p0 | True | 1.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap5-dy1p0 | True | 0.9601866346681067 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap5-dym1p0 | True | 2.5291659872289527 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap5-dym2p0 | True | 2.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap6-dy0p0 | True | 0.9281963727267435 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap6-dy1p0 | False | -0.03981336533189328 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap6-dym1p0 | True | 1.5291659872289527 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap6-dym2p0 | True | 1.8186607190453286 | +| linear | flat | sprint | linear-flat-sprint-mm12-gap7-dy0p0 | False | -0.07180362727325651 | +| linear | ascend | sprint | linear-ascend-sprint-mm12-gap7-dy1p0 | False | -0.07180362727325651 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap7-dym1p0 | True | 0.5291659872289527 | +| linear | descend | sprint | linear-descend-sprint-mm12-gap7-dym2p0 | True | 0.8186607190453286 | +| neo | neo | sprint | neo-neo-sprint-mm12-wall1 | True | 6.128196372726743 | +| neo | neo | sprint | neo-neo-sprint-mm12-wall2 | True | 5.128196372726743 | +| neo | neo | sprint | neo-neo-sprint-mm12-wall3 | True | 4.128196372726743 | +| neo | neo | sprint | neo-neo-sprint-mm12-wall4 | True | 3.1281963727267437 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil4p0 | True | 5.9281963727267435 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil4p0 | True | 4.9281963727267435 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil4p0 | True | 3.9281963727267435 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil4p0 | True | 2.9281963727267435 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil3p0 | True | 5.615249123142595 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil3p0 | True | 4.615249123142595 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil3p0 | True | 3.615249123142595 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil3p0 | True | 2.615249123142595 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil2p5 | True | 3.8892730007057636 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil2p5 | True | 2.8892730007057636 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil2p5 | True | 1.8892730007057636 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil2p5 | True | 0.8892730007057636 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil2p0 | True | 2.6818043561290175 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil2p0 | True | 1.6818043561290175 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil2p0 | True | 0.6818043561290175 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil2p0 | False | -0.31819564387098254 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil1p8125 | True | 2.2416315224857533 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil1p8125 | True | 1.2416315224857533 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil1p8125 | True | 0.24163152248575326 | +| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil1p8125 | False | -0.7583684775142467 | diff --git a/tools/pathing_theory/canonical.py b/tools/pathing_theory/canonical.py new file mode 100644 index 00000000..8e9d9fba --- /dev/null +++ b/tools/pathing_theory/canonical.py @@ -0,0 +1,90 @@ +from tools.pathing_theory.models import CanonicalLiveCase, TheoryCase + + +def _world_recipe_id(case: TheoryCase) -> str: + if case.family == "linear": + return f"linear-{case.subfamily}" + if case.family == "neo": + return "neo-wall" + return "ceiling-headhitter" + + +def _canonical_goal(case: TheoryCase) -> tuple[dict[str, float], dict[str, float]]: + start = {"x": 100.5, "y": 80.0, "z": 100.5} + if case.family == "linear": + goal_y = 80.0 + (case.delta_y or 0.0) + goal_x = 100 + (case.gap_blocks or 0) + 1 + return start, {"x": float(goal_x), "y": goal_y, "z": 100.0} + if case.family == "neo": + goal_z = 100 + (case.wall_width or 1) + return start, {"x": 102.0, "y": 80.0, "z": float(goal_z)} + goal_x = 100 + (case.gap_blocks or 0) + 1 + return start, {"x": float(goal_x), "y": 80.0, "z": 100.0} + + +def build_canonical_live_cases(cases: list[TheoryCase]) -> list[CanonicalLiveCase]: + live_candidate_cases = [ + case + for case in cases + if case.movement_mode == "sprint" and case.momentum_ticks == 12 + ] + + by_bucket: dict[tuple[str, str, str], list[TheoryCase]] = {} + for case in live_candidate_cases: + by_bucket.setdefault( + (case.family, case.subfamily, case.movement_mode), + [], + ).append(case) + + canonical_cases: list[CanonicalLiveCase] = [] + for family, subfamily, movement_mode in sorted(by_bucket): + bucket_cases = by_bucket[(family, subfamily, movement_mode)] + reachable = sorted( + [ + case + for case in bucket_cases + if case.expected_reachable and case.margin is not None + ], + key=lambda case: case.margin, + ) + unreachable = sorted( + [case for case in bucket_cases if not case.expected_reachable], + key=lambda case: float("-inf") if case.margin is None else abs(case.margin), + ) + + selected: list[tuple[str, TheoryCase]] = [] + if reachable: + easy = next( + (case for case in reversed(reachable) if (case.margin or 0.0) >= 0.50), + reachable[-1], + ) + boundary = reachable[0] + selected.append(("easy", easy)) + if boundary.case_id != easy.case_id: + selected.append(("boundary", boundary)) + if unreachable: + selected.append(("reject", unreachable[0])) + + for difficulty_band, case in selected: + start, goal = _canonical_goal(case) + canonical_cases.append( + CanonicalLiveCase( + case_id=case.case_id, + bucket_id=f"{family}:{subfamily}:{movement_mode}:{difficulty_band}", + family=family, + subfamily=subfamily, + movement_mode=movement_mode, + momentum_ticks=case.momentum_ticks, + difficulty_band=difficulty_band, + expected_result="pass" if case.expected_reachable else "reject", + world_recipe_id=_world_recipe_id(case), + gap_blocks=case.gap_blocks, + delta_y=case.delta_y, + ceiling_height=case.ceiling_height, + wall_width=case.wall_width, + start=start, + goal=goal, + ) + ) + + return canonical_cases diff --git a/tools/pathing_theory/models.py b/tools/pathing_theory/models.py index 1474b288..b9960fd2 100644 --- a/tools/pathing_theory/models.py +++ b/tools/pathing_theory/models.py @@ -17,3 +17,22 @@ class TheoryCase: apex_y: float | None margin: float | None notes: str = "" + + +@dataclass(frozen=True) +class CanonicalLiveCase: + case_id: str + bucket_id: str + family: str + subfamily: str + movement_mode: str + momentum_ticks: int + difficulty_band: str + expected_result: str + world_recipe_id: str + gap_blocks: int | None + delta_y: float | None + ceiling_height: float | None + wall_width: int | None + start: dict[str, float] + goal: dict[str, float] diff --git a/tools/pathing_theory/renderers.py b/tools/pathing_theory/renderers.py new file mode 100644 index 00000000..de3da5bf --- /dev/null +++ b/tools/pathing_theory/renderers.py @@ -0,0 +1,48 @@ +import csv +import json +from dataclasses import asdict +from pathlib import Path + +from tools.pathing_theory.models import CanonicalLiveCase, TheoryCase + + +def write_theory_artifacts( + cases: list[TheoryCase], + canonical_cases: list[CanonicalLiveCase], + output_dir: Path, +) -> None: + output_dir.mkdir(parents=True, exist_ok=True) + + json_path = output_dir / "theory-matrix.json" + csv_path = output_dir / "theory-matrix.csv" + md_path = output_dir / "theory-matrix.md" + canonical_path = output_dir / "canonical-live-cases.json" + + json_path.write_text( + json.dumps([asdict(case) for case in cases], indent=2) + "\n", + encoding="utf-8", + ) + canonical_path.write_text( + json.dumps([asdict(case) for case in canonical_cases], indent=2) + "\n", + encoding="utf-8", + ) + + with csv_path.open("w", encoding="utf-8", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=list(asdict(cases[0]).keys())) + writer.writeheader() + for case in cases: + writer.writerow(asdict(case)) + + lines = [ + "# Theory Matrix", + "", + "| family | subfamily | movement_mode | case_id | expected_reachable | margin |", + "| --- | --- | --- | --- | --- | --- |", + ] + for case in cases: + lines.append( + f"| {case.family} | {case.subfamily} | {case.movement_mode} | " + f"{case.case_id} | {case.expected_reachable} | {case.margin} |" + ) + + md_path.write_text("\n".join(lines) + "\n", encoding="utf-8") diff --git a/tools/pathing_theory/simulator.py b/tools/pathing_theory/simulator.py index e7e80fab..ff4edf33 100644 --- a/tools/pathing_theory/simulator.py +++ b/tools/pathing_theory/simulator.py @@ -14,7 +14,7 @@ def build_theory_cases() -> list[TheoryCase]: (True, "sprint", 0), (True, "sprint", 12), ]: - for gap in range(0, 7): + for gap in range(0, 8): for delta_y in [0.0, 1.0, -1.0, -2.0]: ok, landing_x, needed_x = can_reach_gap( gap_blocks=gap, diff --git a/tools/sim_jump_reach.py b/tools/sim_jump_reach.py index 99ea810e..b7a2f4ca 100644 --- a/tools/sim_jump_reach.py +++ b/tools/sim_jump_reach.py @@ -17,6 +17,13 @@ Usage: import argparse import csv +from pathlib import Path +import sys + +REPO_ROOT = Path(__file__).resolve().parent.parent +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) +from tools.pathing_theory.canonical import build_canonical_live_cases from tools.pathing_theory.primitives import ( PLAYER_WIDTH, can_reach_gap, @@ -24,6 +31,7 @@ from tools.pathing_theory.primitives import ( get_landing, simulate_jump, ) +from tools.pathing_theory.renderers import write_theory_artifacts from tools.pathing_theory.simulator import build_theory_cases @@ -202,8 +210,17 @@ def main(): help="Print per-tick trajectory data") parser.add_argument("--csv", type=str, default=None, help="Export results to CSV file") + parser.add_argument("--write-artifacts", type=str, default=None, + help="Write tracked theory artifacts to a directory") args = parser.parse_args() + if args.write_artifacts: + cases = build_theory_cases() + canonical_cases = build_canonical_live_cases(cases) + write_theory_artifacts(cases, canonical_cases, Path(args.write_artifacts)) + print(f"Wrote theory artifacts to {args.write_artifacts}") + return + results = analyze_all(verbose=args.verbose) if args.csv and results: diff --git a/tools/tests/test_pathing_canonical_cases.py b/tools/tests/test_pathing_canonical_cases.py new file mode 100644 index 00000000..3399be54 --- /dev/null +++ b/tools/tests/test_pathing_canonical_cases.py @@ -0,0 +1,47 @@ +import json +import tempfile +import unittest +from pathlib import Path + +from tools.pathing_theory.canonical import build_canonical_live_cases +from tools.pathing_theory.renderers import write_theory_artifacts +from tools.pathing_theory.simulator import build_theory_cases + + +class CanonicalPathingCaseTests(unittest.TestCase): + def test_build_canonical_live_cases_picks_easy_boundary_and_reject(self) -> None: + canonical_cases = build_canonical_live_cases(build_theory_cases()) + bucket_ids = {case.bucket_id for case in canonical_cases} + + self.assertTrue(all(case.movement_mode == "sprint" for case in canonical_cases)) + self.assertTrue(all(case.momentum_ticks == 12 for case in canonical_cases)) + self.assertIn("linear:flat:sprint:easy", bucket_ids) + self.assertIn("linear:flat:sprint:boundary", bucket_ids) + self.assertIn("linear:flat:sprint:reject", bucket_ids) + self.assertIn("neo:neo:sprint:boundary", bucket_ids) + self.assertIn("ceiling:headhitter:sprint:boundary", bucket_ids) + + def test_write_theory_artifacts_writes_json_csv_and_markdown_from_same_cases(self) -> None: + cases = build_theory_cases() + + with tempfile.TemporaryDirectory() as temp_dir: + output_dir = Path(temp_dir) + write_theory_artifacts(cases, build_canonical_live_cases(cases), output_dir) + + json_path = output_dir / "theory-matrix.json" + csv_path = output_dir / "theory-matrix.csv" + md_path = output_dir / "theory-matrix.md" + canonical_path = output_dir / "canonical-live-cases.json" + + self.assertTrue(json_path.exists()) + self.assertTrue(csv_path.exists()) + self.assertTrue(md_path.exists()) + self.assertTrue(canonical_path.exists()) + + exported_cases = json.loads(json_path.read_text()) + self.assertEqual(len(cases), len(exported_cases)) + self.assertIn("| family | subfamily | movement_mode |", md_path.read_text()) + + +if __name__ == "__main__": + unittest.main()