[planner] cache primitive offers

This commit is contained in:
Jan Petykiewicz 2026-07-09 10:36:00 -07:00
commit b6c222cdc2

View file

@ -288,6 +288,10 @@ class Solver:
def __init__(self, request: RouteRequest) -> None: def __init__(self, request: RouteRequest) -> None:
self.request = request self.request = request
self.eval_cache: dict[tuple[int, float, str | None, str | None, str, str, PrimitiveKind | None], SelectedPrimitive] = {} self.eval_cache: dict[tuple[int, float, str | None, str | None, str, str, PrimitiveKind | None], SelectedPrimitive] = {}
self.offer_cache: dict[
tuple[PrimitiveKind, str | None, str | None, tuple[tuple[str, Any], ...]],
tuple[PrimitiveOffer, ...],
] = {}
self.order = 0 self.order = 0
def solve(self) -> Candidate: def solve(self) -> Candidate:
@ -384,7 +388,18 @@ class Solver:
kwargs.pop('out_ptype', None) kwargs.pop('out_ptype', None)
if extra: if extra:
kwargs.update(extra) kwargs.update(extra)
return self.request.tool.primitive_offers(kind, in_ptype=in_ptype, out_ptype=out_ptype, **kwargs) try:
cache_key = (kind, in_ptype, out_ptype, tuple(sorted(kwargs.items())))
hash(cache_key)
except TypeError:
return self.request.tool.primitive_offers(kind, in_ptype=in_ptype, out_ptype=out_ptype, **kwargs)
cached = self.offer_cache.get(cache_key)
if cached is not None:
return cached
offers = self.request.tool.primitive_offers(kind, in_ptype=in_ptype, out_ptype=out_ptype, **kwargs)
self.offer_cache[cache_key] = offers
return offers
def evaluate( def evaluate(
self, self,