mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-09 14:03:42 +08:00
224 lines
14 KiB
Python
224 lines
14 KiB
Python
"""Strict restore declaration/dispatch units; no fabricated replay qualification."""
|
|
from dataclasses import asdict, replace
|
|
from types import SimpleNamespace
|
|
from unittest import mock
|
|
import base64
|
|
|
|
import pytest
|
|
|
|
from openpilot.starpilot.flm.canonical_surface_adapter import GROUPS
|
|
from openpilot.starpilot.flm.clipping_quality import (
|
|
FIXED_MAP_IDENTIFICATION, NATIVE_SHADOW_IDENTIFICATION, QUALIFIED_EVENT_CLIPPING_QUALITY,
|
|
RESTORE_ACTIVATION_VERSION, event_clipping_quality,
|
|
)
|
|
from openpilot.starpilot.flm.controller_replay import pack_primitive_snapshot
|
|
from openpilot.starpilot.flm.event_activation import activation_from_dict, activation_matches_model, activation_model_from_dict, bind_activation_model
|
|
from openpilot.starpilot.flm.event_controller_replay import EventControllerReplay
|
|
from openpilot.starpilot.flm.event_fit_factory import fit_event_snapshot
|
|
from openpilot.starpilot.flm.event_objective import EffectObjective
|
|
from openpilot.starpilot.flm.event_restore_fit import _fixed_restore_rollout
|
|
from openpilot.starpilot.flm.learner_factory import fit_snapshot
|
|
from openpilot.starpilot.flm.restore_activation import (
|
|
WholeMapRestorePlan, restore_envelope_digest, restore_plan_from_dict, restore_plan_matches,
|
|
)
|
|
from openpilot.starpilot.flm.selected_effects import EffectRestoreTrial, EffectRestoreAblationTrial
|
|
from openpilot.starpilot.flm.tests.test_event_activation import fitted_model, primitive_plan
|
|
from openpilot.starpilot.flm.tests.test_history_parent import parent, saved_prior
|
|
from openpilot.starpilot.flm.torque_adapter import Objective
|
|
|
|
|
|
def envelope():
|
|
owner = parent()
|
|
owner.install_full_prior(saved_prior(owner.envelope))
|
|
return owner.restore_envelope
|
|
|
|
|
|
def payload():
|
|
restored = envelope()
|
|
objective = EffectObjective('ff.left', restored.trial_names, restored.trial_anchor, restored.context_key)
|
|
return {'version': 1, 'family': 'torque', 'event_version': 4, 'event_operation': 'restore',
|
|
'event_restore_policy': RESTORE_ACTIVATION_VERSION, 'event_identification_policy': FIXED_MAP_IDENTIFICATION,
|
|
'event_clipping_quality': QUALIFIED_EVENT_CLIPPING_QUALITY, 'effect_envelope': asdict(restored),
|
|
'event_objective': asdict(objective), 'objective': asdict(Objective('feedforward', 'high', 'steady'))}
|
|
|
|
|
|
def plan_for(restored):
|
|
model = fitted_model()
|
|
base = primitive_plan(model)
|
|
return WholeMapRestorePlan(
|
|
version=RESTORE_ACTIVATION_VERSION, identity=base.identity,
|
|
baseline_revision=restored.selected_baseline_revision, source_epoch=restored.source_epoch, physical_context=base.physical_context,
|
|
calibration_train_blocks=base.calibration_train_blocks, calibration_heldout_blocks=base.calibration_heldout_blocks,
|
|
cutoff_ns=2_005_000_000, stage_blocks=base.stage_blocks,
|
|
windows=((2_000_000_000, 2_020_000_000, 2_010_000_000, 2_010_000_000),),
|
|
restore_envelope_sha256=restore_envelope_digest(restored)).validate()
|
|
|
|
|
|
def test_restore_only_payload_has_no_shadow_or_operation_fallback():
|
|
original = payload()
|
|
assert event_clipping_quality(original) == QUALIFIED_EVENT_CLIPPING_QUALITY
|
|
for change in ({'event_operation': 'trial'}, {'event_version': 3}, {'event_restore_policy': 'unknown'},
|
|
{'event_identification_policy': NATIVE_SHADOW_IDENTIFICATION}, {'event_clipping_quality': 'recorded-debt-v1'}):
|
|
with pytest.raises(ValueError):
|
|
event_clipping_quality({**original, **change})
|
|
for key in ('event_restore_policy', 'event_identification_policy', 'event_clipping_quality'):
|
|
with pytest.raises(ValueError):
|
|
event_clipping_quality({name: value for name, value in original.items() if name != key})
|
|
|
|
|
|
def test_restore_plan_model_full_envelope_and_strict_decode_binding():
|
|
restored = envelope()
|
|
plan = plan_for(restored)
|
|
model = bind_activation_model(fitted_model(), plan)
|
|
assert plan.identification_policy == FIXED_MAP_IDENTIFICATION
|
|
assert restore_plan_matches(plan, restored)
|
|
assert restore_plan_from_dict(asdict(plan)) == plan
|
|
assert activation_matches_model(plan, activation_model_from_dict(asdict(model)))
|
|
with pytest.raises(ValueError):
|
|
activation_from_dict(asdict(plan))
|
|
for change in ({'version': 'unknown'}, {'restore_envelope_sha256': ''}, {'extra': 1}):
|
|
with pytest.raises((ValueError, TypeError)):
|
|
restore_plan_from_dict({**asdict(plan), **change})
|
|
assert not activation_matches_model(primitive_plan(fitted_model()), model)
|
|
with pytest.raises(ValueError):
|
|
restore_envelope_digest(replace(restored, restore_transaction_sha256='0' * 64))
|
|
assert not restore_plan_matches(replace(plan, restore_envelope_sha256='1' * 64), restored)
|
|
|
|
|
|
def test_actual_child_and_outer_factory_dispatch_restore_v4_without_fd():
|
|
row = payload()
|
|
restored = envelope()
|
|
replay = {'baseline_revision': restored.selected_baseline_revision}
|
|
expected = {'status': 'collecting', 'reason': 'fixed-eight-not-supported'}
|
|
factory = SimpleNamespace(cp=SimpleNamespace(lateralTuning=SimpleNamespace(which=lambda: 'torque')))
|
|
row['replay'] = pack_primitive_snapshot(replay)
|
|
wrapped = {'version': 1, 'family': 'torque', 'snapshot_b64': base64.b64encode(pack_primitive_snapshot(row)).decode()}
|
|
with mock.patch('openpilot.starpilot.flm.learner_factory.factory_from_snapshot', return_value=(factory, None)), \
|
|
mock.patch('openpilot.starpilot.flm.evidence_noise.reject_noisy_job', return_value=None), \
|
|
mock.patch('openpilot.starpilot.flm.event_fit_factory.ControllerReplay.from_snapshot'), \
|
|
mock.patch('openpilot.starpilot.flm.event_fit_factory.EventControllerReplay') as engine, \
|
|
mock.patch('openpilot.starpilot.flm.event_restore_fit.prepare_fixed_restore_calibration', return_value=expected) as prepare, \
|
|
mock.patch('openpilot.starpilot.flm.event_restore_fit.fit_event_restore') as fit:
|
|
assert fit_snapshot(wrapped) == expected
|
|
assert prepare.call_count == 1 and fit.call_count == 0
|
|
engine.return_value.rebuild_causal_features.assert_not_called()
|
|
with pytest.raises(ValueError):
|
|
fit_event_snapshot({**row, 'event_operation': 'trial'}, factory, replay)
|
|
|
|
|
|
def replay_fixture():
|
|
restored = envelope()
|
|
objective = EffectObjective('ff.left', restored.trial_names, restored.trial_anchor, restored.context_key)
|
|
plan = plan_for(restored)
|
|
frames = tuple(SimpleNamespace(control_ns=2_000_000_000 + index * 10_000_000, frame_sequence=index + 1,
|
|
effect_prepare_ns=2_000_000_000 + index * 10_000_000, effect_trace=None,
|
|
applied_coordinates=(0.,), centre_values=(0., 0.), actual_stage_residual=None,
|
|
selected_command=0., actual_lac_command=0., inputs=(), torque_values=()) for index in range(3))
|
|
emissions = SimpleNamespace(rollout=mock.Mock(return_value=dict.fromkeys(range(3), 0.)))
|
|
original = SimpleNamespace(failed=False, raw_mode=True, identity=plan.identity,
|
|
baseline_revision=plan.baseline_revision, replay_windows=((2_000_000_000, 2_020_000_000),), records=frames,
|
|
factory=SimpleNamespace(create=lambda: (object(), object())), checkpoints=((2_000_000_000, object()),),
|
|
objective=Objective('feedforward', 'high', 'steady'), emissions=emissions, _frame_context=lambda frame: True)
|
|
engine = EventControllerReplay(original, objective, restored.replay_anchor(), restore_envelope=restored, activation_plan=plan)
|
|
return engine, restored, frames, emissions
|
|
|
|
|
|
def test_fullmap_and_groupoff_share_exact_neutral_prefix_and_strict_policy():
|
|
engine, restored, frames, emissions = replay_fixture()
|
|
coordinates = tuple(dict(restored.coordinates)[name] for name in engine.objective.names)
|
|
for omitted in (None, GROUPS['ff.left']):
|
|
seen = []
|
|
def run(*args, effect_trial=None, seen_sources=seen, **kwargs):
|
|
seen_sources.append(effect_trial)
|
|
return 0., SimpleNamespace(saturated=False)
|
|
with mock.patch('openpilot.starpilot.flm.event_controller_replay._run', side_effect=run), \
|
|
mock.patch('openpilot.starpilot.flm.event_controller_replay.restore_snapshot'):
|
|
engine._rollout(coordinates, restore_target=True, restore_omit_group=omitted)
|
|
assert seen[0] is None
|
|
expected = EffectRestoreTrial if omitted is None else EffectRestoreAblationTrial
|
|
assert all(type(source) is expected for source in seen[1:])
|
|
assert emissions.rollout.call_args.kwargs == {'quality_contract': QUALIFIED_EVENT_CLIPPING_QUALITY}
|
|
with pytest.raises(ValueError, match='restoration requires'):
|
|
engine.rebuild_causal_features()
|
|
with pytest.raises(ValueError, match='scope/policy'):
|
|
engine._rollout(coordinates, _identification_token=engine._EventControllerReplay__identification_token)
|
|
with pytest.raises(ValueError, match='active exact canonical group'):
|
|
engine._rollout(coordinates, restore_target=True, restore_omit_group=GROUPS['center'])
|
|
with pytest.raises(ValueError, match='operation/transaction'):
|
|
EventControllerReplay(engine.engine, engine.objective, restored.replay_anchor(),
|
|
restore_envelope=restored, activation_plan=primitive_plan(fitted_model()))
|
|
frames[1].effect_prepare_ns -= 1
|
|
with mock.patch('openpilot.starpilot.flm.event_controller_replay._run', return_value=(0., SimpleNamespace(saturated=False))), \
|
|
mock.patch('openpilot.starpilot.flm.event_controller_replay.restore_snapshot'), \
|
|
pytest.raises(ValueError, match='prepare clock changed'):
|
|
engine._rollout(coordinates, restore_target=True)
|
|
|
|
|
|
def test_strict_native_refusal_is_truthful_v4_report_and_v2_still_raises():
|
|
engine, _, _, _ = replay_fixture()
|
|
with mock.patch.object(engine, '_rollout', side_effect=ValueError('candidate encoder clipping regression')):
|
|
report = _fixed_restore_rollout(payload(), engine, (0.,), restore_target=True)
|
|
assert report['profile'] is report['validation'] is None
|
|
assert report['replay_phase'] == 'full-map' and 'clipping regression' in report['replay_reason']
|
|
with pytest.raises(ValueError, match='clipping regression'):
|
|
_fixed_restore_rollout({'event_version': 2}, engine, (0.,), restore_target=True)
|
|
|
|
|
|
def test_plan_binds_nonmarker_fullmap_source_reset_cp_and_signed_zero():
|
|
from openpilot.starpilot.flm.canonical_surface_adapter import full_profile_sha256
|
|
from openpilot.starpilot.flm.full_surface_profile import restore_transaction
|
|
restored = envelope()
|
|
plan = plan_for(restored)
|
|
changes = ({'cp_sha256': '8' * 64}, {'reset_generation': '1'},
|
|
{'source_epoch': '7' * 64, 'context_key': '7' * 64})
|
|
for change in changes:
|
|
changed = replace(restored, **change)
|
|
changed = replace(changed, restore_transaction_sha256=restore_transaction(changed)).validate()
|
|
assert not restore_plan_matches(plan, changed)
|
|
for value in (.005, -0.):
|
|
coordinates = tuple((name, value if name == 'ff_gain_right' else old) for name, old in restored.coordinates)
|
|
digest = full_profile_sha256(restored.selected_baseline_revision, coordinates)
|
|
changed = replace(restored, coordinates=coordinates, full_profile_sha256=digest, history_full_profile_sha256=digest)
|
|
changed = replace(changed, restore_transaction_sha256=restore_transaction(changed)).validate()
|
|
assert restore_envelope_digest(changed) != restore_envelope_digest(restored)
|
|
assert not restore_plan_matches(plan, changed)
|
|
|
|
|
|
@pytest.mark.parametrize('configured,reported', ((4, 2), (2, 4)))
|
|
def test_actual_parent_rejects_restore_report_from_other_configured_version(configured, reported):
|
|
from openpilot.starpilot.flm.full_surface_profile import RESTORE_POLICY
|
|
owner = parent()
|
|
owner.install_full_prior(saved_prior(owner.envelope))
|
|
restored = owner.restore_envelope
|
|
objective = EffectObjective('ff.left', restored.trial_names, restored.trial_anchor, restored.context_key)
|
|
# Negative contract test only: no ReplayValidation or native permission flags.
|
|
profile = SimpleNamespace(effect_envelope=restored, policy=RESTORE_POLICY,
|
|
parameters=objective.parameters, coefficients=tuple(dict(restored.coordinates)[name] for name in objective.names))
|
|
owner.key = ('event', 'ff.left')
|
|
owner.replay_version, owner.restore_version = 3, configured
|
|
report = {'event_version': reported, 'model': asdict(fitted_model()),
|
|
'restoration_qualified_groups': restored.restoration_groups}
|
|
assert not owner.install_fit(report, SimpleNamespace(profile=profile), SimpleNamespace(profile=profile), physical_context=())
|
|
|
|
|
|
def test_fixed_first_eight_physical_failure_cannot_search_a_later_cutoff():
|
|
from openpilot.starpilot.flm.event_restore_fit import prepare_fixed_restore_calibration
|
|
restored = envelope()
|
|
events = tuple({'block_id': str(index), 'samples': ({'control_ns': index * 1_000_000_000,
|
|
'apply_ns': index * 1_000_000_000 + 1, 'mono_ns': index * 1_000_000_000 + 2,
|
|
'output': {'stamp': index * 1_000_000_000 + 1}, 'physical': {'lateral_accel': .02}},)} for index in range(1, 17))
|
|
engine = SimpleNamespace(identity='a' * 64, records=tuple(SimpleNamespace(control_ns=index) for index in range(1, 17)))
|
|
row = {**payload(), 'physical_context': ('cal', 'vm', 'lag', 0)}
|
|
with mock.patch('openpilot.starpilot.flm.event_restore_fit._restore_original_evidence',
|
|
return_value=(restored, 'b' * 64, (), events)), \
|
|
mock.patch('openpilot.starpilot.flm.event_restore_fit.output_from_dict',
|
|
side_effect=lambda values: SimpleNamespace(apply_ns=values['stamp'])), \
|
|
mock.patch('openpilot.starpilot.flm.event_restore_fit.delivered', return_value=.01), \
|
|
mock.patch('openpilot.starpilot.flm.event_restore_fit.fit_event_physical', return_value=None) as measured:
|
|
report = prepare_fixed_restore_calibration(row, engine, None)
|
|
assert report['reason'] == 'restore_fixed_eight_independent_physical_model'
|
|
assert report['profile'] is report['validation'] is None
|
|
measured.assert_called_once()
|
|
assert tuple(point.block_id for point in measured.call_args.args[2]) == tuple(str(index) for index in range(1, 9))
|
|
assert measured.call_args.kwargs['now_ns'] == 8_000_000_002
|