chronaxis.execution.transform_window
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""保留一个变换所需的有限真实记录区间,按原端点裁剪滚动窗口。23actual 以实际纳秒度量历史。fixed/dbc 每对真实驱动贡献一个周期,网格4在该对内部按实际经过比例取权重。只存原起止、值和有效截止,不存第二条5累计时间轴,也不为整个观测域预生成网格。缓存由执行者的共享预算预付。6"""78from collections import deque9from dataclasses import dataclass10from fractions import Fraction11from ..results.budget import _reserve_owned_ram, _release_owned_ram121314@dataclass(frozen=True, slots=True)15class TransformSpan:16 """保存一个已确定右端的保持区间;更新标志区分真实输入点与普通调度边界。"""17 start: int18 end: int19 value: object20 deadline: int | None21 update: bool22 point: object23 pair_width: int | None = None # 异步实测间隔所属原驱动对的实际跨度,不是第二个时间坐标。242526def first_grid(start, origin, step):27 """找不早于起点的首个原点网格。参数: 三个整数ns。返回: 整数ns。异常: 步长非正。"""28 if step <= 0:29 raise ValueError('网格步长须为正')30 return origin + ((start-origin+step-1)//step)*step313233class TransformWindow:34 """仅持有最近窗口及其左边界所在原区间。按实际容量付费,关闭可重复。"""3536 def __init__(self,budget,window_ns,period_ns):37 """参数: 共享预算、历史窗口和可选原记录周期。返回: owner。异常: 非法窗口。"""38 self._budget,self.window,self.period=budget,window_ns,period_ns39 self._held_cost=self._span_cost=040 self.spans=deque()41 self.weight=04243 def append(self,span):44 """记录已确定的真实区间。参数: TransformSpan。返回: 无。异常: 端点不连续或预算不足。"""45 if span.end<=span.start or self.spans and span.start!=self.spans[-1].end:46 raise ValueError('变换历史必须由连续正区间组成')47 _reserve_owned_ram(self,1024,'_span_cost')48 self.spans.append(span)49 self.weight+=self._weight(span)5051 def _weight(self,span):52 """将真实子段按原驱动对比例折算。参数: 原子段。返回: 有理数纳秒。异常: 非正驱动跨度。"""53 length=span.end-span.start54 return Fraction(self.period*length,span.pair_width or length) if self.period is not None else length5556 def trim(self):57 """全部不晚于最新区间右端的网格均消费后逐出旧历史。参数: 无。返回: 无。异常: 退款失败。"""58 while self.spans:59 first=self.spans[0]60 weight=self._weight(first)61 if self.weight-weight<self.window:62 break63 self.spans.popleft()64 self.weight-=weight65 _release_owned_ram(self,1024,'_span_cost')6667 def slices(self,time):68 """倒序遍历网格左侧窗口。参数: 实际整数ns。返回: (原区间,裁剪左/右,权重倍率)流。异常: 结构错误。"""69 remaining=Fraction(self.window)70 for span in reversed(self.spans):71 right=min(time,span.end)72 if right<=span.start:73 continue74 ratio=self._weight(span)/Fraction(span.end-span.start)75 amount=min(remaining,(right-span.start)*ratio)76 yield span, right-amount/ratio, right, ratio77 remaining-=amount78 if not remaining:79 break8081 def close(self):82 """丢弃窗口与预算。参数: 无。返回: 无。异常: 退款失败可重试。"""83 self.spans.clear()84 _release_owned_ram(self,self._span_cost,'_span_cost')85