修复循环信号与事件采样并接入 LSTP 接触定位,补充八路验证及复用实验
相较上一版 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 通过。
This commit is contained in:
1 parent
1aac220084
commit
7611f13208
85 files changed
+11358
-33
No files matched your search
@@ -0,0 +1,45 @@
|
||||
"""Conservative-graph contracts of the opt-in manual local-probe experiment."""
|
||||
import importlib.util
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
from types import SimpleNamespace
|
||||
from app.simulation.native_codegen.jacobian import StateDependencies
|
||||
|
||||
spec=importlib.util.spec_from_file_location('local_probe_experiment',Path(__file__).parent/'manual/local_probe_experiment.py')
|
||||
experiment=importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(experiment)
|
||||
|
||||
class LocalProbeDependenciesTests(unittest.TestCase):
|
||||
def test_unknown_leaf_taints_every_state_and_transitive_consumer(self):
|
||||
d=StateDependencies(3);d.assign('p[0]',{'unregistered_context'});d.assign('q[0]',{'p[0]'})
|
||||
masks,unknown=experiment.dependency_masks(d)
|
||||
self.assertEqual(unknown,{'unregistered_context'})
|
||||
self.assertEqual(masks['q[0]'],0b111)
|
||||
|
||||
def test_union_of_branch_writes_is_preserved(self):
|
||||
d=StateDependencies(3);d.assign('w[0]',{'y[0]'});d.assign('w[0]',{'y[2]'})
|
||||
d.assign('q[0]',{'w[0]'})
|
||||
masks,_=experiment.dependency_masks(d)
|
||||
self.assertEqual(masks['q[0]'],0b101)
|
||||
|
||||
def test_projected_state_coupling_reaches_downstream_equations(self):
|
||||
d=StateDependencies(3);d.project_states([0,1]);d.assign('p[0]',{'y[0]'})
|
||||
d.assign('dy[2]',{'p[0]'})
|
||||
masks,_=experiment.dependency_masks(d)
|
||||
self.assertEqual(masks['dy[2]'],0b011)
|
||||
|
||||
def test_dependency_cycle_conservatively_reaches_fixed_point(self):
|
||||
d=StateDependencies(3);d.assign('p[0]',{'q[0]','y[0]'})
|
||||
d.assign('q[0]',{'p[0]','y[2]'})
|
||||
masks,_=experiment.dependency_masks(d)
|
||||
self.assertEqual(masks['p[0]'],0b101)
|
||||
self.assertEqual(masks['q[0]'],0b101)
|
||||
|
||||
def test_experiment_refuses_to_slice_cyclic_schedule(self):
|
||||
d=StateDependencies(2);d.expression('dy[0]','y[0]');d.expression('dy[1]','y[1]')
|
||||
program=SimpleNamespace(manifest=lambda:{'jacobianStructure':{'reuse':{'enabled':True}}})
|
||||
saved={'dependencies':d,'schedule':SimpleNamespace(blocks=[SimpleNamespace(cyclic=True)])}
|
||||
with self.assertRaisesRegex(ValueError,'rejects SCCs'):
|
||||
experiment.generate(program,saved)
|
||||
|
||||
if __name__=='__main__':unittest.main()
|
||||
Reference in new issue
Block a user