significantly improve performance by only refreshing market values when needed

This commit is contained in:
Olivia Appleton 2022-10-23 02:34:37 -04:00
parent 06333af0e9
commit c55587eb57
3 changed files with 10 additions and 3 deletions

View File

@ -113,7 +113,7 @@ daemon:
quiet_daemon:
@while [ 1 ]; do\
$(MAKE) run $(MFLAGS);\
sleep 1800;\
sleep 21600;\
done;
.PHONY: build

View File

@ -36,7 +36,7 @@ class Market(DictDeserializable):
"""Represent a market and its corresponding rules.
Events
======
------
before_check(market: Market):
after_check(market: Market):
Called before/after a market is checked. Please don't put anything intensive in here.
@ -94,7 +94,6 @@ class Market(DictDeserializable):
"""Rebuild sensitive/non-serializable state after retrieving from database."""
self.__dict__.update(state)
self.client = get_client()
self.market = self.client.get_market_by_id(self.market.id)
if not hasattr(self, "event_emitter"):
self.event_emitter = EventEmitter()
self.event_emitter._lock = Lock()
@ -104,6 +103,10 @@ class Market(DictDeserializable):
def id(self) -> str:
"""Return the ID of a market as reported by Manifold."""
return self.market.id
def refresh(self) -> None:
"""Ensure market data is recent."""
self.market = self.client.get_market_by_id(self.market.id)
@property
def status(self) -> MarketStatus:

View File

@ -26,6 +26,7 @@ class ThisMarketClosed(AbstractRule[bool]):
_explainer_stub: ClassVar[str] = "If this market reaches its close date"
def _value(self, market: Market) -> bool:
market.refresh()
assert market.market.closeTime is not None
return bool(market.market.closeTime < time() * 1000)
@ -37,6 +38,7 @@ class CurrentValueRule(AbstractRule[AnyResolution]):
_explainer_stub: ClassVar[str] = "Resolves to the current market value"
def _value(self, market: Market) -> float | dict[Any, float]:
market.refresh()
if market.market.outcomeType == Outcome.BINARY:
assert market.market.probability is not None
return market.market.probability * 100
@ -62,6 +64,7 @@ class FibonacciValueRule(Rule[Union[float, Mapping[int, float]]]):
min_rewarded: float = 0.0001
def _value(self, market: Market) -> float | dict[int, float]:
market.refresh()
items = market_to_answer_map(market, self.exclude, (lambda id_, probability: probability < self.min_rewarded))
rank = sorted(items, key=items.__getitem__)
ret = {item: fib for item, fib in zip(rank, fibonacci())}
@ -98,6 +101,7 @@ class PopularValueRule(Rule[Union[MultipleChoiceResolution, FreeResponseResoluti
size: int = 1
def _value(self, market: Market) -> FreeResponseResolution | MultipleChoiceResolution:
market.refresh()
answers = market_to_answer_map(market)
final_answers: dict[int, float] = {}
try: