| from __future__ import annotations |
|
|
| from typing import Any |
|
|
| from models import LedgerShieldState |
|
|
| from .reward_machine import RewardMachineState |
| from .sprt_engine import DEFAULT_HYPOTHESES, SPRTState |
|
|
|
|
| def export_state_vector( |
| state: LedgerShieldState, |
| *, |
| sprt_state: SPRTState, |
| reward_machine_state: RewardMachineState, |
| watchdog_suspicion_score: float, |
| best_tool_voi: float, |
| ) -> list[float]: |
| vector: list[float] = [] |
|
|
| for hypothesis in DEFAULT_HYPOTHESES: |
| if hypothesis == "safe": |
| vector.append(0.0) |
| else: |
| vector.append(float(sprt_state.log_likelihood_ratios.get(hypothesis, 0.0))) |
|
|
| for hypothesis in DEFAULT_HYPOTHESES: |
| if hypothesis == "safe": |
| vector.append(1.0 - float(sprt_state.posterior_probabilities.get("safe", 0.0))) |
| else: |
| vector.append(float(sprt_state.distance_to_boundary.get(hypothesis, 1.0))) |
|
|
| vector.append(float(sprt_state.decision_ready)) |
| vector.append(float(best_tool_voi)) |
| vector.append(float(state.budget_remaining) / max(1.0, float(state.budget_total))) |
| vector.append(float(state.step_count) / max(1.0, float(state.max_steps))) |
| vector.append(float(reward_machine_state.progress_fraction)) |
|
|
| for index in range(6): |
| vector.append(1.0 if reward_machine_state.state_id == index else 0.0) |
|
|
| vector.append(float(watchdog_suspicion_score)) |
| vector.append(float(state.calibration_running_average)) |
| return [round(value, 6) for value in vector] |
|
|