Zannick / logic-graph

Tools for video game logic representation and analysis, particularly routing and beatability checks for speedruns and randomizers.
MIT License
3 stars 0 forks source link

Early stages have no arborescence #127

Closed Zannick closed 8 months ago

Zannick commented 8 months ago

An AV2 run without a route provided found a greedy route and then exited early (and crashed due to #126). While looking into this to write up here, I noticed the start state has a time estimate of 1073741824, which is 1 << 30, which should come from https://github.com/Zannick/logic-graph/blob/679a0f47ef97ceaaaa9f800dc09261ecd8bf34f9/analyzer/src/estimates.rs#L198-L201

Likely this means we are missing some edges in the steiner process, causing there to be no arborescence we can use for an estimate. The "sufficiently large number" is then much higher than the current limit. This could also explain why previous runs seemed to start with nothing below progress level 15 (now 16).

Zannick commented 8 months ago

This is the step at which we start having a real estimate:

== 44. * Collect Flask from Amagi > West Lake > Cavern Tear Duct > Remote Flask ==
  Move... to Amagi > West Lake > Cavern Refill Station
  Move... to Amagi > West Lake > Cavern Tear Duct
* Collect Flask from Amagi > West Lake > Cavern Tear Duct > Remote Flask
position: Amagi__West_Lake__Cavern_Rear_Pillar → Amagi__West_Lake__Cavern_Tear_Duct
flasks: 6 → 7
Flask: +1
Skipped: Amagi > West Lake > Cavern Eye > Item
Visited: Amagi > West Lake > Cavern Tear Duct > Remote Flask
Visits: +1
Skips: +1
est=161759

This is the last flask needed for the current objective. So, perhaps one of the edges involved is missing in the steiner graph (base_distances), or we've messed up the canon setup somehow, or a certain count of the same item doesn't work in the steiner graph...

Zannick commented 8 months ago

Ah, this is because the shortest paths algorithm we use fails if any of our required locations is inaccessible... so as long as we haven't reached the needed number of duplicates of an item, if any location of that item is inaccessible, we give up. And for Flask that means simply that we added some Flasks to the total graph that we can't reach yet.