Commit Graph

1677 Commits

Author SHA1 Message Date
Dustin Carlino
a4906a2953 More flag-guarded color scheme progress towards #715:
- choosing some building colors
- proper unzoomed road/intersection outlines
- adjusting curb color based on road rank (for arterials, it was the
  same grey!)
2021-07-28 12:12:01 -07:00
Dustin Carlino
d6936c5535 Refine the trimming rules -- insist on short roads, and leave borders alone.
Not regenerating everything yet, but spot-checked downtown where some
things broke previously.
2021-07-28 10:55:47 -07:00
Dustin Carlino
ffcf0a8d66 Fix a bug in transit snapping introduced by 163244ace9. Regenerating all maps, also bringing in a Tempe OSM fix...
The deadend trimming is too enthusiastic, getting rid of some unsnapped
cycleways and things connecting to the map border. Will iterate on it
this week; net benefit for now.
2021-07-27 16:56:11 -07:00
Dustin Carlino
9e68c22d67 Try to collapse degenerate intersections that happen near snapped cyclepaths. #330
The udistrict is shaping up...!
2021-07-27 12:39:44 -07:00
Dustin Carlino
1bde8c5345 Start turning cycle separation OSM tags (https://wiki.openstreetmap.org/wiki/Proposed_features/cycleway:separation) into buffer lanes. Only attempting for cycleways tagged on the road right now, since we're going to be snapping separated ways anyway... #330
And start experimenting with this in the snapper. Quick tests with the
Roosevelt PBL in the udistrict.
2021-07-27 12:12:10 -07:00
Dustin Carlino
4547395067 Move the cycleway snapping step to happen just before RawMap->Map, so we can play with it in the map_editor. #330 2021-07-27 11:20:57 -07:00
Dustin Carlino
163244ace9 Trim dead-end cycleway and service road stubs. Not regenerating yet, but
spot checked in Tempe and the UDistrict.
2021-07-27 11:13:47 -07:00
Dustin Carlino
3e26c6489a Run merging in the map editor, to reproduce the order that'll happen when importing. #654 2021-07-27 09:53:51 -07:00
Dustin Carlino
c5e769d276 Start a very basic binary classifier for high-stress cycling road, with a layer to check it. Use this to filter the mode shift dashboard -- effectively revealing PCT-esque gaps in the infrastructure. #448, #494 2021-07-26 10:48:00 -07:00
Dustin Carlino
06429d0d5f In the mode shift dashboard, show roads that might be highly used by converted trips... but that're missing bike infrastructure. #448 2021-07-26 10:41:51 -07:00
Dustin Carlino
1a8eecb2ac Remove old color scheme experiments. They're no longer interesting and just clutter the codebase, making big changes like #715 harder to manage 2021-07-23 19:20:36 -07:00
Dustin Carlino
b45f9e0134
Create new lane types to express different types of buffers for prote… (#704)
* Create new lane types to express different types of buffers for protected bike lanes. They're only created manually right now, to explore rendering.

* Update planter rendering

* Update planter - simplify

* fmt after merge

* Fixing up existing rendering

* Add curb buffer

* Adjust stripes

Co-authored-by: Robin Lovelace <rob00x@gmail.com>
2021-07-23 11:31:36 -07:00
Dustin Carlino
2538309c76 Automatically look for short roads near traffic signals and opt them into merging! #654
Manually invoked heuristic for the moment, and has some issues, but a
start.
2021-07-21 11:34:04 -07:00
Dustin Carlino
1f4124ee64 Handle clusters of merging short roads in the "interior" of a complex
intersection. This often happens with a group of 4 intersections (two
divided highways), and there may be many small segments embedded in the
middle for street car tracks and such.

Also bring in fresh OSM for Tempe, with one such intersection now
consolidated! #654, #672
2021-07-20 14:22:00 -07:00
Dustin Carlino
c5210e9887 Actually, keep the broken list of ways, to manually run with backtraces 2021-07-20 11:36:53 -07:00
Dustin Carlino
6f549e5747 Debug how roads are being ordered around an intersection, and restore map_editor's ability to preview one intersection with the debugging geometry. #654 2021-07-20 10:08:02 -07:00
Dustin Carlino
d10d8ceb33 Clean up code and regenerate everything with new the consolidation algorithm... #654
Phinney gridlocks again; 68daa6884a was
too ambitious. Otherwise all fine!
2021-07-19 15:07:10 -07:00
Dustin Carlino
c7b6c11e37 Fix the wacky endpoint order for Montlake/520 with a more careful definition of center. 2021-07-19 15:07:10 -07:00
Dustin Carlino
c28fef1752 By the power of my Mammal Hands, I will figure this out. #654 2021-07-19 15:07:10 -07:00
Dustin Carlino
e6f72449f4 Some fixes to get the Arboretum trails connected.
- Grab fresh Seattle OSM, picking up https://www.openstreetmap.org/changeset/108071529
- Treat highway=footway, bicycle=dismount as a cyclepath, for now
- Treat service=driveway, bicycle=designated as a cyclepath

Since this requires regenerating all maps anyway, also include some
stuff to improve Aurora near Green Lake:

- stop making highway lanes super wide by default; they just make
  divided highways overlap themselves
- filter out service roads with access=customers

But note the bridge from the Arboretum to Lynn is still disconnected,
because of detailed footway mapping that isn't tagged as
bike-accessible.
2021-07-18 20:52:41 -07:00
Dustin Carlino
db435cd56d Use the quick fix to https://github.com/easbar/fast_paths/issues/34 to
dramatically improve time to import and edit maps.

The fix helps all maps that use extremely high edge weights to prevent
people from cutting through private roads. There may be a more robust
fast_paths fix later, but I want to reap the benefits for tomorrow's
release.

The dramatic numbers:

- importing huge_seattle: 893s down to 108s
- editing huge_seattle: 102s down to 19s

Query speeds didn't appear to substantially change.
2021-07-17 22:33:01 -07:00
Dustin Carlino
4cfb06da97 Make the Map cloneable, by being careful with the thread-local pathfinder state.
I think this will help simplify calculate_unedited_map. But even if not,
this is bound to come in handy.
2021-07-15 18:34:42 -07:00
Dustin Carlino
062f38aca3 Speed up the previous by caching road_to_buildings in Map. 2021-07-15 18:12:15 -07:00
Dustin Carlino
b3ce53aa5f Draw building driveways per zoomed-in road, rather than as one map-wide batch. Otherwise, every single edit to road width needs to redraw all driveways. This doesn't scale with larger maps!
When zoomed in on just a building but not its road, this means the driveway won't show up until the road is in view. Acceptable trade-off.
2021-07-15 18:05:04 -07:00
Dustin Carlino
10fdaa8e92 estimate_duration already knows the mode, from the PathRequest 2021-07-14 12:38:19 -07:00
Dustin Carlino
03d21c4fe9 A first mode-shift experiment: create a table of trips showing expected
time to drive/bike, the elevation profile, and the distance. #448
2021-07-14 12:17:03 -07:00
Dustin Carlino
9237afb439 Revive cyclepath snapping. #330
Several ways to output the results:

1) just write OSM tags to debug stuff, but keep the ways
2) write a KML file to visualize the perpendicular line checks
3) delete the cycleway and make it an attribute of roads instead

Many problems with the snapping heuristics, but enough progress to
commit disabled!
2021-07-13 15:33:07 -07:00
Dustin Carlino
2224dccda9 Add a tool in the main UI to try to merge junctions. #654
It maintains a JSON file of ways to merge that the importer also uses.
For maps fast to import, this is the nicest workflow. Unlike map_editor,
turns and trimmed roads can also be checked.
2021-07-11 13:19:00 -07:00
Dustin Carlino
843dd38f7e Support multi starts/ends in the Dijkstra pathfinding engine. [rebuild] [release] 2021-07-11 10:11:50 -07:00
Dustin Carlino
7b98dd72e2 Backfill the implementation of all_costs_from. 2021-07-10 17:32:06 -07:00
Dustin Carlino
8be065c1b8 Finally regenerate all data. Trip times got slower, because now pedestrians can't zoom up one side of a steep hill.
Temporarily leaving all_costs_from as the only thing broken by the
refactor. Will fix it before the release tomorrow.
2021-07-10 17:14:10 -07:00
Dustin Carlino
6128ab5ed5 Fix an issue with init order and transit::make_stops_and_routes 2021-07-10 17:14:10 -07:00
Dustin Carlino
0edc0cb279 Fix the Dijkstra pathfinding, by using DiGraph, which is serializable 2021-07-10 17:14:10 -07:00
Dustin Carlino
2d16f5d878 Get the crazy pathfinding revamp to work
- initialization order
- reusing node ordering and applying edits

Importing, editing the map, and the basic scenario seem OK! --skip_ch
breaks, because of the lack of serialization
2021-07-10 17:14:10 -07:00
Dustin Carlino
c5369a10f4 Invert the structure of CH-vs-dijkstra pathfinding. Use a generic
"engine" that just operates on raw usize IDs. Embed that enum in each of
the particular pathfinders. This way, we don't have to keep duplicating
logic to delegate requests, handle one-step edge cases, etc. And it also
sets us up to more easily try out other CH implementations like osm_ch,
without having to move around tons of code.

Still use fast_path's InputGraph as the "universal" format, for now.

This is a huge change... got map_model compiling at least. Some stubbed
out stuff.
2021-07-10 17:14:10 -07:00
Dustin Carlino
74500a24dd Refactor pedestrian pathfinding, sharing input graphs between CH/dijkstra 2021-07-10 17:14:10 -07:00
Dustin Carlino
830c683009 Refactor vehicle pathfinding. Share input graphs between CH/dijkstra
impl.
2021-07-10 17:14:10 -07:00
Dustin Carlino
fe64501e6d Fix pedestrian speeds on inclines. Those walking contraflow on a
sidewalk were using the wrong incline!

Not regenerating data yet (need to regenerate all maps)
2021-07-10 17:14:10 -07:00
Dustin Carlino
da704b4546 Extend the parking thought bubbles to handle people climbing steep hills.
(And some clippy fixes)
2021-07-10 17:14:10 -07:00
Dustin Carlino
4aa971e34e Add a new importer mode to do Raw->Map in parallel. Occasionally useful
now that my faster machine works again.

Running importer jobs in parallel is actually super hard, because
there's async stuff thrown in there now to download files.
2021-07-06 16:21:42 -07:00
Dustin Carlino
964cc23df8 Improve 3-way signal timing by explicitly specifying crosswalks. This
fixes a very dramatic problem in the Green Lake map.

Regenerating everything...

Also added total trip time to the prebaked summary, to get a quick sense
if a change net helps or hurts and have a record in version control.
2021-07-06 14:37:50 -07:00
Dustin Carlino
f37e71236f Some fixups to the regenerated data from the past two commits:
- handle when the equiv_pos of a driveway gets too close to the edge of
  another lane
- make the updater workflow handle files from S3 that're a bit older
- remove pathfinding_avoiding_roads
- strip out old vehicle capping from map edit JSON, then fix up
  proposals
- delete old capping API example
- temporarily give up on phinney; it starts gridlocking
- add broadmoor proposal link in-game
2021-07-05 17:51:40 -07:00
Dustin Carlino
a0dcc255c3 Rip out all congestion capping code. #325
This collaboration is abandoned, the code slows down refactoring, and
if we started this idea again today, it'd be better to do it from
scratch anyway.

Regenerating everything.
2021-07-05 11:15:31 -07:00
Dustin Carlino
4d4cbdf525 Fix equiv_pos. Tested visually on curvy roads and by watching cars slide
into/out of parallel parking.

Not regenerating anything yet...
2021-07-05 11:02:27 -07:00
Dustin Carlino
6039063d28 Add a debug tool to dump JSON for different objects and open up with an external viewer. [rebuild] [release]
And fix some clippy problems
2021-07-04 15:32:49 -07:00
Dustin Carlino
382d890ac6 Switch to updated fast_paths 2021-07-04 14:34:20 -07:00
Dustin Carlino
0211094689 Create static blockages for off-side driveway exits. Verified correct
for all combinations of on/off-side exits and cutting across lanes by
using the static blockage visualizer.
2021-07-04 14:34:20 -07:00
Dustin Carlino
95ffa62218 Fix the unparking position. When we exit a driveway in EITHER direction,
we need to adjust the start position to account for the vehicle's
length.

Also add a very convenient debug tool to understand positions along
lanes.

This probably breaks static blockages; I'll check into that next.
2021-07-04 14:34:20 -07:00
Dustin Carlino
57feeada59 Allow vehicles to exit driveways onto the opposite side of the road. #555
- Adding an internal alt_start to PathRequest
- Using it for contraction hierarchy queries only (the Dijkstra
  implementation now diverges!)
- Figuring out which start position was used

TODO:

- Fix the unparking position
- Make sure the simulation inserts static blockages
- Carefully check the same start/end road case
- Evaluate impact on gridlock / cancelled trips
2021-07-04 14:34:20 -07:00
Dustin Carlino
efaf6085e4 Prepare for exiting driveways on the off-side by switching to
specialized PathRequest constructors
2021-06-30 12:35:22 -07:00
Dustin Carlino
137e9a0c2c Fix up some places affected by the f64 serialization:
- offstreet_parking_length in importer config
- backwards compatibility for map edits
- fixing up the baked-in proposals
- working around a few PolyLine bugs that happen with the new rounding
- Don't regenerate actdev scenarios yet -- the upstream JSON format is
  out of date, will have to fix separately.
2021-06-30 06:35:42 -07:00
Dustin Carlino
f57278e9cd Enable the new walking turn algorithm for consolidated intersections
only. It has much simpler logic and produces correct results for these
intersections, but it has degradations in some cases -- so limit where
we use it.

But in the meantime, this makes realistic crosswalks over Aurora,
fixing crazy walking detours there.

Not regenerating yet.
2021-06-24 12:41:38 -07:00
Dustin Carlino
190ee4b08f Fix the path v2->v1 and opportunistic lane-changing costs to heavily penalize cars from using bus lanes.
This doesn't avoid the aforementioned lane-changing crash, but by manual
inspection, it's keeping cars out of bus lanes.
2021-06-22 17:47:05 -07:00
Dustin Carlino
48076a4c5b Better stop sign placement -- degenerate roads shouldn't get them. Not
sure why this wasn't done before.

Regenerated all maps... but this happens to expose some lane-changing crashes.
2021-06-22 17:05:18 -07:00
Dustin Carlino
e08ddba241 Bring in fresh Seattle OSM data with the new cycletrack mapped around
Green Lake, and fix some missing support for bidi cycletracks.
2021-06-22 08:31:16 -07:00
Dustin Carlino
ae3d4e2363 Fix loading edits that change the number of lanes in a road. We need to compare the old version of the road in the edits with the basemap, NOT the edited version of the road. #597 2021-06-20 10:06:38 -07:00
Dustin Carlino
1e43d929e5 Implement dynamic lane-changing in a simple way:
- only triggered when a vehicle becomes Queued
- Only one adjacent lane, no contraflow (crossing the road's center
  line)
- Don't return to the original lane after passing
- Using a static blockage in the old lane (so other vehicles will wait
  too much)
- Only using the new lane to determine position (so visually a car will
  clip a bike as they pass)

Haven't regenerated prebaked data. #382
2021-06-19 12:35:19 -07:00
Dustin Carlino
0bcf01fd05 Avoid crashing in recalculate_intersection_polygon due to polylines not
containing some points. Happens at i524 in Arboretum and in the West
Seattle proposal.

I don't understand yet why this is possible in the first place, but
crashing is pretty bad in the meantime.
2021-06-19 11:29:01 -07:00
Dustin Carlino
8f199177f5 Upgrade to Rust 1.53
- arrays are now iterable directly
- switch to using BTree{Set,Map}::retain!
- a round of clippy
- regenerate scenarios and prebaked data; not sure why, but there's a
  diff
2021-06-17 23:04:35 -07:00
Rémi Lauzier
1a4b997818 Fix some clippy warnings 2021-06-16 16:21:35 -07:00
Dustin Carlino
cbce654800 Prepare to have vehicles exiting driveways block any intermediate lanes. #555
This is just wiring together all of the state transitions. Haven't
decided how to internally implement this in Queue yet.
2021-06-16 16:02:17 -07:00
Rémi Lauzier
dd050ea425 Update some dependency 2021-06-16 15:51:03 -07:00
Dustin Carlino
321e7cd0ee Allow exiting a driveway onto any lane (in the same road direction). #555
- Support this at the pathfinding level, when transforming v2->v1
- Adjust how the vehicle's body is rendered as it exits a driveway onto
  a farther lane

No support yet for blocking any intermediate lanes; vehicles may clip
through each other without any conflict. Planning to add that
separately.

Regenerating all scenarios and prebaked data...
2021-06-16 15:46:09 -07:00
Dustin Carlino
76aba75082 Update links to docs after some reorg in the other repo 2021-06-12 13:38:38 -07:00
Dustin Carlino
43d6ba80c5 Fix all_walking_costs_from by properly accounting for the distance between sidewalk endpoints and building paths. 2021-06-11 10:10:41 -07:00
Trevor Nederlof
4e150dcab0
Generalized connectivity to use Spot and added BorderIsochrone (#668) 2021-06-11 10:06:53 -07:00
Dustin Carlino
972f5b0187 Lower the priority of service roads when placing stop signs
Regenerate all data. Wallingford started gridlocking due to this change;
plowing ahead and will follow up and fix it.
2021-06-11 09:40:44 -07:00
Dustin Carlino
18ff0eefc0 Store Turns per Intersection, instead of a massive BTreeMap. #368
Minimal file size savings, but substantial runtime improvement!
2021-06-11 09:40:44 -07:00
Dustin Carlino
d2ecab44a7 Be sure to validate signals before committing the results, since GMNS imports aren't validated upfront. #626 2021-06-02 11:40:54 -07:00
Dustin Carlino
5127a82b54 Import Tehran 2021-06-01 10:19:06 -07:00
Dustin Carlino
d014098f59 Fix an extremely naive implementation of calculating average angle,
which was causing bizarre turn lane arrows in Tempe.
2021-06-01 09:52:40 -07:00
Dustin Carlino
5aa00955f9 Clean up the timer.parallelize API, getting rid of the weird enum to
toggle how many CPUs to thrash. We always use all of them, except for
one case, where a separately named method is more clear. Also make that
variation use all but 1 CPU, instead of just half.
2021-05-27 17:47:22 -07:00
Dustin Carlino
cf6b2f6db7 Rewrite the heuristics for stop signs. Similar to traffic signals, only
count incoming roads when figuring out if an intersection is degenerate.
Also make link roads (on/off ramps) lower priority than the main part of
the road.

Regenerated everything.

(and fixing up the cloud scripts)
2021-05-27 15:37:46 -07:00
Dustin Carlino
8ceaf296eb Allow u-turns at merged intersections when the turn lane is explicitly tagged in OSM. This makes the infamous U-turn from Montlake to 520 WB work! The inferred signal timing isn't great, but ah well.
Not regenerating yet
2021-05-27 10:09:22 -07:00
Dustin Carlino
455399b90e Collapse degenerate intersections between cycle+footpaths. At various
times in the past, I've also tried doing this for other roads, but wound
up reverting for reasons only git remembers. But it seems like an
obvious win for bike paths; especially around Seattle, the ways are
split because of all of this raised curb data we're ignoring anyway.

Tested manually around Montlake.

Finally regenerating all data... Only Phinney breaks. One for tomorrow.
2021-05-26 22:27:29 -07:00
Dustin Carlino
3a68e5677f Allow all vehicles to use bus-only lanes that also happen to be turn lanes. #555
There are some caveats with the implementation commented inside.
Verified manually in Montlake -- down to just 122 cancelled turns!

Still not regenerating...
2021-05-26 19:13:14 -07:00
Dustin Carlino
6f0e01c511 Fix a critical bug with pathfinding v2: when calculating allowed
movements, make sure that a vehicle can access BOTH the source and
destination lane of a turn. #555

Without this fix, a turn from a bus lane to a driving lane is allowed
for cars at the pathfinding v2 level, but then it fails when converting
into v1 lanes.

(Next step: actually allow this for combination bus/turn lanes)

Not regenerating data yet
2021-05-26 15:39:34 -07:00
Dustin Carlino
4bd79cabbf Upload regenerated map data and address turn restriction PR feedback 2021-05-25 20:24:11 -07:00
Dustin Carlino
2dd611fd73 Refine the connectivity check for bus and bike lanes
Down to 12 connectivity problems in Montlake! Now that the dust has
settled, manually check the 3 unit tests and confirm the goldenfile
diffs.
2021-05-25 20:24:11 -07:00
Dustin Carlino
7af86a9e59 Interpreting turn:lanes tagging more carefully.
And fix an absolutely infurriatingly bad typo from the previous commit.

Now both the multiple_left_turn_lanes and divided_highway_split test
maps look great!
2021-05-25 20:24:11 -07:00
Dustin Carlino
c95a0b0f64 Handle another case for creating multiple left/right turns at an intersection. Use the new validation for connectivity at an intersection and give up on using OSM turn restrictions in some cases.
39 problems in Montlake down to 33, but regressions on some of the LCing unit tests...
2021-05-25 20:24:11 -07:00
Dustin Carlino
62af2fef8c Introduce a new method to check for connectivity problems between vehicle lanes at an intersection, and start tracking the number of problems across a map. 2021-05-25 20:24:11 -07:00
Michael Kirk
11a49e7c55 Add "arterial crossing" risk for pedestrians.
Also:clarify "Complex" vs "Large" intersection, which is now ambiguous.
2021-05-25 16:02:26 -07:00
Dustin Carlino
dc5a484c4c Clean up the old special case for editing just a single lane type. Now, every modification to a road will touch LaneIDs. #597
This is safe to do, now that the two callers (the old lane editor, and
the old bulk lane type switcher) are gone.
2021-05-21 14:34:04 -07:00
Dustin Carlino
ef90721741 Fix missing study area polygons on the web. The refactor to Polygon::from_geojson_file introduced filesystem IO to the geom crate. Instead, we need to be explicit about how we do file IO.
Also fix some clippy errors
2021-05-20 14:33:04 -07:00
Dustin Carlino
70d6bf52d2 Fix the "growing intersection" bug that happens when repeatedly using
the new road editor, by "untrimming" the road center points. Fixes #655
2021-05-19 22:24:44 -07:00
Dustin Carlino
a38228d5da Codify some different strategies for merging short roads 2021-05-18 16:03:57 -07:00
Dustin Carlino
27da792df6 cargo fmt 2021-05-15 16:28:50 -07:00
Vinzent Steinberg
ac62dde925 Prefer turbofish over temporary binding when collecting 2021-05-15 14:24:08 -07:00
Vinzent Steinberg
9d17faa878 Prefer slices over reference to owned type 2021-05-15 14:24:08 -07:00
Vinzent Steinberg
446a21696d
Fix most clippy warnings (#646)
* More conventional spelling of acronym identifiers

* `new` -> `new_state`

* Remove redundant field name

* Remove needless `collect`

* `to_controls` -> `make_controls`

* Simplify long if statement

* Fix module inception

* Simplify chained if let

* Return directly instead of creating a binding

* Disable clippy warning about `borrow` method

Implementing the `Borrow` trait instead would result in excessive type
annotations.

* Fix most remaining clippy warnings

* Allow clippy::type_complexity

* Fix bad merge from web editor

* Run cargo fmt

* Suppress large_enum_variant warnings

* Rename FYI state to ShowMessage

* Fix upper_case_acronyms warnings

Co-authored-by: Dustin Carlino <dabreegster@gmail.com>
2021-05-14 17:31:32 -07:00
Dustin Carlino
29c881ffc3 Switch from cargo +nighty fmt to the stable cargo fmt. Whatever edge-case formatting was happening with stable has been fixed 2021-05-14 08:39:51 -07:00
Vinzent Steinberg
fd3b0e2a14
Fix compilation failures and most clippy warnings (#642)
* abstutil: Fix compilation failure

* map_gui: Fix compilation

* traffic_signal_data: Fix compilation failure

* map_model: Fix compilation failure

* abstutil: Fix doctests

* abstio: Fix most clippy warnings

* abstutil: Fix most clippy warnings

* collisions: Fix clippy warning

* convert_osm: Fix clippy warnings

* sim: Fix most clippy warnings

* geom: Fix clippy warnings

* kml: Fix clippy warnings

* map_model: Fix most clippy warnings

* fifteen_min: Fix clippy warnings

* game: Fix many clippy warnings

* Disable some noisy clippy warnings

* headless: Fix clippy warnings

* importer: Fix clippy warnings

* map_editor: Fix clippy warnings

* map_gui: Fix clippy warnings

* osm_viewer: Fix clippy warnings

* parking_mapper: Fix most clippy warnings

* popdat: Fix clippy warnings

* santa: Fix clippy warnings

* sumo: Fix clippy warnings

* traffic_seitan: Fix clippy warning

* updater: Fix clippy warnings

* widgetry: Fix clippy warnings

* tests: Fix some clippy warnings

* Fix compilation on stable Rust

* Simplify unwrapping

* Make use of `Entry` more readable

* Fix formatting

* Fix code that was broken in the refactoring

* Apply cargo +stable fmt

* Fix code that was broken in the refactoring, second try

* Remove `Default` impls that are equivalent to `new`

* Remove obsolete clippy wrapper

* Avoid turbofish

* Prefer `unwrap_or_else` over allowing `clippy::or_fun_call`

* Remove redundant `into_iter`

* Fix typo

* Prefer `&& false` over commenting code out

* Fix some clippy warnings

Co-authored-by: Dustin Carlino <dabreegster@gmail.com>
2021-05-14 08:32:56 -07:00
Dustin Carlino
1bcbe057f0 Use more realistic lane widths during importing. #597 2021-05-10 20:10:23 -07:00
Dustin Carlino
4d3234ea14 Plumb a flag through the importer to try to consolidate all intersections in a map 2021-05-08 11:34:16 -07:00
Dustin Carlino
8c09f33761 Also implement multi-source Dijkstra's for vehicles. Had to give up on petgraph. 2021-05-06 10:48:32 -07:00
Dustin Carlino
8d6a184a1f Speed up the 'find perfect home' tool by starting Dijkstra's floodfill with multiple sources. Only implemented for walking right now. 2021-05-06 10:48:32 -07:00
Dustin Carlino
b29a613b42 Use strum macro to implement AmenityType::all 2021-05-06 08:50:29 -07:00
Trevor Nederlof
4080d0d130
Add craft and office to import and add/reorg AmenityType (#638)
* Add craft and office to import and add/reorg AmenityType

* Remove bike rental/parking and rename BikeShop to Bike

* add in leisure and tourism tags, add more categories to AmenityType and remove lesser used tags

* add dependency on strum and strum_macros and removed some manual code for text display of Enum and Enum into string

* include lock file, fix color of buildings for amenity layer, fix formatting and use orders
2021-05-06 08:43:52 -07:00
Dustin Carlino
488c9ffe68 Start to import GMNS timing.csv just based on line-strings. #626 2021-05-04 10:34:34 -07:00
Dustin Carlino
f400663b01 Better choices for lane width. #597 [rebuild] [release] 2021-05-02 09:11:21 -07:00
Dustin Carlino
4826808b9b Use fast_paths from crates.io, now that a new release is out 2021-04-25 18:03:16 -07:00
Dustin Carlino
a09bbd37c2 Improve the geometry of some consolidated intersections by taking the
convex hull. In many cases, this removes interior "jaggedness".

Regenerate all data... [rebuild]
2021-04-24 12:58:05 -07:00
Dustin Carlino
8722c102b9 Fix bug moving lanes left/right where the width of different lanes
wasn't getting updated, due to the code-path handling the old case...
2021-04-22 10:22:06 -07:00
Dustin Carlino
2112736a1f Polish UI of new road editor 2021-04-22 07:57:23 -07:00
Dustin Carlino
4b5bea1f10 Fix dumb bug from 18589cb083 2021-04-22 07:57:23 -07:00
Dustin Carlino
acfe095a3f Handle editing just the width of one lane 2021-04-22 07:57:23 -07:00
Dustin Carlino
c73ceebd35 MVP of Yuwen's new road editor! 2021-04-22 07:57:23 -07:00
Dustin Carlino
bc2a21ca89 Refactor some methods in Traversable 2021-04-19 14:50:51 -07:00
Dustin Carlino
c62cf1c90c Refine the detection for when a car wants to over-take a bike, and expose it in the UI as a problem. #81, #600 2021-04-19 14:44:42 -07:00
Dustin Carlino
96d2f35779 Refactor handling of the fast_paths unused-last-node problem.
Now regenerating everything...
2021-04-16 20:14:16 -07:00
Dustin Carlino
c1d95a2cf4 Handle adding/deleting sidewalks. This needs more caution at the pathfinding layer. #597
Tested by adding a sidewalk to 28th and Madison in the Arboretum map.
Not regenerating maps yet.
2021-04-16 17:00:50 -07:00
Dustin Carlino
72c48cb1f9 Address misc PR feedback for #604 2021-04-13 15:13:36 -07:00
Dustin Carlino
9923c1270a Repair parking lot connections after road widening. #597 2021-04-13 15:13:36 -07:00
Dustin Carlino
b9a9e8e5c5 Redraw building paths when needed 2021-04-13 15:13:36 -07:00
Dustin Carlino
a649e0be77 Repair building connections after road widening. #597
Don't redraw the paths yet, or try to deal with failures to snap.
2021-04-13 15:13:36 -07:00
Dustin Carlino
c16f185019 The new intersection polygon usually changes the trimming of all connected road center lines. #597 2021-04-10 11:56:05 -07:00
Dustin Carlino
10255c2835 Recalculate intersection geometry when road width changes. #579
No effect on the road geometry yet, though...
2021-04-10 11:56:05 -07:00
Dustin Carlino
e8b7019ef7 Use LaneSpec in map edits, letting width of each lane be modified too. #597 2021-04-09 14:35:49 -07:00
Dustin Carlino
68661f0efd Actually, to keep all of the existing editing UIs from breaking, preserve LaneIDs when just editing lane types. #597 2021-04-09 14:35:49 -07:00
Dustin Carlino
3beb153bbf Support adding lanes. #597
And in fact, unify the cases of deleting lanes, adding lanes, or just
modifying them in place.
2021-04-09 14:35:49 -07:00
Dustin Carlino
14609ab157 Fix lane geometry after changing the number of lanes. #597 2021-04-09 14:35:49 -07:00
Dustin Carlino
584c1be9e0 A humble start to deleting lanes. #597 2021-04-09 14:35:49 -07:00
Dustin Carlino
c6906f6153 Change Vec<Lane> to BTreeMap<LaneID, Lane> to prepare for
adding/deleting lanes. #597

Not regenerating all maps yet. Haven't evaluated performance impact yet.
2021-04-09 14:35:49 -07:00
Dustin Carlino
b367fdcb27 Fix Road::get_half_polygon for left-hand driving. 2021-04-09 09:01:05 -07:00
Dustin Carlino
204d13177d Make the 15m tool respect access-restricted zones. 2021-04-08 10:28:52 -07:00
Dustin Carlino
3060f94989
Start a pathfinding v2 API. #555 (#596)
The v1 path that all callers need is available by transforming PathV2 to
v1. The plan is to now gradually change callers to natively use PathV2
instead.
2021-04-08 08:57:59 -07:00
Dustin Carlino
618fcdad62 Collapse some methods for creating walking paths. This is leftover from
before the zone pathfinding simplification. #555
2021-04-07 15:52:03 -07:00
Dustin Carlino
1b5d9d7108 Remove _broken_path_v2_to_v1 for now. #555 2021-04-07 15:06:47 -07:00
Dustin Carlino
defcbf1bb9 Just splitting the v1 PathStep, Path, PathRequest into a separate module, so the transition to pathfinding v2 is easier to understand. #555 2021-04-07 12:05:39 -07:00
Dustin Carlino
23132a16f8 Now that the old code to build and cost graphs for pathfindng v1 is deleted, rename the v2 methods. #555 2021-04-07 11:06:57 -07:00
Dustin Carlino
e471000395 Remove the old zone_cost method. #555 2021-04-07 11:04:42 -07:00
Dustin Carlino
da3272e2ee Convert the alternative path debugger to use directed roads, not lanes. #555
This lets us clean up some of the old pathfinding v1 code, removing some
duplicate code!

Also improve that debugger to show a different cost for each side of the
road. The cost to turn around and reach a building on the other side of
the road may be high, so this really makes the debugger more
understandable.
2021-04-07 10:58:48 -07:00
Dustin Carlino
b381856bd5 Convert the 15m biking isochrone to internally use directed roads, not lanes. #555 2021-04-07 10:18:26 -07:00
Dustin Carlino
ad5c573a27 Change congestion capping to pathfind avoiding roads, not lanes. #555
Capping only happens when you edit a road and introduce a per-hour
vehicle cap.
2021-04-07 10:04:00 -07:00
Dustin Carlino
918e74ceba Change the Dijkstra's and CH walking pathfinders to use roads, not lanes. #555
No behavioral change here; this is a trivial transformation. If a
directed road has any walkable lane, then there's exactly 1 of them.  I
verified by manually checking paths and also seeing prebaked results
having zero diff.
2021-04-06 20:16:45 -07:00
Dustin Carlino
196af2a1f4 Refactor: store Direction for a Lane, simplifying Lane->DirectedRoadID. #555 2021-04-06 17:03:24 -07:00
Dustin Carlino
d0c82392e3 Restore the lane-changing penalties for the pathfinding v2->v1 transition. #555 2021-04-06 17:03:24 -07:00
Dustin Carlino
b9b5f63eb0 Convert the contraction hierarchy vehicle pathfinding to use roads, not lanes. #555
Not regenerating yet.
2021-04-06 17:03:24 -07:00
Dustin Carlino
680fd07a83 Restore huge_seattle map, which was deleted without me noticing in da60de0a09, likely due to the elevation bug fixed in de20a74f3a28b3370319436d5655b5be6f13367d... 2021-04-06 10:32:07 -07:00
Dustin Carlino
3badd7dd09 Fix typo 2021-04-06 10:04:16 -07:00
Dustin Carlino
281aabc63a
Convert the Dijkstra's vehicle pathfinding implementation to use road… (#594) 2021-04-06 10:02:07 -07:00
Dustin Carlino
b6d46db2ea Create map_model abstractions for representing uber-turns at the granularity of roads, not lanes, in preparation for pathfinding v2. #555
I was about to recreate a higher-level turn abstraction, but realized we
previously made Movements for traffic signal editing.
2021-04-05 10:29:59 -07:00
Dustin Carlino
1e3708f9b4 Remove UberTurnGroup and the prototype of editing a cluster of traffic
signals using uber turn groups. #555

This was an old half-baked experiment for handling a cluster of traffic
signals.  Since then, merging intersections (by manually tagging them in
OSM for now, maybe automatically in the future) has proven better.

Removing this old code in preparation for pathfinding v2.
2021-04-05 10:05:27 -07:00
Dustin Carlino
da60de0a09 Adjust walking speed for inclines, using Tobler's hiking function. #82
Now regenerating everything...
2021-04-02 19:54:33 -07:00
Dustin Carlino
acdbe0e753 Start adjusting cyclist speed for inclines, both in simulation and pathfinding, using calcultions from Valhalla. #82
Not regenerating data yet.
2021-04-02 19:54:33 -07:00
Dustin Carlino
20de91bae7 Also refactor walking speeds. #82 2021-04-01 15:03:20 -07:00
Dustin Carlino
892afddcd5 Refactor uses of biking speed between the sim and pathfinding, in preparation for incorporating incline. #82
(This was a bigger mess than I expected, so worth doing separately.)
2021-04-01 11:52:25 -07:00
Dustin Carlino
05c9134e92 Stop using contraction hierarchies for trains / light rail. The graph is
always tiny; Dijkstra's is fine. It costs a bit of file size to store
it. The huge leeds map goes from 160MB to 157MB -- not crazy savings,
but something.

Also fix a slight bug with 92d3a890ea that
caused some pedestrians to uselessly visit a bus stop node while
routing. (southbank crashes a few hours in otherwise)
2021-03-25 20:45:57 -07:00
Dustin Carlino
92d3a890ea
Express all pathfinding costs in units of seconds. #82, #494 (#587)
This is simpler to reason about, allows the penalty for entering a zone
or taking an unprotected turn to be expressed in terms of a time
penalty, and is a step towards adjusting bike/foot routing for elevation
data.

When we later add things like "safety/quietness" for cycling, maybe we
can switch to using a (time, quietness) tuple, and transform into a
single number with a linear combination parameterized by that agent's
preference for time/safety. This change is compatible with that future
idea.

There are behavior changes here, particularly for zones and unprotected
turns. No new maps start gridlocking, and in fact, Rainier starts
working again.
2021-03-25 12:59:36 -07:00
Dustin Carlino
4ef04f5bd1 Change road incline calculations to be stored in RawMap. Previously, the
"rise / run" calculation used the trimmed road center-lines, which don't
match up with the elevation at each original intersection point.

Also handle infinity in the output and reduce the resolution of the
query from every 1m to every 5m.

Regenerate all maps due to the map format change. Try bringing in
elevation data for all of Seattle using the LIDAR source, since
the data quality assessed in eldang/elevation_lookups#12 seems to be
similar, and LIDAR is way faster than contours.
2021-03-23 22:47:52 -07:00
Dustin Carlino
162f09a887 Import Tripoli for WeCode Libya, also adding an Arabic font 2021-03-23 06:51:47 -07:00
Dustin Carlino
4a704e3172 Filter out highway=pedestrian, bicycle=dismount unless separate footpaths are enabled. Removes Portugal Place from Cambridge. cyipt/actdev#151
Now regenerate everything
2021-03-22 21:30:10 -07:00
Dustin Carlino
e57cacaab4 Rename pathfind/driving -> pathfind/vehicles to reflect bikes using it too, and likewise for driving_cost 2021-03-22 16:34:46 -07:00
Dustin Carlino
7d2e8409e8 Implement no-through-traffic zones instead by adding a huge cost to crossing into the zones. #555, #574
Regenerate all maps. Gridlock-wise, Rainier and Poundbury broke, but
Wallingford started working again. Acceptable cost for a change this
useful; I'll work on fixing those maps later.
2021-03-22 16:34:46 -07:00
Dustin Carlino
e6cf2d54bc Rip out all of the special code for pathfinding into/out of access-restricted zones.
There's a much simpler implementation, it transpires. #555, #574
2021-03-22 16:34:46 -07:00
Dustin Carlino
75b39c7b35 Add a debug tool to show the pathfinding costs to each node. Trying to figure out why a new impl of pathing through zones isn't working as expected. 2021-03-22 12:03:50 -07:00
Dustin Carlino
9d2da632be Add some disabled validation that paths don't enter an access-restricted zone when they shouldn't.
I'm working on an overhaul to pathfinding and zones in another branch,
and need some more debugging tools. This one's ready to be checked in
now.
2021-03-22 09:38:53 -07:00
Dustin Carlino
a68af804e3 Pick the entrance/exit to an access-restricted zone more intelligently. #574
Instead of just picking the intersectin closest to the origin or
destination, calculate the full path length, and take the one with the
shortest distance. This fixes some of the weird problems routing around
Broadmoor. Regenerate all prebaked data.

Also fix the original request for paths involving zones, so tracing it
later works.
2021-03-19 19:24:22 -07:00
Dustin Carlino
a0461e990d Workaround an issue with how the length of roads is measured and related
to the elevation measured at the original intersection point. #82

Upload montlake, downtown, and phinney with elevation data, as an
initial demo.
2021-03-18 19:04:15 -07:00
Dustin Carlino
b61291d905 Revive the elevation layer in the UI. Add some sanity checking around the inclines we're assigning to roads, but also, I realized a problem with how the elevation lookup not matching the trimmed roads. #82 2021-03-18 18:19:41 -07:00
Dustin Carlino
95b1d884cf Rename Map::new to be more clear that it should only be used in non-UI
tools. There's one place in the UI that doesn't work on the web!
2021-03-12 06:38:17 -08:00
Dustin Carlino
c6044fa54c Fix the debugging of map serialization sizes; Map::new isn't called
anymore, because of async map loading.
2021-03-11 19:46:09 -08:00
Dustin Carlino
f0de4e4583 Don't use Bezier curves for right/left turns at tiny intersections. They
wind up looping back on themselves in a nonsensical way, causing
vehicles to visually glitch when moving through.

This was started in 081819d86b, but it
used to gridlock 2 maps. All the recent roundabout fixes seems to have
resolved those! And adjusting offstreet parking for two maps.

But wallingford does regress; plunging forward for now.
2021-03-10 15:58:16 -08:00
Dustin Carlino
7e0f29fa9f Place stop signs at the entrances of roundabouts, so people already in there get precedence over new people entering. #75
This makes Poundbury run with baseline traffic, when previously it was
super gridlocked!
2021-03-08 20:43:48 -08:00
Dustin Carlino
350b75a8e5 Don't crash when tracing a path where the first step and request don't match. This happened for the LCID site when clicking on a building and finding nearest parking, because the buildings are in an access-restricted zone. 2021-03-07 11:06:32 -08:00
Dustin Carlino
d5d186dd37 Fix border arrows for left-handed maps. 2021-03-06 10:43:58 -08:00
Dustin Carlino
081819d86b ATTEMPT: Don't use Bezier curves for right/left turns at tiny
intersections. They wind up looping back on themselves in a nonsensical
way, causing vehicles to visually glitch when moving through.

This causes lakeslice and rainier to gridlock, due to the magic of
emergent behavior. I think I upstreamed an OSM fix for lakeslice, but I
need to work on rainier before enabling this code.
2021-03-01 18:30:24 -08:00
Dustin Carlino
c5cfe76b05 Fix turn type classification for four-way intersections that meet at
weird angles. This leads to really bad traffic signal heuristics, even
causing gridlock in Rainier Valley.
2021-03-01 10:57:27 -08:00
Dustin Carlino
bce3318605 Import halsnead for actdev. It needed a fix to not treat access=private
as a no-through-traffic zone for light rail tracks!
2021-02-27 14:35:26 -08:00
Dustin Carlino
9984648379 Treat bicycle=designated on footways the same as bicycle=yes. And update Seattle OSM data again to pick up my fixes from yesterday. #330 2021-02-27 13:01:37 -08:00
Dustin Carlino
3a63c11303 Treat footways that allow bikes the same as the other shared-use trails. #330
This gets most of the Burke (and other trails) imported, though there
are still some lingering connectivity problems.
2021-02-26 17:23:21 -08:00
Dustin Carlino
603717a560 Remove the separate_cycleways experiment flag. Always import cyclepaths
mapped as separate OSM ways in all maps!!! #330
2021-02-26 14:58:57 -08:00
Dustin Carlino
601d367c32 Import highway=track as a separate cycle+footway. We identified https://www.openstreetmap.org/way/842138587 that really affects the Poundbury site. 2021-02-25 12:59:48 -08:00
Dustin Carlino
5577021ee5 When merging intersections and preserving simple turn restrictions, pay
attention to which intersection is being destroyed. Fixes #527 --
montlake and phinney both look correct now.

Regenerating everything. Actually, Phinney now runs, so adding a 4th
prebaked map!!! But Rainier regressed -- there's an issue with the
signal heuristics that's now a problem; I'll fix later.
2021-02-24 15:16:12 -08:00
Dustin Carlino
b36ebec0b9 Penalize unprotected left turns at the routing layer. #494
I experimented on the Rainier Valley map, which recently started
gridlocking due to too many cars doing this, to tune the value. Got it
running again! The two other maps keep running, with some trips on
average getting a little slower.
2021-02-23 19:32:00 -08:00
Dustin Carlino
03989bf3a6 Don't allow u-turns on really short deadends. This problem started happening when more service roads were imported, and caused gridlock in lakeslice. This gets montlake and lakeslice running again, but rainier_valley remains gridlocked with service roads. 2021-02-22 14:48:49 -08:00
Dustin Carlino
6ceac88cbe Import most service roads, except driveways. #449
Added an extra step to classify service roads as running through a
parking lot, to prevent them from being treated as regular roads.

Had to fix up a few prebaked traffic signals. lakeslice falls back into
gridlock; will fix separately -- too much effort behind this change to
stop.
2021-02-21 18:27:34 -08:00
Dustin Carlino
5139a88a66 Also sort city districts by zorder when creating them from many maps. Noticed this issue in Leeds. 2021-02-19 10:26:51 -08:00
Dustin Carlino
64d150690a When building the contraction hierarchies for different vehicle types,
be more careful with nodes representing uber-turns. Even if that vehicle
type doesn't use an uber-turn, we still need to force the nodes to exist
and match up between input graphs.

Although this really only fixes gb/charleville_mezieres/secteur4, it
potentially affects all maps, because the node map changes. So
regenerate everything...
2021-02-17 14:17:27 -08:00
Dustin Carlino
1fa57a1e17 Import Charleville-Mézières. So many new places from Twitter!
Few workarounds based on importing crashes found.
2021-02-15 16:35:24 -08:00
Dustin Carlino
bc2767b89e Refactor lots of places that construct paths to the data/input dir, which is always organized by city. This would've made the previous change way easier. #326 2021-02-13 18:30:01 -08:00
Dustin Carlino
65b1f24d5d Automatically patch edits using the old MapName. And fix the 3
built-in proposals. #326
2021-02-13 17:01:24 -08:00
Dustin Carlino
39f5d50fcd The grand country split. #326
City names are now disambiguated by a two-letter country code. This
commit handles almost everything needed to make this transition. Main
next steps are fixing up map edits automatically and making the city
picker UI understand the extra level of hierarchy.

A little bit of fallout: lakeslice gridlocks again; this regression is
actually from the recent traffic signal changes, but I'm just now
regenerating everything. Will fix soon.
2021-02-13 15:45:59 -08:00
Dustin Carlino
03538faf3f
A few traffic signal cleanups: (#512)
- Stop alerting when slow pedestrians can't make it through the minimum
  crosswalk time
- Simpler iteration style in lagging_green.rs
- Totally delete the old brute force signal config code; it never worked
  well, and the improved heuristics eliminate the need for it anyway
- Make a Duration::max function and use it in one case
2021-02-12 15:10:32 -08:00
Dustin Carlino
aacc0fa4d5 Fix a crash that happens when you load edits that transformed a stop
sign into a traffic signal.

And fix a few cargo fmt issues
2021-02-12 13:47:10 -08:00
Bruce
6cb4cea624
Ts refactor (#511)
* Create module from make/traffic_signals.rs

Most things are in mod.rs, lagging_green and brute_force are moved into their own .rs files

* pull more into brute_force.rs
2021-02-11 18:24:17 -08:00
Bruce
121377467a
Lagging green (#510)
Add a template for lagging green

Lagging green is variable. Crosswalks are also variable.
convert_to_ped_scramble() is refactored to allow a call that doesn't promote yield to protected; as this could unintentionally extend a variable phase.
2021-02-11 13:21:26 -08:00
Dustin Carlino
68e406d26b Swap left/right turns when generating traffic signal policies in the UK.
Verified by trying the "four-stage" template at some intersections. Now
regenerating data.
2021-02-08 17:06:32 -08:00
Dustin Carlino
6f0751111e Derp, crosswalks on left-handed driving maps were always just outside the intersections. This made for some crazy traffic signals, since the crosswalk never conflicted with any turn.
Don't regenerate yet, because I have one more of these...
2021-02-08 16:50:17 -08:00
Dustin Carlino
73e405e382 Upgrade most dependencies 2021-02-03 18:13:06 -08:00
Dustin Carlino
ba2500c131 Create the path cost tuner. #237, #494
This lets you live-tune routing parameters, then see how it affects the
total number of routes that cross every road, relative to the baseline
of the original parameters. We can also use it in the future to do the
same thing, comparing before/after some map edits.
2021-02-03 11:34:15 -08:00
Dustin Carlino
a2b4dcb64f Store RoutingParams in the Map. Add a method for the debug UI to override the defaults, rebuilding the CHs. This is in preparation for #237, and part of #494 2021-02-03 10:59:02 -08:00
Dustin Carlino
32bcfbe738 Plumb in the tuned routing params. When they're not the defaults, automatically fallback from CH to Dijkstra's. #494 2021-02-02 15:20:06 -08:00
Dustin Carlino
3e40686a6b Fix a bunch of links after the repository renaming. 2021-01-31 15:50:48 -08:00
Dustin Carlino
341ce834e3 Based on startup params, display an extra 'study area' on the map. cyipt/actdev#44 2021-01-27 13:00:48 -08:00
Bruce
cf5ce637f3
Skip all-walk if no demand (#442)
* Skip all-walk if no demand

If you create an all-walk stage and make it adaptive, if there is no demand it will be skipped. Fixed crosswalks are never skipped, as they may be necessary for queue management.
2021-01-27 11:13:19 -08:00
Dustin Carlino
37a25c0fcb Improve turn type classification. Really sharp turns get classified as
u-turns, but recently, they're forced to left turns if the road names
don't match. Now be more specific and revert either a left or right
turn.

This fixes up https://www.openstreetmap.org/node/53089011, which now
acts like a 4-way intersection for signal heuristics!

Not regenerating everything yet.
2021-01-27 09:28:12 -08:00
Dustin Carlino
92b1f92d54 Define a second ranking for roads, beyond the 3 tiers. Just use for the NACTO max cycle length heuristic. #446 2021-01-26 14:39:17 -08:00
Dustin Carlino
cad336d493 Tighten up the definition of u-turns, requiring the from/to road names
to match.

Originally these were introduced to deal with merging intersections
between dual carriageways. But inadvertently, lots of left turns got
reclassified as u-turns. That's caused various headaches, most recently
the lakeslice gridlock. That's fixed again!
2021-01-25 17:19:48 -08:00