diff --git a/src/loader/build_footpaths.cc b/src/loader/build_footpaths.cc index 58239d8a..d6d9e5ad 100644 --- a/src/loader/build_footpaths.cc +++ b/src/loader/build_footpaths.cc @@ -421,6 +421,9 @@ void build_footpaths(timetable& tt, for (auto const& [a, b] : matches) { find_duplicates(tt, matches, a, b); } + for (auto l = location_idx_t{0U}; l != tt.n_locations(); ++l) { + find_duplicates(tt, matches, l, l); + } } connect_components(tt, max_footpath_length, adjust_footpaths); sort_footpaths(tt); diff --git a/test/loader/merge_duplicates_test.cc b/test/loader/merge_duplicates_test.cc index 98040d4e..b9493f8c 100644 --- a/test/loader/merge_duplicates_test.cc +++ b/test/loader/merge_duplicates_test.cc @@ -380,4 +380,164 @@ TEST(loader, merge_inter_src) { EXPECT_EQ(tr_range_a.first, tr_range_b.first); EXPECT_EQ(tr_range_a.second, tr_range_b.second); } +} + +namespace { + +mem_dir bus500_files() { + return mem_dir::read(R"__( +# trips.txt +"route_id","service_id","trip_id","trip_headsign","trip_short_name","direction_id","block_id","shape_id","wheelchair_accessible","bikes_allowed" +"de:vvo:27-500_3",1171,2593445670,"Bautzen Bahnhof","",1,,50186,0,0 +"de:von:27-500_3",1171,2593399038,"Bautzen Bahnhof","",1,,89025,0,0 + +# routes.txt +"route_id","agency_id","route_short_name","route_long_name","route_type","route_color","route_text_color","route_desc" +"de:vvo:27-500_3",8197,"500","",3,"","","" +"de:von:27-500_3",7874,"500","",3,"","","" + +# agency.txt +"agency_id","agency_name","agency_url","agency_timezone","agency_lang","agency_phone" +8197,"RBO-Busverkehr","https://www.delfi.de","Europe/Berlin","","" +7874,"RBO-Bus","https://www.delfi.de","Europe/Berlin","","" + +# stop_times.txt +"trip_id","arrival_time","departure_time","stop_id","stop_sequence","pickup_type","drop_off_type","stop_headsign" +2593445670,12:32:00,12:32:00,"de:14625:8000:3:3",0,0,0,"" +2593445670,12:34:00,12:34:00,"de:14625:8010:1:1",1,0,0,"" +2593445670,12:36:00,12:36:00,"de:14625:8041:1:2",2,0,0,"" +2593445670,12:38:00,12:38:00,"de:14625:8044:0:8",3,0,0,"" +2593445670,12:42:00,12:42:00,"de:14625:8063:0:2",4,0,0,"" +2593445670,12:48:00,12:48:00,"de:14625:6954:1:2",5,0,0,"" +2593445670,12:53:00,12:53:00,"de:14625:6967:1:2",6,0,0,"" +2593445670,12:56:00,12:56:00,"de:14625:6969:1:2",7,0,0,"" +2593445670,12:58:00,12:58:00,"de:14625:7721:0:2",8,0,0,"" +2593445670,13:00:00,13:00:00,"de:14625:7720:0:2",9,0,0,"" +2593445670,13:03:00,13:03:00,"de:14625:7733:0:2",10,0,0,"" +2593445670,13:05:00,13:05:00,"de:14625:7692:0:2",11,0,0,"" +2593445670,13:07:00,13:07:00,"de:14625:7689:0:2",12,0,0,"" +2593445670,13:08:00,13:08:00,"de:14625:7687:0:2",13,0,0,"" +2593445670,13:11:00,13:11:00,"de:14625:7685:0:2",14,0,0,"" +2593445670,13:13:00,13:13:00,"de:14625:7770:0:2",15,0,0,"" +2593445670,13:15:00,13:15:00,"de:14625:7661:0:2",16,0,0,"" +2593445670,13:17:00,13:17:00,"de:14625:7652:0:2",17,0,0,"" +2593445670,13:19:00,13:19:00,"de:14625:7577:0:2",18,0,0,"" +2593445670,13:20:00,13:20:00,"de:14625:7578:0:2",19,0,0,"" +2593445670,13:23:00,13:23:00,"de:14625:7507:0:2",20,0,0,"" +2593445670,13:26:00,13:26:00,"de:14625:7502:0:2",21,0,0,"" +2593445670,13:28:00,13:28:00,"de:14625:7555:0:2",22,0,0,"" +2593445670,13:30:00,13:30:00,"de:14625:7501:0:9",23,0,0,"" +2593445670,13:31:00,13:31:00,"de:14625:7500:3:1",24,0,0,"" +2593399038,12:32:00,12:32:00,"de:14625:8000:3:3",0,0,0,"" +2593399038,12:34:00,12:34:00,"de:14625:8010:1:1",1,0,0,"" +2593399038,12:36:00,12:36:00,"de:14625:8041:0:2",2,0,0,"" +2593399038,12:38:00,12:38:00,"de:14625:8044:0:8",3,0,0,"" +2593399038,12:42:00,12:42:00,"de:14625:8063:0:2_G",4,0,0,"" +2593399038,12:48:00,12:48:00,"de:14625:6954:1:2_G",5,0,0,"" +2593399038,12:53:00,12:53:00,"de:14625:6967:1:2",6,0,0,"" +2593399038,12:56:00,12:56:00,"de:14625:6969:1:2",7,0,0,"" +2593399038,12:58:00,12:58:00,"de:14625:7721:0:2_G",8,0,0,"" +2593399038,13:00:00,13:00:00,"de:14625:7720:0:2_G",9,0,0,"" +2593399038,13:03:00,13:03:00,"de:14625:7733:0:2",10,0,0,"" +2593399038,13:05:00,13:05:00,"de:14625:7692:0:2_G",11,0,0,"" +2593399038,13:07:00,13:07:00,"de:14625:7689:0:2_G",12,0,0,"" +2593399038,13:08:00,13:08:00,"de:14625:7687:0:2_G",13,0,0,"" +2593399038,13:11:00,13:11:00,"de:14625:7685:0:2_G",14,0,0,"" +2593399038,13:13:00,13:13:00,"de:14625:7770:0:2_G",15,0,0,"" +2593399038,13:15:00,13:15:00,"de:14625:7661:0:4",16,0,0,"" +2593399038,13:17:00,13:17:00,"de:14625:7652:0:2_G",17,0,0,"" +2593399038,13:19:00,13:19:00,"de:14625:7577:0:2_G",18,0,0,"" +2593399038,13:20:00,13:20:00,"de:14625:7578:0:2_G",19,0,0,"" +2593399038,13:23:00,13:23:00,"de:14625:7507:0:2_G",20,0,0,"" +2593399038,13:26:00,13:26:00,"de:14625:7502:0:2_G",21,0,0,"" +2593399038,13:28:00,13:28:00,"de:14625:7555:0:2_G",22,0,0,"" +2593399038,13:30:00,13:30:00,"de:14625:7501:0:9_G",23,0,0,"" +2593399038,13:31:00,13:31:00,"de:14625:7500:3:1",24,0,0,"" + +# stops.txt +"stop_id","stop_code","stop_name","stop_desc","stop_lat","stop_lon","location_type","parent_station","wheelchair_boarding","platform_code","level_id" +"de:14625:7500:3:1","","Bautzen Bahnhof","Bus","51.173723000000","14.429764000000",0,,0,"1","2" +"de:14625:7501:0:9","","Bautzen August-Bebel-Pl (ZOB)",,"51.177017000000","14.433968000000",0,,0,"","" +"de:14625:7507:0:2","","Bautzen Fiedlerstraße",,"51.180633000000","14.415202000000",0,,0,"","" +"de:14625:7577:0:2","","Bautzen Hoyerswerdaer Straße",,"51.196189000000","14.409480000000",0,,0,"","" +"de:14625:7652:0:2","","Kleinwelka Gasthof",,"51.212827000000","14.393418000000",0,,0,"","" +"de:14625:7661:0:2","","Cölln Goldene Höhe",,"51.223225000000","14.388289000000",0,,0,"","" +"de:14625:7770:0:2","","Schwarzadler",,"51.235145000000","14.372020000000",0,,0,"","" +"de:14625:7555:0:2","","Bautzen Taucherstraße/Friedhof",,"51.180492000000","14.437436000000",0,,0,"","" +"de:14625:7502:0:2","","Bautzen Lauengraben",,"51.179698000000","14.425955000000",0,,0,"","" +"de:14625:7685:0:2","","Luga (b Neschwitz) B 96",,"51.247967000000","14.356273000000",0,,0,"","" +"de:14625:7687:0:2","","Holscha B 96",,"51.266941000000","14.344837000000",0,,0,"","" +"de:14625:7689:0:2","","Neudorf (b Neschwitz) B96",,"51.275427000000","14.339807000000",0,,0,"","" +"de:14625:7733:0:2","","Königswartha Kirchplatz","Königswartha Kirchplatz","51.309672000000","14.328452000000",0,,0,"2","2" +"de:14625:8041:1:2","","Hoyersw. Albert-Einstein-Str.",,"51.438741000000","14.256093000000",0,,0,"","" +"de:14625:8010:1:1","","Hoyerswerda Behördenpark","Haltestelle","51.435135000000","14.246202000000",0,,0,"1","2" +"de:14625:6969:1:2","","Wartha (b Königswartha) B 96","Haltestelle","51.350254000000","14.326395000000",0,,0,"2","2" +"de:14625:7578:0:2","","Bautzen Abzw Seidau",,"51.192108000000","14.411555000000",0,,0,"","" +"de:14625:7721:0:2","","Caminau Kaolinwerk",,"51.336983000000","14.342116000000",0,,0,"","" +"de:14625:6954:1:2","","Maukendorf, B96",,"51.396848000000","14.294685000000",0,,0,"","" +"de:14625:7720:0:2","","Caminau Dorf",,"51.327851000000","14.341118000000",0,,0,"","" +"de:14625:6967:1:2","","Groß Särchen Cafe","Haltestelle","51.365288000000","14.310243000000",0,,0,"2","2" +"de:14625:8063:0:2","","Hoyerswerda Straße E",,"51.430806000000","14.285944000000",0,,0,"","" +"de:14625:8044:0:8","","Hoyerswerda Lausitzer Platz","Hoyerswerda Lausitzer Platz","51.438416000000","14.263486000000",0,,0,"8","2" +"de:14625:7692:0:2","","Zescha B 96",,"51.292294000000","14.328138000000",0,,0,"","" +"de:14625:8000:3:3","","Hoyerswerda Bahnhof","Bus","51.433460000000","14.231371000000",0,,0,"3","2" +"de:14625:7501:0:9_G","","Bautzen August-Bebel-Pl (ZOB)",,"51.177006000000","14.433986000000",0,,0,"","" +"de:14625:7507:0:2_G","","Bautzen Fiedlerstraße",,"51.180734000000","14.415077000000",0,,0,"","" +"de:14625:7577:0:2_G","","Bautzen Hoyerswerdaer Straße",,"51.196330000000","14.409372000000",0,,0,"","" +"de:14625:7652:0:2_G","","Kleinwelka Gasthof",,"51.212832000000","14.393337000000",0,,0,"","" +"de:14625:7661:0:4","","Cölln Goldene Höhe",,"51.223630000000","14.387202000000",0,,0,"","" +"de:14625:8041:0:2","","Hoyersw. Albert-Einstein-Str.",,"51.438696000000","14.256057000000",0,,0,"","" +"de:14625:6954:1:2_G","","Maukendorf, B96",,"51.396848000000","14.294685000000",0,,0,"","" +"de:14625:7685:0:2_G","","Luga (b Neschwitz) B 96",,"51.248051000000","14.356183000000",0,,0,"","" +"de:14625:7502:0:2_G","","Bautzen Lauengraben",,"51.179692000000","14.425848000000",0,,0,"","" +"de:14625:7687:0:2_G","","Holscha B 96",,"51.266963000000","14.344748000000",0,,0,"","" +"de:14625:7689:0:2_G","","Neudorf (b Neschwitz) B96",,"51.275545000000","14.339726000000",0,,0,"","" +"de:14625:7578:0:2_G","","Bautzen Abzw Seidau",,"51.192114000000","14.411474000000",0,,0,"","" +"de:14625:7692:0:2_G","","Zescha B 96",,"51.292396000000","14.328066000000",0,,0,"","" +"de:14625:7721:0:2_G","","Caminau Kaolinwerk",,"51.337006000000","14.342080000000",0,,0,"","" +"de:14625:7770:0:2_G","","Schwarzadler",,"51.235207000000","14.371913000000",0,,0,"","" +"de:14625:7720:0:2_G","","Caminau Dorf",,"51.327896000000","14.341029000000",0,,0,"","" +"de:14625:7555:0:2_G","","Bautzen Taucherstraße/Friedhof",,"51.180503000000","14.437472000000",0,,0,"","" +"de:14625:8063:0:2_G","","Hoyerswerda Straße E",,"51.430806000000","14.285944000000",0,,0,"","" + +# calendar.txt +"service_id","monday","tuesday","wednesday","thursday","friday","saturday","sunday","start_date","end_date" +1171,1,1,1,1,1,0,0,20240805,20241214 + +# calendar_dates.txt +"service_id","date","exception_type" +1171,20240805,2 +1171,20240812,2 +1171,20240806,2 +1171,20240813,2 +1171,20240807,2 +1171,20241120,2 +1171,20240808,2 +1171,20241003,2 +1171,20241031,2 +1171,20240809,2 + +)__"); +} + +} // namespace + +TEST(loader, merge_reflexive_matching) { + timetable tt; + register_special_stations(tt); + tt.date_range_ = {date::sys_days{2024_y / August / 1}, + date::sys_days{2024_y / September / 30}}; + auto const src_idx = source_idx_t{0}; + load_timetable({}, src_idx, bus500_files(), tt); + finalize(tt, false, true, false); + + for (auto a = transport_idx_t{0U}; a != tt.next_transport_idx(); ++a) { + for (auto b = transport_idx_t{0U}; b != tt.next_transport_idx(); ++b) { + if (a != b) { + EXPECT_EQ(tt.bitfields_[tt.transport_traffic_days_[a]] & + tt.bitfields_[tt.transport_traffic_days_[b]], + tt.bitfields_[bitfield_idx_t{0U}]); + } + } + } } \ No newline at end of file