mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-08 13:33:42 +08:00
69 lines
3.5 KiB
Python
69 lines
3.5 KiB
Python
"""Full30 wire/child state and EXACT owner/replay transition equivalence."""
|
|
from dataclasses import replace
|
|
import pytest
|
|
|
|
from openpilot.starpilot.flm.canonical_surface_adapter import full_profile_sha256
|
|
from openpilot.starpilot.flm.effect_trace import trace_dict, trace_from_dict, ordered
|
|
from openpilot.starpilot.flm.learning_wire import read_control
|
|
from openpilot.starpilot.flm.selected_effects import EffectTrial, EffectReplayTransition
|
|
from openpilot.starpilot.flm.tests.test_fullrate_pipeline import snapshots, serialized_control
|
|
from openpilot.starpilot.flm.tests.test_selected_effect_owner import fixture, NOW, BASE
|
|
from openpilot.starpilot.flm.torque_adapter import Admission
|
|
|
|
|
|
def current_trace():
|
|
owner,p,v,context=fixture(accumulated=True)
|
|
owner.prepare(Admission(p,NOW,True,False,True,v),active=True,current_context=context)
|
|
return owner,p,v,context
|
|
|
|
|
|
def test_typed_wire_and_child_snapshot_keep_all30_and_original_hash():
|
|
owner,p,_,_=current_trace()
|
|
control,_,_=snapshots(NOW)
|
|
control=replace(control,baseline_revision=BASE,source_epoch=p.effect_envelope.source_epoch,
|
|
controller_revision=p.effect_envelope.controller_revision,applied_coordinates=(0.,0.),features=(1.,0.),
|
|
effect_trace=owner.trace,effect_prepare_ns=NOW)
|
|
assert read_control(serialized_control(control))==control
|
|
assert trace_from_dict(trace_dict(owner.trace))==owner.trace
|
|
assert len(owner.trace.applied)==30
|
|
assert owner.trace.applied_full_profile_sha256==full_profile_sha256(BASE,owner.trace.applied)
|
|
|
|
|
|
@pytest.mark.parametrize('field', ['applied','target','before','applied_full_profile_sha256','control_ns'])
|
|
def test_changed_transition_state_is_rejected(field):
|
|
owner,_,_,_=current_trace()
|
|
trace=owner.trace
|
|
value='0'*64 if field=='applied_full_profile_sha256' else -1 if field=='control_ns' else tuple(
|
|
(n, v+.001 if n=='ff_gain_left' else v) for n,v in getattr(trace,field))
|
|
with pytest.raises(ValueError):
|
|
replace(trace,**{field:value}).validate()
|
|
|
|
|
|
def test_exact_prior_centered_transition_matches_real_owner_with_jitter_and_withdrawal():
|
|
owner,p,v,context=fixture(accumulated=True)
|
|
# The new trial baseline is the ACTUAL accepted full target, not its old prior.
|
|
accepted=p.effect_envelope
|
|
anchor=replace(accepted,prior_coordinates=accepted.coordinates,
|
|
prior_full_profile_sha256=accepted.full_profile_sha256)
|
|
objective=owner.objective
|
|
trial=EffectTrial(objective,tuple(dict(anchor.prior_coordinates)[n] for n in objective.names),BASE,anchor.replay_anchor())
|
|
replay=EffectReplayTransition(trial)
|
|
stamps=(NOW,NOW+11_000_000,NOW+19_000_000,NOW+31_000_000)
|
|
for stamp in stamps:
|
|
owner.prepare(Admission(p,stamp,True,False,True,v),active=True,current_context=context)
|
|
source=replay.source_for_frame(stamp,owner.trace)
|
|
assert ordered(source.source.values)==owner.trace.applied
|
|
owner.prepare(Admission(p,NOW+40_000_000,True,False,False,v),active=True,current_context=context)
|
|
replay.source_for_frame(NOW+40_000_000,None)
|
|
assert not any(replay.applied.values())
|
|
owner.prepare(Admission(p,NOW+50_000_000,True,False,True,v),active=True,current_context=context)
|
|
source=replay.source_for_frame(NOW+50_000_000,owner.trace)
|
|
assert ordered(source.source.values)==owner.trace.applied
|
|
|
|
|
|
def test_nonzero_original_profile_without_applied_trace_is_rejected():
|
|
owner,p,_,_=current_trace()
|
|
trial=EffectTrial(owner.objective,(.004,),BASE,p.effect_envelope.replay_anchor())
|
|
with pytest.raises(ValueError):
|
|
EffectReplayTransition(trial).source_for_frame(NOW,None)
|