相较上一版 Jacobian 确定性复用更新,本次补齐事件边界一致性、结果两侧采样及接触事件定位;保留已有物性复用和组件力学公式。 - 统一 UD00 信号求值与下一事件查询的绝对时间边界,修复循环边界浮点舍入导致的阶段错位、重复或漏报,并覆盖零时长、多阶段及长周期场景。 - 引入原生输出语义 v2:保留规则网格真实时间,补充内部时间事件和状态事件的左邻及事件后采样,按保存时间、状态和离散模式重放结果。 - 两条代码生成路径均发出 LSTP 接触描述,默认定位间隙过零及非负力模式的力截断;仅在接受事件时更新防重复记录,增加 contactEvents 诊断计数。 - 补充 MASS/LSTP 独立事件实验、八路全曲线与驱动阶段配对评估,以及 Amesim 不连续点输出对照和力差定位报告;MASS 新增释放机制仍保留为独立实验。 - 保存局部 probe、context 访问与回退、shadow replay、R288 real skip/typed replay 及阀门数值尾部诊断工具和报告;未证明净收益的实验不启用为生产默认优化。 - 更新原生运行说明和元件建模规范,补充信号边界、输出语义、接触事件和实验依赖回归测试。 验证:五组专项回归共 34 项全部通过;37 个待提交 Python 文件语法检查通过;git diff --cached --check 通过。
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
"""Negative checks of the evidence validator (not a production reuse guard)."""
|
|
from copy import deepcopy
|
|
import json
|
|
import analyze_context_access as ax
|
|
|
|
|
|
def rejected(events):
|
|
try:
|
|
ax.analyze_operation(events)
|
|
except AssertionError:
|
|
return True
|
|
return False
|
|
|
|
|
|
def main():
|
|
examples=json.loads((ax.OUT/'jacobian-200.json').read_text(encoding='utf-8'))
|
|
original=next(x['events'] for x in examples if x['summary']['group']==6)
|
|
assert ax.analyze_operation(original)['replayExact']
|
|
results={}
|
|
|
|
events=deepcopy(original)
|
|
index=next(i for i,e in enumerate(events) if e['event']=='write' and e.get('domain')=='pipes' and e.get('field')=='cache->valid')
|
|
del events[index]
|
|
results['omitted_equal_value_pipe_valid_store']=rejected(events)
|
|
|
|
events=deepcopy(original)
|
|
event=next(e for e in events if e['event']=='read' and e.get('field')=='s->rho')
|
|
event['value']='0000000000000000'
|
|
results['wrong_consumed_rho']=rejected(events)
|
|
|
|
events=deepcopy(original)
|
|
event=next(e for e in events if e['event']=='allocate')
|
|
event['slot']-=1
|
|
results['baseline_slot_used_for_shifted_append']=rejected(events)
|
|
|
|
events=deepcopy(original)
|
|
event=next(e for e in events if e['event']=='write' and e.get('field')=='cache->count')
|
|
event['value']=(13).to_bytes(8,'little').hex()
|
|
results['restored_baseline_count']=rejected(events)
|
|
|
|
events=deepcopy(original)
|
|
event=next(e for e in events if e['event']=='match')
|
|
event.update(hit=True,slot=0)
|
|
results['wrong_first_match']=rejected(events)
|
|
|
|
events=deepcopy(original)
|
|
event=next(e for e in events if e['event']=='valid_test' and e['mask']==8)
|
|
event['value']=8
|
|
results['wrong_valid_bit_result']=rejected(events)
|
|
|
|
assert all(results.values()), results
|
|
(ax.OUT/'negative-checks.json').write_text(json.dumps(results,indent=2)+'\n',encoding='utf-8')
|
|
print(json.dumps(results,indent=2))
|
|
|
|
|
|
if __name__=='__main__':main()
|