"""入场事件、持续持有、退出优先与两个完整冷却期的状态路径。""" import json from enum import Enum class State(Enum): FLAT = 'flat' LONG = 'long' COOLING = 'cooling' def generate(events): state, remaining, result = State.FLAT, 0, [] for i, event in enumerate(events): previous, before = state, remaining if state == State.LONG: if event['exit']: state, remaining, reason = State.COOLING, 2, 'exit_priority' else: reason = 'hold_without_reentering' elif state == State.COOLING: remaining -= 1 reason = 'cooldown' if remaining == 0: state = State.FLAT elif event['exit']: reason = 'flat_exit_blocks_entry' elif event['enter']: state, reason = State.LONG, 'entry' else: reason = 'wait' result.append({'i': i, 'before': previous.value, 'cooldown_before': before, 'enter': event['enter'], 'exit': event['exit'], 'after': state.value, 'remaining': remaining, 'target': int(state == State.LONG), 'reason': reason}) return result events = [{'enter': i not in (1, 7), 'exit': i in (3, 7)} for i in range(11)] rows = generate(events) targets = [r['target'] for r in rows] assert targets == [1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1] assert rows[1]['reason'] == 'hold_without_reentering' assert rows[2]['reason'] == 'hold_without_reentering' assert rows[3]['enter'] and rows[3]['reason'] == 'exit_priority' assert [r['reason'] for r in rows[4:6]] == ['cooldown', 'cooldown'] assert rows[6]['reason'] == 'entry' and rows[10]['reason'] == 'entry' assert sum(r['reason'] == 'entry' for r in rows) == 3 flat_conflict = generate([{'enter': True, 'exit': True}])[0] assert flat_conflict['target'] == 0 and flat_conflict['reason'] == 'flat_exit_blocks_entry' for cutoff in range(1, len(events)): assert generate(events[:cutoff]) == rows[:cutoff] assert [int(e['enter']) for e in events] != targets print(json.dumps({'path': rows, 'targets': targets, 'entry_events': 3, 'scope': 'desired state only, no asserted fills'}))