It would be great if uv would expose a dedicated set of types and methods to allow users to implement their own solver loop if they so choose. This interface comes with caveats, most notably that you have to uphold pubgrub's invariants about the order of operations yourself.
In uv, we run our own solver loop (https://github.com/astral-sh/uv/blob/8596525d97e3e0d9b6981f7e122334bfc9f712c8/crates/uv-resolver/src/resolver/mod.rs#L317). This gives us async support, allows moving the solver into a thread, do advanced prefetching based on decisions, splitting resolutions on conflicting requirements for disjoint environments, etc.; overall we do it because we need that level of control with the complexity and performance requirements that uv has.
It would be great if uv would expose a dedicated set of types and methods to allow users to implement their own solver loop if they so choose. This interface comes with caveats, most notably that you have to uphold pubgrub's invariants about the order of operations yourself.