Chronaxis用户手册English
本页目录

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
Chronaxis 用户手册 · 离线阅读