|
|
""" |
|
|
Time Manager for Nexus-Core |
|
|
Simplified adaptive time control |
|
|
""" |
|
|
|
|
|
import time |
|
|
from typing import Optional |
|
|
|
|
|
|
|
|
class TimeManager: |
|
|
"""Adaptive time allocation for searches""" |
|
|
|
|
|
def __init__(self): |
|
|
self.start_time = 0.0 |
|
|
self.allocated_time = 0.0 |
|
|
self.hard_limit = 0.0 |
|
|
self.move_overhead = 0.050 |
|
|
|
|
|
def allocate_time( |
|
|
self, |
|
|
time_left: float, |
|
|
increment: float = 0.0, |
|
|
moves_to_go: Optional[int] = None, |
|
|
move_number: int = 1 |
|
|
) -> tuple[float, float]: |
|
|
"""Calculate time allocation""" |
|
|
|
|
|
|
|
|
emergency_reserve = min(2.0, time_left * 0.1) |
|
|
available_time = max(0, time_left - emergency_reserve - self.move_overhead) |
|
|
|
|
|
|
|
|
if moves_to_go: |
|
|
expected_moves = moves_to_go |
|
|
else: |
|
|
expected_moves = max(20, 40 - move_number // 2) |
|
|
|
|
|
|
|
|
base_time = available_time / expected_moves |
|
|
increment_bonus = increment * 0.8 |
|
|
|
|
|
|
|
|
soft_limit = base_time + increment_bonus |
|
|
|
|
|
|
|
|
hard_limit = min( |
|
|
soft_limit * 3.0, |
|
|
available_time * 0.5 |
|
|
) |
|
|
|
|
|
|
|
|
soft_limit = max(soft_limit, 0.1) |
|
|
hard_limit = max(hard_limit, soft_limit) |
|
|
|
|
|
return soft_limit, hard_limit |
|
|
|
|
|
def start_search(self, allocated_time: float, hard_limit: float): |
|
|
"""Initialize timer""" |
|
|
self.start_time = time.time() |
|
|
self.allocated_time = allocated_time |
|
|
self.hard_limit = hard_limit |
|
|
|
|
|
def should_stop(self, depth: int, best_move_stable: bool = False) -> bool: |
|
|
"""Check if should stop""" |
|
|
elapsed = time.time() - self.start_time |
|
|
|
|
|
|
|
|
if elapsed >= self.hard_limit: |
|
|
return True |
|
|
|
|
|
|
|
|
if elapsed >= self.allocated_time: |
|
|
if best_move_stable or depth >= 4: |
|
|
return True |
|
|
|
|
|
return False |
|
|
|
|
|
def elapsed(self) -> float: |
|
|
"""Get elapsed time""" |
|
|
return time.time() - self.start_time |
|
|
|
|
|
def remaining(self) -> float: |
|
|
"""Get remaining time""" |
|
|
return max(0, self.allocated_time - self.elapsed()) |