diff --git a/README.md b/README.md index 1b4ab33c..387cf82f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ A GraphQL API that provides nearby Japanese train stations and bus stops, runnin - For automation agent and contributor workflows, see [AGENTS.md](AGENTS.md). - For contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md). - For system architecture and design decisions, see [docs/architecture.md](docs/architecture.md). +- For the Sobu Rapid passing-station ETA calibration and benchmark comparison, see [docs/sobu-rapid-pass-eta.md](docs/sobu-rapid-pass-eta.md). - For the design of the transfer route search (`connectedRoutes`, RAPTOR), see [docs/route-search.md](docs/route-search.md). - For the source-backed operating constraints used by timetable-free search, see [docs/route-service-audit.md](docs/route-service-audit.md). - For the Keio stopping-pattern audit and regression checks, see [docs/keio-stopping-pattern-audit.md](docs/keio-stopping-pattern-audit.md). diff --git a/data/5!station_station_types.csv b/data/5!station_station_types.csv index e7a998cd..30b59617 100644 --- a/data/5!station_station_types.csv +++ b/data/5!station_station_types.csv @@ -988,11 +988,22 @@ DEFAULT,1131401,154,40,0,東京 DEFAULT,1131402,154,40,0,新日本橋 DEFAULT,1131403,154,40,0,馬喰町 DEFAULT,1131404,154,40,0,錦糸町 +DEFAULT,1131323,154,40,1,亀戸 +DEFAULT,1131324,154,40,1,平井 DEFAULT,1131405,154,40,0,新小岩 +DEFAULT,1131326,154,40,1,小岩 DEFAULT,1131406,154,40,0,市川 +DEFAULT,1131328,154,40,1,本八幡 +DEFAULT,1131329,154,40,1,下総中山 +DEFAULT,1131330,154,40,1,西船橋 DEFAULT,1131407,154,40,0,船橋 +DEFAULT,1131332,154,40,1,東船橋 DEFAULT,1131408,154,40,0,津田沼 +DEFAULT,1131334,154,40,1,幕張本郷 +DEFAULT,1131335,154,40,1,幕張 +DEFAULT,1131336,154,40,1,新検見川 DEFAULT,1131409,154,40,0,稲毛 +DEFAULT,1131338,154,40,1,西千葉 DEFAULT,1131410,154,40,0,千葉 DEFAULT,1131411,102,40,1,東千葉 DEFAULT,1131412,102,40,0,都賀 @@ -1019,11 +1030,22 @@ DEFAULT,1131401,104,41,0,東京 DEFAULT,1131402,104,41,0,新日本橋 DEFAULT,1131403,104,41,0,馬喰町 DEFAULT,1131404,104,41,0,錦糸町 +DEFAULT,1131323,104,41,1,亀戸 +DEFAULT,1131324,104,41,1,平井 DEFAULT,1131405,104,41,1,新小岩 +DEFAULT,1131326,104,41,1,小岩 DEFAULT,1131406,104,41,1,市川 +DEFAULT,1131328,104,41,1,本八幡 +DEFAULT,1131329,104,41,1,下総中山 +DEFAULT,1131330,104,41,1,西船橋 DEFAULT,1131407,104,41,0,船橋 +DEFAULT,1131332,104,41,1,東船橋 DEFAULT,1131408,104,41,1,津田沼 +DEFAULT,1131334,104,41,1,幕張本郷 +DEFAULT,1131335,104,41,1,幕張 +DEFAULT,1131336,104,41,1,新検見川 DEFAULT,1131409,104,41,1,稲毛 +DEFAULT,1131338,104,41,1,西千葉 DEFAULT,1131410,104,41,0,千葉 DEFAULT,1131411,104,41,1,東千葉 DEFAULT,1131412,104,41,0,都賀 @@ -8803,11 +8825,22 @@ DEFAULT,1131401,102,222,0,東京 DEFAULT,1131402,102,222,0,新日本橋 DEFAULT,1131403,102,222,0,馬喰町 DEFAULT,1131404,102,222,0,錦糸町 +DEFAULT,1131323,102,222,1,亀戸 +DEFAULT,1131324,102,222,1,平井 DEFAULT,1131405,102,222,0,新小岩 +DEFAULT,1131326,102,222,1,小岩 DEFAULT,1131406,102,222,0,市川 +DEFAULT,1131328,102,222,1,本八幡 +DEFAULT,1131329,102,222,1,下総中山 +DEFAULT,1131330,102,222,1,西船橋 DEFAULT,1131407,102,222,0,船橋 +DEFAULT,1131332,102,222,1,東船橋 DEFAULT,1131408,102,222,0,津田沼 +DEFAULT,1131334,102,222,1,幕張本郷 +DEFAULT,1131335,102,222,1,幕張 +DEFAULT,1131336,102,222,1,新検見川 DEFAULT,1131409,102,222,0,稲毛 +DEFAULT,1131338,102,222,1,西千葉 DEFAULT,1131410,102,222,0,千葉 DEFAULT,1131411,102,222,1,東千葉 DEFAULT,1131412,102,222,0,都賀 @@ -10227,11 +10260,22 @@ DEFAULT,1131401,102,260,0,東京 DEFAULT,1131402,102,260,0,新日本橋 DEFAULT,1131403,102,260,0,馬喰町 DEFAULT,1131404,102,260,0,錦糸町 +DEFAULT,1131323,102,260,1,亀戸 +DEFAULT,1131324,102,260,1,平井 DEFAULT,1131405,102,260,0,新小岩 +DEFAULT,1131326,102,260,1,小岩 DEFAULT,1131406,102,260,0,市川 +DEFAULT,1131328,102,260,1,本八幡 +DEFAULT,1131329,102,260,1,下総中山 +DEFAULT,1131330,102,260,1,西船橋 DEFAULT,1131407,102,260,0,船橋 +DEFAULT,1131332,102,260,1,東船橋 DEFAULT,1131408,102,260,0,津田沼 +DEFAULT,1131334,102,260,1,幕張本郷 +DEFAULT,1131335,102,260,1,幕張 +DEFAULT,1131336,102,260,1,新検見川 DEFAULT,1131409,102,260,0,稲毛 +DEFAULT,1131338,102,260,1,西千葉 DEFAULT,1131410,102,260,0,千葉 DEFAULT,1132401,102,260,0,千葉 DEFAULT,1132402,102,260,0,本千葉 @@ -13882,11 +13926,22 @@ DEFAULT,9940116,306,349,0,富士山 DEFAULT,9940117,306,349,0,富士急ハイランド DEFAULT,9940118,306,349,0,河口湖 DEFAULT,1131410,226,350,0,千葉 +DEFAULT,1131338,226,350,1,西千葉 DEFAULT,1131409,226,350,1,稲毛 +DEFAULT,1131336,226,350,1,新検見川 +DEFAULT,1131335,226,350,1,幕張 +DEFAULT,1131334,226,350,1,幕張本郷 DEFAULT,1131408,226,350,1,津田沼 +DEFAULT,1131332,226,350,1,東船橋 DEFAULT,1131407,226,350,0,船橋 +DEFAULT,1131330,226,350,1,西船橋 +DEFAULT,1131329,226,350,1,下総中山 +DEFAULT,1131328,226,350,1,本八幡 DEFAULT,1131406,226,350,1,市川 +DEFAULT,1131326,226,350,1,小岩 DEFAULT,1131405,226,350,1,新小岩 +DEFAULT,1131324,226,350,1,平井 +DEFAULT,1131323,226,350,1,亀戸 DEFAULT,1131404,226,350,0,錦糸町 DEFAULT,1131322,226,350,0,錦糸町 DEFAULT,1131321,226,350,1,両国 @@ -14436,11 +14491,22 @@ DEFAULT,1131401,230,364,0,東京 DEFAULT,1131402,230,364,1,新日本橋 DEFAULT,1131403,230,364,1,馬喰町 DEFAULT,1131404,230,364,1,錦糸町 +DEFAULT,1131323,230,364,1,亀戸 +DEFAULT,1131324,230,364,1,平井 DEFAULT,1131405,230,364,1,新小岩 +DEFAULT,1131326,230,364,1,小岩 DEFAULT,1131406,230,364,1,市川 +DEFAULT,1131328,230,364,1,本八幡 +DEFAULT,1131329,230,364,1,下総中山 +DEFAULT,1131330,230,364,1,西船橋 DEFAULT,1131407,230,364,1,船橋 +DEFAULT,1131332,230,364,1,東船橋 DEFAULT,1131408,230,364,1,津田沼 +DEFAULT,1131334,230,364,1,幕張本郷 +DEFAULT,1131335,230,364,1,幕張 +DEFAULT,1131336,230,364,1,新検見川 DEFAULT,1131409,230,364,1,稲毛 +DEFAULT,1131338,230,364,1,西千葉 DEFAULT,1131410,230,364,2,千葉 DEFAULT,1131411,230,364,1,東千葉 DEFAULT,1131412,230,364,1,都賀 @@ -21414,11 +21480,22 @@ DEFAULT,1131401,102,578,0,東京 DEFAULT,1131402,102,578,0,新日本橋 DEFAULT,1131403,102,578,0,馬喰町 DEFAULT,1131404,102,578,0,錦糸町 +DEFAULT,1131323,102,578,1,亀戸 +DEFAULT,1131324,102,578,1,平井 DEFAULT,1131405,102,578,0,新小岩 +DEFAULT,1131326,102,578,1,小岩 DEFAULT,1131406,102,578,0,市川 +DEFAULT,1131328,102,578,1,本八幡 +DEFAULT,1131329,102,578,1,下総中山 +DEFAULT,1131330,102,578,1,西船橋 DEFAULT,1131407,102,578,0,船橋 +DEFAULT,1131332,102,578,1,東船橋 DEFAULT,1131408,102,578,0,津田沼 +DEFAULT,1131334,102,578,1,幕張本郷 +DEFAULT,1131335,102,578,1,幕張 +DEFAULT,1131336,102,578,1,新検見川 DEFAULT,1131409,102,578,0,稲毛 +DEFAULT,1131338,102,578,1,西千葉 DEFAULT,1131410,102,578,0,千葉 DEFAULT,1132501,102,578,0,千葉 DEFAULT,1132502,102,578,0,本千葉 @@ -32732,11 +32809,22 @@ DEFAULT,1131320,276,885,1,浅草橋 DEFAULT,1131321,276,885,1,両国 DEFAULT,1131322,276,885,0,錦糸町 DEFAULT,1131404,276,885,0,錦糸町 +DEFAULT,1131323,276,885,1,亀戸 +DEFAULT,1131324,276,885,1,平井 DEFAULT,1131405,276,885,1,新小岩 +DEFAULT,1131326,276,885,1,小岩 DEFAULT,1131406,276,885,1,市川 +DEFAULT,1131328,276,885,1,本八幡 +DEFAULT,1131329,276,885,1,下総中山 +DEFAULT,1131330,276,885,1,西船橋 DEFAULT,1131407,276,885,0,船橋 +DEFAULT,1131332,276,885,1,東船橋 DEFAULT,1131408,276,885,1,津田沼 +DEFAULT,1131334,276,885,1,幕張本郷 +DEFAULT,1131335,276,885,1,幕張 +DEFAULT,1131336,276,885,1,新検見川 DEFAULT,1131409,276,885,1,稲毛 +DEFAULT,1131338,276,885,1,西千葉 DEFAULT,1131410,276,885,0,千葉 DEFAULT,1132401,276,885,0,千葉 DEFAULT,1132402,276,885,1,本千葉 @@ -32820,11 +32908,22 @@ DEFAULT,1131320,278,887,1,浅草橋 DEFAULT,1131321,278,887,1,両国 DEFAULT,1131322,278,887,0,錦糸町 DEFAULT,1131404,278,887,0,錦糸町 +DEFAULT,1131323,278,887,1,亀戸 +DEFAULT,1131324,278,887,1,平井 DEFAULT,1131405,278,887,1,新小岩 +DEFAULT,1131326,278,887,1,小岩 DEFAULT,1131406,278,887,1,市川 +DEFAULT,1131328,278,887,1,本八幡 +DEFAULT,1131329,278,887,1,下総中山 +DEFAULT,1131330,278,887,1,西船橋 DEFAULT,1131407,278,887,0,船橋 +DEFAULT,1131332,278,887,1,東船橋 DEFAULT,1131408,278,887,1,津田沼 +DEFAULT,1131334,278,887,1,幕張本郷 +DEFAULT,1131335,278,887,1,幕張 +DEFAULT,1131336,278,887,1,新検見川 DEFAULT,1131409,278,887,1,稲毛 +DEFAULT,1131338,278,887,1,西千葉 DEFAULT,1131410,278,887,0,千葉 DEFAULT,1132501,278,887,0,千葉 DEFAULT,1132502,278,887,1,本千葉 @@ -32854,11 +32953,22 @@ DEFAULT,1131401,279,888,0,東京 DEFAULT,1131402,279,888,1,新日本橋 DEFAULT,1131403,279,888,1,馬喰町 DEFAULT,1131404,279,888,0,錦糸町 +DEFAULT,1131323,279,888,1,亀戸 +DEFAULT,1131324,279,888,1,平井 DEFAULT,1131405,279,888,1,新小岩 +DEFAULT,1131326,279,888,1,小岩 DEFAULT,1131406,279,888,1,市川 +DEFAULT,1131328,279,888,1,本八幡 +DEFAULT,1131329,279,888,1,下総中山 +DEFAULT,1131330,279,888,1,西船橋 DEFAULT,1131407,279,888,0,船橋 +DEFAULT,1131332,279,888,1,東船橋 DEFAULT,1131408,279,888,1,津田沼 +DEFAULT,1131334,279,888,1,幕張本郷 +DEFAULT,1131335,279,888,1,幕張 +DEFAULT,1131336,279,888,1,新検見川 DEFAULT,1131409,279,888,1,稲毛 +DEFAULT,1131338,279,888,1,西千葉 DEFAULT,1131410,279,888,0,千葉 DEFAULT,1131411,279,888,1,東千葉 DEFAULT,1131412,279,888,1,都賀 @@ -32885,11 +32995,22 @@ DEFAULT,1131401,280,889,0,東京 DEFAULT,1131402,280,889,1,新日本橋 DEFAULT,1131403,280,889,1,馬喰町 DEFAULT,1131404,280,889,0,錦糸町 +DEFAULT,1131323,280,889,1,亀戸 +DEFAULT,1131324,280,889,1,平井 DEFAULT,1131405,280,889,1,新小岩 +DEFAULT,1131326,280,889,1,小岩 DEFAULT,1131406,280,889,1,市川 +DEFAULT,1131328,280,889,1,本八幡 +DEFAULT,1131329,280,889,1,下総中山 +DEFAULT,1131330,280,889,1,西船橋 DEFAULT,1131407,280,889,0,船橋 +DEFAULT,1131332,280,889,1,東船橋 DEFAULT,1131408,280,889,1,津田沼 +DEFAULT,1131334,280,889,1,幕張本郷 +DEFAULT,1131335,280,889,1,幕張 +DEFAULT,1131336,280,889,1,新検見川 DEFAULT,1131409,280,889,1,稲毛 +DEFAULT,1131338,280,889,1,西千葉 DEFAULT,1131410,280,889,0,千葉 DEFAULT,1131411,280,889,1,東千葉 DEFAULT,1131412,280,889,1,都賀 @@ -32927,11 +33048,22 @@ DEFAULT,1131401,102,891,0,東京 DEFAULT,1131402,102,891,0,新日本橋 DEFAULT,1131403,102,891,0,馬喰町 DEFAULT,1131404,102,891,0,錦糸町 +DEFAULT,1131323,102,891,1,亀戸 +DEFAULT,1131324,102,891,1,平井 DEFAULT,1131405,102,891,0,新小岩 +DEFAULT,1131326,102,891,1,小岩 DEFAULT,1131406,102,891,0,市川 +DEFAULT,1131328,102,891,1,本八幡 +DEFAULT,1131329,102,891,1,下総中山 +DEFAULT,1131330,102,891,1,西船橋 DEFAULT,1131407,102,891,0,船橋 +DEFAULT,1131332,102,891,1,東船橋 DEFAULT,1131408,102,891,0,津田沼 +DEFAULT,1131334,102,891,1,幕張本郷 +DEFAULT,1131335,102,891,1,幕張 +DEFAULT,1131336,102,891,1,新検見川 DEFAULT,1131409,102,891,0,稲毛 +DEFAULT,1131338,102,891,1,西千葉 DEFAULT,1131410,102,891,0,千葉 DEFAULT,1131411,102,891,1,東千葉 DEFAULT,1131412,102,891,0,都賀 @@ -33326,11 +33458,22 @@ DEFAULT,1141006,100,903,0,燕三条 DEFAULT,1141007,100,903,0,北三条 DEFAULT,1141008,100,903,0,東三条 DEFAULT,1131410,210,904,0,千葉 +DEFAULT,1131338,210,904,1,西千葉 DEFAULT,1131409,210,904,1,稲毛 +DEFAULT,1131336,210,904,1,新検見川 +DEFAULT,1131335,210,904,1,幕張 +DEFAULT,1131334,210,904,1,幕張本郷 DEFAULT,1131408,210,904,1,津田沼 +DEFAULT,1131332,210,904,1,東船橋 DEFAULT,1131407,210,904,0,船橋 +DEFAULT,1131330,210,904,1,西船橋 +DEFAULT,1131329,210,904,1,下総中山 +DEFAULT,1131328,210,904,1,本八幡 DEFAULT,1131406,210,904,1,市川 +DEFAULT,1131326,210,904,1,小岩 DEFAULT,1131405,210,904,1,新小岩 +DEFAULT,1131324,210,904,1,平井 +DEFAULT,1131323,210,904,1,亀戸 DEFAULT,1131404,210,904,0,錦糸町 DEFAULT,1131322,210,904,0,錦糸町 DEFAULT,1131321,210,904,1,両国 @@ -39700,11 +39843,22 @@ DEFAULT,1131401,230,1095,0,東京 DEFAULT,1131402,230,1095,1,新日本橋 DEFAULT,1131403,230,1095,1,馬喰町 DEFAULT,1131404,230,1095,1,錦糸町 +DEFAULT,1131323,230,1095,1,亀戸 +DEFAULT,1131324,230,1095,1,平井 DEFAULT,1131405,230,1095,1,新小岩 +DEFAULT,1131326,230,1095,1,小岩 DEFAULT,1131406,230,1095,1,市川 +DEFAULT,1131328,230,1095,1,本八幡 +DEFAULT,1131329,230,1095,1,下総中山 +DEFAULT,1131330,230,1095,1,西船橋 DEFAULT,1131407,230,1095,1,船橋 +DEFAULT,1131332,230,1095,1,東船橋 DEFAULT,1131408,230,1095,1,津田沼 +DEFAULT,1131334,230,1095,1,幕張本郷 +DEFAULT,1131335,230,1095,1,幕張 +DEFAULT,1131336,230,1095,1,新検見川 DEFAULT,1131409,230,1095,1,稲毛 +DEFAULT,1131338,230,1095,1,西千葉 DEFAULT,1131410,230,1095,2,千葉 DEFAULT,1131411,230,1095,1,東千葉 DEFAULT,1131412,230,1095,1,都賀 diff --git a/docs/architecture.md b/docs/architecture.md index 5db3980d..5d5ef531 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -525,6 +525,8 @@ input RouteLegInput { lineGroupId: Int! fromStationId: Int! toStationId: Int! 出します。推定の規則や較正を変える PR には、変更前と変更後のレポートを載せます。 基準の決め方と記録の更新方法は `travel_times/README.md` にあります。 +総武快速線の通過駅補完に伴う較正と全ケースの比較は +[総武快速線の通過駅補完とETA較正](sobu-rapid-pass-eta.md) を参照してください。 ### 行き先の検索 (`stationsByName`) diff --git a/docs/sobu-rapid-pass-eta.md b/docs/sobu-rapid-pass-eta.md new file mode 100644 index 00000000..a475258d --- /dev/null +++ b/docs/sobu-rapid-pass-eta.md @@ -0,0 +1,43 @@ +# 総武快速線の通過駅補完とETA較正 + +錦糸町〜千葉の通過駅は中央・総武線の既存駅ID(line_cd=11313)を使用する。 +停車駅(line_cd=11314)の実効速度100km/hに対し、追加した通過駅は既定の80km/hとなり、 +生成データのETA回帰テストで錦糸町→津田沼が22.3分、新小岩→津田沼が17.1分へ延びた。 + +11313 × Rapid の実効速度を105km/hに較正する。N02の分割距離と通過駅ペナルティを含め、 +既存のメンテナ確認値(`travel_times/cases.csv`:典型20分・16分)に合わせた値である。 +実際の列車速度を意味する値ではない。既存の11314 × Defaultの100km/hは維持する。 +中央・総武線内を各駅停車する東西線直通快速は、通過駅がない路線ではDefaultへ補正する +既存処理により対象外。ほかの種別とLegacyの速度表は変更しない。 + +## 生成データによる前後比較 + +`DISABLE_BUS_FEATURE=true make data` でN02距離を生成し、 +`cargo test -p stationapi-worker travel_times -- --nocapture` で比較した。 +変更前は通過駅追加済み・速度補正前、変更後は速度補正後。 +既存ベースラインの許容差を変更せずに全21ケースが成功した後、ベースラインを再生成した。 +バスを含む配信環境の検証ではない。 + +| ケース | 実際(典型) | 補正前 | 補正後 | 典型からのずれ(前→後) | +| --- | --- | --- | --- | --- | +| 総武快速線 快速 錦糸町→津田沼 | 19〜25分 (20分) | 22.3分 | 20.0分 | 11.4% → 0.1% | +| 総武快速線 快速 新小岩→津田沼 | 15〜20分 (16分) | 17.1分 | 15.4分 | 6.9% → 3.9% | +| 京成 スカイライナー 日暮里→空港第2ビル | 40〜48分 (41分) | 41.1分 | 41.1分 | 0.2% → 0.2% | +| 京急本線 快特 品川→横浜 | 17〜22分 (17分) | 17.6分 | 17.6分 | 3.6% → 3.6% | +| 小田急小田原線 快速急行 新宿→町田 | 30〜31分 (30.5分) | 29.9分 | 29.9分 | 2.0% → 2.0% | +| 東急東横線 特急 渋谷→横浜 | 27〜28分 (27.5分) | 26.9分 | 26.9分 | 2.1% → 2.1% | +| 京王井の頭線 急行 渋谷→吉祥寺 | 17〜22分 (17分) | 16.8分 | 16.8分 | 1.0% → 1.0% | +| 京王線 特急 新宿→京王八王子 | 45〜45分 (45分) | 41.4分 | 41.4分 | 8.0% → 8.0% | +| 阪急神戸本線 特急 大阪梅田→神戸三宮 | 27〜28分 (27.5分) | 26.9分 | 26.9分 | 2.3% → 2.3% | +| 西武池袋線 準急 池袋→所沢 | 30〜38分 (38分) | 29.3分 | 29.3分 | 23.0% → 23.0% | +| 西武池袋線 急行 池袋→所沢 | 21〜25分 (24分) | 22.3分 | 22.3分 | 7.2% → 7.2% | +| 都営大江戸線 落合南長崎→光が丘 | 11〜12分 (11分) | 11.9分 | 11.9分 | 7.8% → 7.8% | +| 都営大江戸線 新宿→光が丘 | 24〜26分 (24分) | 25.0分 | 25.0分 | 4.1% → 4.1% | +| 都営大江戸線 光が丘→都庁前 | 21〜21分 (21分) | 22.7分 | 22.7分 | 8.2% → 8.2% | +| 都営大江戸線 清澄白河→赤羽橋 | 16〜17分 (16分) | 16.3分 | 16.3分 | 1.6% → 1.6% | +| 都営大江戸線 光が丘→都庁前 (環状部経由) | 84〜86分 (84分) | 84.8分 | 84.8分 | 1.0% → 1.0% | +| 東京メトロ銀座線 渋谷→新橋 | 15〜15分 (15分) | 13.3分 | 13.3分 | 11.4% → 11.4% | +| つくばエクスプレス 普通 秋葉原→つくば | 63〜66分 (66分) | 61.6分 | 61.6分 | 6.6% → 6.6% | +| 東京メトロ半蔵門線 押上→神保町 | 17〜19分 (17分) | 16.6分 | 16.6分 | 2.2% → 2.2% | +| りんかい線 新木場→大崎 | 19〜20分 (19分) | 19.1分 | 19.1分 | 0.6% → 0.6% | +| 多摩都市モノレール 多摩センター→上北台 | 37〜39分 (37分) | 37.6分 | 37.6分 | 1.7% → 1.7% | diff --git a/stationapi/src/domain/arrival_estimation.rs b/stationapi/src/domain/arrival_estimation.rs index 0fb21250..d40df432 100644 --- a/stationapi/src/domain/arrival_estimation.rs +++ b/stationapi/src/domain/arrival_estimation.rs @@ -1023,6 +1023,53 @@ mod tests { ); } + #[test] + fn sobu_rapid_borrowed_pass_station_uses_recalibrated_rapid_speed() { + let mut stations = three_collinear_stations(); + for s in &mut stations { + s.line_cd = 11314; + s.kind = Some(TrainTypeKind::Rapid as i32); + } + stations[1].line_cd = 11313; + stations[1].pass = Some(1); + let refs: Vec<&Station> = stations.iter().collect(); + let params = EstimationParams { + speed_calibration: SpeedCalibration::Recalibrated, + ..EstimationParams::default() + }; + let estimated = estimate_arrival_minutes(&refs, ¶ms); + approx(estimated[1].max_speed_kmh, 105.0); + approx(estimated[2].max_speed_kmh, 100.0); + assert!(!estimated[1].stops_here); + approx( + estimated[1].cumulative_minutes, + estimated[1].departure_cumulative_minutes, + ); + + // Legacy の凍結済み較正には影響させない。 + let legacy = estimate_arrival_minutes(&refs, &EstimationParams::default()); + approx(legacy[1].max_speed_kmh, 80.0); + } + + #[test] + fn sobu_all_stop_through_rapid_keeps_local_speed() { + let mut stations = three_collinear_stations(); + for s in &mut stations { + s.line_cd = 11313; + s.kind = Some(TrainTypeKind::Rapid as i32); + } + let refs: Vec<&Station> = stations.iter().collect(); + let params = EstimationParams { + speed_calibration: SpeedCalibration::Recalibrated, + ..EstimationParams::default() + }; + let estimated = estimate_arrival_minutes(&refs, ¶ms); + for stop in estimated { + approx(stop.max_speed_kmh, 80.0); + assert!(stop.stops_here); + } + } + #[test] fn departure_minutes_equal_pass_time_at_passed_stations() { let p = EstimationParams::default(); diff --git a/stationapi/src/domain/speed_table.rs b/stationapi/src/domain/speed_table.rs index 30b57858..c77fabdc 100644 --- a/stationapi/src/domain/speed_table.rs +++ b/stationapi/src/domain/speed_table.rs @@ -36,11 +36,16 @@ use crate::model::TrainTypeKind; /// `connectedRoutes`・`trainRoute` の `Legacy` は、求め直す前の値を /// `legacy_speed_table` で使い続ける。 const LINE_SPEED_OVERRIDES: &[(i32, TrainTypeKind, f64)] = &[ - // 総武快速線: 最高 130km/h の別線を走る。StationAPI の路線には快速の停車駅しか - // 無く、通過駅が無いので推定は各停 (Default) として扱う。一般則の 80km/h では + // 総武快速線: 最高 130km/h の別線を走る。11314 の駅IDは快速の停車駅なので + // この路線IDでは推定は各停 (Default) として扱う。一般則の 80km/h では // 遅すぎる。千葉以東の総武本線の普通列車にもかかるが、その区間の基準は無い。 // travel_times: 錦糸町→津田沼・新小岩→津田沼 快速。 (11314, TrainTypeKind::Default, 100.0), + // 総武快速線の通過駅は中央・総武線の駅IDを共有する。快速の通過区間にも + // 快速別線の実効速度を適用する。通過駅のペナルティと N02 の分割距離を含め、 + // travel_times の錦糸町→津田沼 (典型20分) に較正。中央・総武線内で各停となる + // 東西線直通は arrival_estimation が Default に補正するため、この値の対象外。 + (11313, TrainTypeKind::Rapid, 105.0), // 成田スカイアクセス線: スカイライナーは 160km/h 運転だが、実効値で較正。 // アクセス特急も同じ LimitedExpress で、京成高砂→成田空港は 39.4 分 // (実際 38〜52 分。ばらつきが大きく典型値が無いので travel_times には無い)。 diff --git a/travel_times/baseline.csv b/travel_times/baseline.csv index 00d69d02..52468790 100644 --- a/travel_times/baseline.csv +++ b/travel_times/baseline.csv @@ -1,6 +1,6 @@ label,estimated_minutes -総武快速線 快速 錦糸町→津田沼,19.9710 -総武快速線 快速 新小岩→津田沼,15.3533 +総武快速線 快速 錦糸町→津田沼,20.0277 +総武快速線 快速 新小岩→津田沼,15.3750 京成 スカイライナー 日暮里→空港第2ビル,41.0671 京急本線 快特 品川→横浜,17.6098 小田急小田原線 快速急行 新宿→町田,29.8999