{"id":19388377,"url":"https://github.com/mk-fg/trip-based-public-transit-routing-algo","last_synced_at":"2025-04-23T23:31:36.845Z","repository":{"id":144996736,"uuid":"70406891","full_name":"mk-fg/trip-based-public-transit-routing-algo","owner":"mk-fg","description":"Python implementation of Trip-Based public transit routing algorithm","archived":false,"fork":false,"pushed_at":"2017-05-14T08:43:24.000Z","size":772,"stargazers_count":50,"open_issues_count":0,"forks_count":6,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-02T22:32:53.184Z","etag":null,"topics":["graph-algorithms","gtfs","public-transportation","pypy","python3","routing-engine","trip-planning"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"wtfpl","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mk-fg.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-09T14:03:50.000Z","updated_at":"2024-10-01T14:56:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"d6caeccf-93e6-491c-8f92-ce068b19f93b","html_url":"https://github.com/mk-fg/trip-based-public-transit-routing-algo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk-fg%2Ftrip-based-public-transit-routing-algo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk-fg%2Ftrip-based-public-transit-routing-algo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk-fg%2Ftrip-based-public-transit-routing-algo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mk-fg%2Ftrip-based-public-transit-routing-algo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mk-fg","download_url":"https://codeload.github.com/mk-fg/trip-based-public-transit-routing-algo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250532051,"owners_count":21446107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["graph-algorithms","gtfs","public-transportation","pypy","python3","routing-engine","trip-planning"],"created_at":"2024-11-10T10:12:33.812Z","updated_at":"2025-04-23T23:31:36.823Z","avatar_url":"https://github.com/mk-fg.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"========================================\n trip-based-public-transit-routing-algo\n========================================\n----------------------------------------------------------------------\n Python implementation of trip-based public transit routing algorithm\n----------------------------------------------------------------------\n\nImplementation of the fast graph-based transit-routing algorithm from the\nfollowing papers:\n\n- Trip-Based Public Transit Routing (`arXiv:1504.07149v2`_, 2015)\n- Trip-Based Public Transit Routing Using Condensed Search Trees\n  (`arXiv:1607.01299v2`_, 2016)\n\n...with source data parsed (by cli script) from `GTFS feeds\n\u003chttps://developers.google.com/transit/gtfs/\u003e`_.\n\nSee \"Links\" section below for more references.\n\nNot focused on performance too much, mostly data structures layout and\nalgo-correctness, i.e. just a proof of concept or reference code,\nnot suitable for any kind of production use.\n\n|\n\n.. contents::\n  :backlinks: none\n\n\n\nUsage\n-----\n\nThere's command-line ``gtfs-tb-routing.py`` script that builds timetable from\nGTFS source data, initializes routing engine with it and runs queries on that,\nbut routing engine itself can be used separately.\n\nRegardless of interface, highly recommend using PyPy3 (3.3+) to run the thing,\nas it gives orders-of-magnitude performance boost here over CPython, and\ntransfer-set pre-calculation with large datasets can take a while.\n\nNo dedicated attempt at parallelization or memory optimizations is made here,\nso it might take much longer than necessary and eat all the RAM regardless.\n\n\nCommand-line script\n```````````````````\n\nUsage: ``./gtfs-tb-routing.py [options] gtfs-data-dir-or-file command ...``\n\nFor example, to run a profile query on an (unpacked) GTFS data from specified\ndir and pretty-print resulting (pareto-optimal) JourneySet to stdout,\n``query-profile`` command can be used::\n\n  ./gtfs-tb-routing.py gtfs-data query-profile stop-A stop-B\n\nSee ``./gtfs-tb-routing.py --help`` command output for a full list of all\nsupported/implemented commands and options.\n\nSome sample GTFS data zips can be found in ``test/`` directory.\n\nLinks to many open real-world GTFS feeds are available at `transit.land\n\u003chttps://transit.land/\u003e`_ repository.\n\nExample usage::\n\n  % unzip test/gtfs_shizuoka.data.2016-10-13.zip -d gtfs-shizuoka\n  Archive:  test/gtfs_shizuoka.data.2016-10-13.zip\n    inflating: gtfs-shizuoka/agency.txt\n    inflating: gtfs-shizuoka/routes.txt\n    inflating: gtfs-shizuoka/trips.txt\n    inflating: gtfs-shizuoka/stops.txt\n    inflating: gtfs-shizuoka/calendar_dates.txt\n    inflating: gtfs-shizuoka/stop_times.txt\n    inflating: gtfs-shizuoka/shapes.txt\n\n  % ./gtfs-tb-routing.py gtfs-shizuoka \\\n      --debug --day 2016-10-14 \\\n      --cache-timetable gtfs-shizuoka.pickle \\\n      --cache-precalc gtfs-shizuoka.cache cache\n\n  % ./gtfs-tb-routing.py gtfs-shizuoka.pickle -c gtfs-shizuoka.cache \\\n      query-earliest-arrival J22209723_0 J2220952426_0\n\n  Journey set (1):\n    Journey 33883d2af26ea29d (arrival: 08:43:00, trips: 2, duration: 02:33:00):\n      trip [333]:\n        from (dep at 06:10:00): 10:小川 [J22209723_0]\n        to (arr at 06:55:00): 49:島田駅 北口２番のりば [J222093340_2]\n      trip [341]:\n        from (dep at 08:35:00): 20:島田駅 北口２番のりば [J222093340_2]\n        to (arr at 08:43:00): 28:ばらの丘一丁目 [J2220952426_0]\n\n  % ./gtfs-tb-routing.py gtfs-shizuoka.pickle -c gtfs-shizuoka.cache \\\n      query-earliest-arrival J22209843_0 J222093345_0\n\n  Journey set (1):\n    Journey 35cd107483780a29 (arrival: 07:41:00, trips: 2, duration: 00:39:00):\n      trip [458]:\n        from (dep at 07:02:00): 1:田代環境プラザ [J22209843_0]\n        to (arr at 07:26:00): 20:島田駅 北口１番のりば [J222093340_1]\n      footpath (time: 0:02:16):\n        from: 島田駅 北口１番のりば [J222093340_1]\n        to: 島田駅 北口２番のりば [J222093340_2]\n      trip [26]:\n        from (dep at 07:33:00): 38:島田駅 北口２番のりば [J222093340_2]\n        to (arr at 07:41:00): 45:島田市民病院 [J222093345_0]\n\n\n  % ./gtfs-tb-routing.py gtfs-shizuoka.pickle -c gtfs-shizuoka.cache \\\n      query-profile J22209723_0 J2220952426_0\n\n  Journey set (7):\n\n    Journey 3387dfa2a4cb3956 (arrival: 08:43:00, trips: 2, duration: 01:23:00):\n      trip [174]:\n        from (dep at 07:20:00): 10:小川 [J22209723_0]\n        to (arr at 08:05:00): 49:島田駅 北口２番のりば [J222093340_2]\n      trip [341]:\n        from (dep at 08:35:00): 20:島田駅 北口２番のりば [J222093340_2]\n        to (arr at 08:43:00): 28:ばらの丘一丁目 [J2220952426_0]\n\n    Journey 338759bc528596df (arrival: 10:53:00, trips: 2, duration: 02:33:00):\n      trip [54]:\n        from (dep at 08:20:00): 10:小川 [J22209723_0]\n        to (arr at 09:05:00): 49:島田駅 北口２番のりば [J222093340_2]\n      trip [94]:\n        from (dep at 10:45:00): 20:島田駅 北口２番のりば [J222093340_2]\n        to (arr at 10:53:00): 28:ばらの丘一丁目 [J2220952426_0]\n  ...\n\n\nNote that ``cache`` command is used before queries to cache both timetable (for\na specific day and its vicinity) and precalculation result (lines, transfer set)\nto avoid doing that for every subsequent query.\n\nQueries above do not use calendar data, i.e. all trips from the timetable are\nconsidered to be valid.\n\nTo use calendar data, **always specify -d/--day** (and maybe ``--parse-days``\nand ``--parse-days-pre`` options) when building graph - i.e. \"cache\" command, or\nwhen running query without cache opts.\n\nUse ``--debug`` option to see pre-calculation progress (useful for large datasets)\nand misc other stats and logging.\n\n\nPython REPL (and IPython/Jupyter)\n`````````````````````````````````\n\nIt'd probably make sense to generate graph cache beforehand, i.e. by running::\n\n  % ./gtfs-tb-routing.py \\\n    gtfs-gbrail --stops-as-stations --debug --day 2017-05-13 \\\n    --cache-timetable gtfs-gbrail.pickle --cache-precalc gtfs-gbrail.cache cache\n\nThat will create \"gtfs-gbrail.pickle\" and \"gtfs-gbrail.cache\" files from source\ndata, which take much less time to load than building whole graph from GTFS (for\ncirca-2017 gbrain.info data on pypy 3.3 and circa-2012 desktop it takes ~30min).\n\nBe sure to run the REPL in the project dir or have tb_routing importable there\nin some other fashion.\n\n::\n\n  Python 3.3.5 (ea9979b550eeae87924dc4bef06070e8f8d0e22f, Oct 12 2016, 11:31:15)\n  [PyPy 5.5.0-alpha0 with GCC 6.2.1 20160830] on linux\n  Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n  And now for something completely different: ``apparently confusion is a\n  feature''\n\n  \u003e\u003e\u003e\u003e import tb_routing as tb\n  \u003e\u003e\u003e\u003e tt, r = tb.init_gtfs_router('gtfs-gbrail.pickle', 'gtfs-gbrail.cache')\n  \u003e\u003e\u003e\u003e journeys = r.query_profile('DIS', 'WWW')\n  \u003e\u003e\u003e\u003e journeys\n  ...\n  \u003e\u003e\u003e\u003e journeys.pretty_print()\n  ...\n\nThis should allow for easier tinkering, without needing to reload data caches on\nevery query.\n\n\nRouting engine\n``````````````\n\n``tb_routing.engine`` module implements actual routing, and can be used with any\nkind of timetable data source, passed as a ``tb_routing.types.public.Timetable``\nto it on init.\n\nSubsequent queries to engine instance return ``tb_routing.types.public.JourneySet``.\n\nSee `test/simple.py \u003ctest/simple.py\u003e`_ for example of how such Timetable can be\nconstructed and queried with trivial test-data.\n\n\nRequirements\n````````````\n\n- Python 3.x\n- `attrs \u003chttps://attrs.readthedocs.io/en/stable/\u003e`_\n- (only if gtfs calendar.txt is used) `pytz \u003chttp://pytz.sourceforge.net/\u003e`_\n- (for tests only) `PyYAML \u003chttp://pyyaml.org/\u003e`_\n- (for Python\u003c3.4 only) `pathlib \u003chttps://pypi.python.org/pypi/pathlib/\u003e`_\n- (for Python\u003c3.4 only) `enum34 \u003chttps://pypi.python.org/pypi/enum34/\u003e`_\n\nTo install all these on any random system (to ``~/.local/`` with ``--user``)::\n\n  % python3 --version\n  Python 3.3.5 (ea9979b550eeae87924dc4bef06070e8f8d0e22f, Oct 12 2016, 11:31:15)\n  [PyPy 5.5.0-alpha0 with GCC 6.2.1 20160830]\n\n  % python3 -m ensurepip --user\n  % python3 -m pip install --user attrs pyyaml pytz\n\n   ## For python\u003c3.4 only, but safe to run on later ones as well\n  % python3 -m pip install --user pathlib enum34\n\n   ## Done, run the app/tests\n  % ./gtfs-tb-routing.py --help\n  ...\n  % python3 -m unittest test.all\n\nAlternatively, run ``python3 -m virtualenv tb-routing-venv \u0026\u0026\n. tb-routing-venv/bin/activate`` before above commands to have these modules\ninstalled into \"tb-routing-venv\" dir, if `virtualenv \u003chttps://virtualenv.pypa.io/\u003e`_\nmodule is installed/available (can be installed via pip same as others above).\n\n\n\nNotes\n-----\n\nSome less obvious things are described in this section.\n\n\nCalendar data\n`````````````\n\nReal-world GTFS feeds usually have calendar.txt or calendar_dates.txt files in\nthem (and e.g. gbrail.info even has links.txt for time-dependent footpaths),\nwhich define whether specific sets of trips (services) are valid/invalid for\nspecific date/time ranges.\n\nIn addition to providing correct results, this info can be used to greatly\nreduce the initial timetable (by not considering all trips that aren't valid for\nspecific day) and transfer set size (as some transfers aren't valid due to time\nwhen trips' services operate).\n\nSo to work with any real-world feed, be sure to use ``-d/--day`` option (and\nasoociated ones), as that'd both improve performance and provide correct results.\n\nDefault is to parse and consider all trips to be valid for all days.\n\n\nGenerated transfers/footpaths\n`````````````````````````````\n\nNot all GTFS data contains (optional) transfers.txt files, and sometimes these\nare very slim or just empty.\n\nAlgorithm used here relies on having both \"footpath\" links between different\nstops and even within same stop (\"interchange time\" - how soon one can board\ndifferent trip after exiting from the last one at the same stop).\n\nSo gtfs parser module, by default, generates fotpaths based on stop locations\n(lon/lat) and a bunch of static parameters (like 2 min \"base\"\ninterchange/walking time and 5 km/h walking speed), if such data is missing or\ndoesn't even contain half of interchange times for stops.\n\nSuch generation process can be configured somewhat via ``tb_routing.gtfs.GTFSConf``.\n\n\nJourney optimality criterias\n````````````````````````````\n\nTrip-Based algorithm, as described in the `arXiv:1504.07149v2`_ paper optimizes\nearliest-arrival queries for two criterias:\n\n- Earliest arrival time.\n- Minimal number of transfers.\n\nProfile queries there have additional criteria - latest departure time.\n\nResult of this algorithm is a pareto-optimal set of trip-sequences (i.e. graph\nnodes) that lead to optimal set of these parameters.\n\nTo construct journey info from such nodes (trips) in a deterministic and\nsomewhat sensible fashion, additional \"minmal footpath time\" criteria is used to\npick optimal edges (footpaths/interchanges), with earliest optimal footpath\npreferred over later ones in case of ties.\n\n\nCaching\n```````\n\n``--cache-timetable`` and ``-c/--precalc-cache`` options allow to cache\ngtfs-processing/pre-computation results and re-use them between queries, which\ncan be very useful when working with non-trivial (e.g. real-world) datasets,\n\nThese options can and should be used together, or at least in that order, as\ntuples in TransferSet dumped with ``-c/--precalc-cache`` refer to ids of objects\nin Timetable.\n\n``./gtfs-tb-routing.py ... --cache-timetable ... --cache-precalc ... cache``\ncommand can be used to simply generate all the caches and exit.\n\n``--cache-timetable`` uses pickle serialization, so can be quite slow,\nespecially when saving data.\n\n\nTests\n`````\n\nCommands to run tests from checkout directory::\n\n  % python3 -m unittest test.all\n  % python3 -m unittest test.gtfs_shizuoka\n  % python3 -m unittest -vf test.simple\n\n``test.all.case`` also provides global index of all test cases by name::\n\n  % python3 -m unittest test.all.case.test_journeys_J22209723_J2220952426\n  % python3 -m unittest test.all.case.testMultipleRoutes\n\n\nPerformance optimization\n````````````````````````\n\nPre-calculation in Trip-Based routing algorithm, as noted in paper, is very\nsuitable for further optimization, especially on multi-core systems, where each\ntrip in the main loop there can be processed in parallel with minimal\nsynchronization.\n\nPython does not provide an easy way to optimize such processing, especially due\nto slow serialization of high-level objects and lack of support for cpu-bound\nthreads working in shared memory.\n\nWorkarounds are possible, but it's probably not worth considering python code\nfor any kind of production use.\n\n\nGenerating timetables from json-dgc graphs\n``````````````````````````````````````````\n\n`json-dgc \u003chttps://github.com/eimink/json-dgc/\u003e`_ is a simple d3-based tool to\ninteractively draw and save/load directed graphs to/from JSON.\n\nIt can be used to draw some testing transport network, using nodes as stops,\npositioning them as they'd be on a flat map (to auto-generate footpaths to ones\nthat are close) and naming/connecting them according to trip-lines.\n\n.. figure:: doc/example-images/json-dgc.jpg\n   :alt: json-dgc webui with loaded example graph\n\n``timetable-from-json-dgc.py`` script can then be used to convert saved JSON\ngraph into a pickled timetable, with trips auto-generated to run with regular\nintervals (and some fixed speed) along drawn lines, and footpaths connecting\nstops that are close enough.\n\nScript requires node names to have following format::\n\n  [\u003cstop-id\u003e:]L\u003cline1\u003e-\u003cseq1\u003e[/L\u003cline2\u003e-\u003cseq2\u003e]...\n\nWhere \"line\" is an arbitrary id for line (group of non-overtaking trips over\nsame stops at diff times), and \"seq\" is a string to sort stops for this line by,\ne.g. stops/nodes [L1-a, L1-b, L1-c] will be grouped into same line with 3 stops\nin that \"a-b-c\" order (alphasort).\n\nNames like \"L1-f/L5-a/L3-m\" can be used when multiple lines pass through same stop.\nDrawn edges aren't actually used by the script, node names/positions should have\nall the necessary info.\n\nSee script itself for all the constants like train/footpath speeds, line trips\nfirst/last times, intervals, stop arrival-departure deltas, etc.\n\n``timetable-from-json-dgc.example.json`` is an example JSON graph, as produced\nby json-dgc, and can be loaded/tweaked there or used as a template to generate\nwith some other tool (just two lists of all nodes / edges).\n\nGenerated timetable pickle file can be loaded by ``gtfs-tb-routing.py`` cli\nscript by simply pointing it to a file with pickled timetable instead of gtfs\ndir.\n\n\nUsing graphviz to render internal graphs\n````````````````````````````````````````\n\n``gtfs-tb-routing.py`` script has ``--dot-...`` options to dump various internal\ngraphs in `graphviz \"dot\" format \u003chttp://www.graphviz.org/doc/info/lang.html\u003e`_,\nwhich can then be rendered by `graphviz \u003chttp://www.graphviz.org/\u003e`_, one of its\nwrappers or any similar tool.\n\nWhen visualized, such graphs can be useful to understand what's happening\n\"under the hood\" and easily identify potential issues at a glance.\n\nFor example, to render all stops and lines connecting them from\n``timetable-from-json-dgc.example.json`` graph above and then open it in\n`xdot \u003chttps://github.com/jrfonseca/xdot.py\u003e`_ graphviz wrapper,\nfollowing commands can be used::\n\n  % ./gtfs-tb-routing.py -t tt.pickle \\\n      --dot-for-lines lines.dot query-profile L2-a/L3-k L2-k/L3-i\n  % xdot lines.dot\n\n.. figure:: doc/example-images/dot-for-lines.jpg\n   :alt: xdot showing dot-for-lines graph fragment\n\nOr, to render a tree of transfer-patterns for a specified source stop::\n\n  % ./gtfs-tb-routing.py -t tt.pickle \\\n      query-transfer-patterns --dot-for-tp-subtree tp-subtree.dot L2-a/L3-k L2-k/L3-i\n  % xdot tp-subtree.dot\n\n.. figure:: doc/example-images/dot-for-tp-subtree.jpg\n   :alt: xdot showing dot-for-tp-subtree graph fragment\n\nSee ``-h/--help`` output for the script and relevant subcommands for more of these.\n\n\n\nMissing things\n--------------\n\n- Transfer Patterns tree storage optimization (\"Splitting Trees\") as per\n  `arXiv:1607.01299v2`_ paper.\n\n  Proved to be rather difficult to implement in a more-or-less comprehensible\n  fashion, complicates code quite a lot, is rather boring and slows down the\n  actual queries, hence somewhat dubious.\n\n- Profile queries using query trees can probably benefit from optimizations\n  described in \"Multi-criteria Shortest Paths in Time-Dependent Train Networks\"\n  paper.\n\n- Some additional data from GTFS can be used, e.g. frequences.txt and names for\n  services/trips/lines for more comprehensible results and easier introspection.\n\n- Storing data in some db instead of memory and loading it selectively seem to\n  be the most obvious practical optimization.\n\n- Some interactive querying interface for long-running instance (e.g. webui or\n  ipynb) can be useful for all kinds of experiments, in addition to existing\n  caching code.\n\n\n\nLinks\n-----\n\nPapers/docs directly related to this project:\n\n- Trip-Based Public Transit Routing (`arXiv:1504.07149v2`_, 2015)\n\n- Trip-Based Public Transit Routing Using Condensed Search Trees\n  (`arXiv:1607.01299v2`_, 2016)\n\n  This paper relies heavily on algorithms and concepts described in:\n\n  - Fast Routing in Very Large Public Transportation Networks using Transfer Patterns\n    (`ACM:1888969 \u003chttps://dl.acm.org/citation.cfm?id=1888969\u0026preflayout=flat\u003e`_,\n    `transferpatterns.pdf \u003chttp://ad.informatik.uni-freiburg.de/files/transferpatterns.pdf\u003e`_, 2010)\n\n  - Multi-criteria Shortest Paths in Time-Dependent Train Networks\n    (`ACM:1788914 \u003chttps://dl.acm.org/citation.cfm?id=1788914\u0026preflayout=flat\u003e`_,\n    `DisserMullerHannemannEtal2008.pdf\n    \u003chttps://www.coga.tu-berlin.de/fileadmin/i26/download/AG_DiskAlg/FG_KombOptGraphAlg/paper/2008/DisserMullerHannemannEtal2008.pdf\u003e`_,\n    2008)\n\n- `General Transit Feed Specification (GTFS) format info\n  \u003chttps://developers.google.com/transit/gtfs/\u003e`_\n\nMore on the subject:\n\n- `Topical github awesome-transit list-repo \u003chttps://github.com/luqmaan/awesome-transit\u003e`_\n\n- `OpenTripPlanner (OTP) project \u003chttp://www.opentripplanner.org/\u003e`_ + `Bibliography.md there\n  \u003chttps://github.com/opentripplanner/OpenTripPlanner/blob/master/docs/Bibliography.md\u003e`_\n\n  Includes implementation of `RAPTOR\n  \u003chttps://www.microsoft.com/en-us/research/wp-content/uploads/2012/01/raptor_alenex.pdf\u003e`_ -like\n  RoundBasedProfileRouter (see RepeatedRaptorProfileRouter.java and PR-1922 there).\n\n- `Graphserver project \u003chttps://github.com/graphserver/graphserver/\u003e`_\n\n- `transit.land open GTFS transit data feeds/repository \u003chttps://transit.land/\u003e`_\n\n- Github orgs/groups related to transportation maps/routing:\n\n  - `open-track \u003chttps://github.com/open-track\u003e`_\n  - `OpenTransport \u003chttps://github.com/OpenTransport\u003e`_\n\n\n.. _arXiv\\:1504.07149v2: https://arxiv.org/abs/1504.07149\n.. _arXiv\\:1607.01299v2: https://arxiv.org/abs/1607.01299\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmk-fg%2Ftrip-based-public-transit-routing-algo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmk-fg%2Ftrip-based-public-transit-routing-algo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmk-fg%2Ftrip-based-public-transit-routing-algo/lists"}