Spaces:
Runtime error
Runtime error
Upload 100 files
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +24 -0
- Down/AntiDown/envs/corrupted_valley.py +132 -0
- Down/AntiDown/exp/plot_corrupted_valley_results.py +135 -0
- Down/AntiDown/exp/run_corrupted_valley_tabular.py +304 -0
- Down/AntiDown/levo/levo_q_tabular.py +71 -0
- Down/AntiDown/levo/levo_thinking_ensemble.py +104 -0
- Down/AntiDown/levo/policies.py +101 -0
- Down/AntiDown/utils/logging.py +63 -0
- Down/MODEL.md +96 -0
- Down/README.md +64 -0
- Down/down/envs/env_paradox.py +193 -0
- Down/down/exp/plot_paradox_results.py +82 -0
- Down/down/exp/run_paradox_ppo_hybrid.py +112 -0
- Down/down/exp/run_paradox_tabular.py +124 -0
- Down/down/levo/agent_levo_paradox.py +399 -0
- Down/down/results/paradox_ppo_results.csv +1201 -0
- Down/down/results/paradox_tabular_results.csv +0 -0
- Down/graphics/graphics/antidown_corrupted_valley_reward.png +0 -0
- Down/graphics/graphics/antidown_corrupted_valley_valley_visits.png +0 -0
- Down/graphics/graphics/down_paradox_tabular_reward.png +3 -0
- Down/graphics/graphics/down_paradox_tabular_rho.png +0 -0
- Down/graphics/graphics/dual_down_antidown_episode_return.png +3 -0
- Down/graphics/graphics/figure_failures.png +0 -0
- Down/graphics/graphics/figure_reward.png +0 -0
- Down/graphics/index.html +240 -0
- Down/plot_dual_down_antidown.py +131 -0
- Down/results/antidown_corrupted_valley_tabular.csv +0 -0
- Down/results/down_paradox_tabular_results.csv +0 -0
- Down/run_all.bat +3 -0
- Down/run_all.py +67 -0
- Down/run_all.sh +3 -0
- README.md +14 -17
- Strange/AntiStrange/envs/__init__.py +1 -0
- Strange/AntiStrange/envs/antihypothesis_lab_env.py +150 -0
- Strange/AntiStrange/exp/__init__.py +1 -0
- Strange/AntiStrange/exp/plot_results.py +64 -0
- Strange/AntiStrange/exp/run_antistrange_hypothesis_lab.py +79 -0
- Strange/AntiStrange/graphics/antistrange_H_swarm.png +0 -0
- Strange/AntiStrange/graphics/antistrange_S_t.png +0 -0
- Strange/AntiStrange/graphics/antistrange_T.png +0 -0
- Strange/AntiStrange/graphics/antistrange_diversity.png +3 -0
- Strange/AntiStrange/graphics/antistrange_episode_return.png +3 -0
- Strange/AntiStrange/graphics/antistrange_phase.png +3 -0
- Strange/AntiStrange/graphics/antistrange_progress.png +3 -0
- Strange/AntiStrange/graphics/antistrange_stability.png +3 -0
- Strange/AntiStrange/graphics/antistrange_w_t.png +0 -0
- Strange/AntiStrange/graphics/index.html +147 -0
- Strange/AntiStrange/levo/__init__.py +1 -0
- Strange/AntiStrange/levo/antistrange_swarm.py +359 -0
- Strange/AntiStrange/results/antistrange_hypothesis_lab.csv +0 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,27 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
Down/graphics/graphics/down_paradox_tabular_reward.png filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
Down/graphics/graphics/dual_down_antidown_episode_return.png filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
Strange/AntiStrange/graphics/antistrange_diversity.png filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
Strange/AntiStrange/graphics/antistrange_episode_return.png filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
Strange/AntiStrange/graphics/antistrange_phase.png filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
Strange/AntiStrange/graphics/antistrange_progress.png filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
Strange/AntiStrange/graphics/antistrange_stability.png filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
Strange/graphics/graphics/antistrange_diversity.png filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
Strange/graphics/graphics/antistrange_episode_return.png filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
Strange/graphics/graphics/antistrange_phase.png filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
Strange/graphics/graphics/antistrange_progress.png filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
Strange/graphics/graphics/antistrange_stability.png filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
Strange/graphics/graphics/dual_episode_return.png filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
Strange/graphics/graphics/dual_stability.png filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
Strange/graphics/graphics/strange_diversity.png filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
Strange/graphics/graphics/strange_episode_return.png filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
Strange/graphics/graphics/strange_phase.png filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
Strange/graphics/graphics/strange_progress.png filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
Strange/graphics/graphics/strange_stability.png filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
Strange/strange/graphics/strange_diversity.png filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
Strange/strange/graphics/strange_episode_return.png filter=lfs diff=lfs merge=lfs -text
|
| 57 |
+
Strange/strange/graphics/strange_phase.png filter=lfs diff=lfs merge=lfs -text
|
| 58 |
+
Strange/strange/graphics/strange_progress.png filter=lfs diff=lfs merge=lfs -text
|
| 59 |
+
Strange/strange/graphics/strange_stability.png filter=lfs diff=lfs merge=lfs -text
|
Down/AntiDown/envs/corrupted_valley.py
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import math
|
| 2 |
+
from dataclasses import dataclass
|
| 3 |
+
from typing import Optional, Tuple, Dict, Any
|
| 4 |
+
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
@dataclass
|
| 9 |
+
class StepResult:
|
| 10 |
+
obs: int
|
| 11 |
+
reward: float
|
| 12 |
+
done: bool
|
| 13 |
+
info: Dict[str, Any]
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class CorruptedValleyEnv:
|
| 17 |
+
"""
|
| 18 |
+
7x7 gridworld with:
|
| 19 |
+
- Start S at bottom-left (row=6, col=0)
|
| 20 |
+
- Goal G at top-right (row=0, col=6)
|
| 21 |
+
- Corrupted valley V in the center of the grid.
|
| 22 |
+
|
| 23 |
+
Phases:
|
| 24 |
+
1: Valley is falsely attractive (positive bonus).
|
| 25 |
+
2: Valley is corrected (neutral or mildly negative).
|
| 26 |
+
3: Same rewards as phase 2. Intended for noisy-training experiments.
|
| 27 |
+
|
| 28 |
+
Observation is a single integer state index in [0, n_states).
|
| 29 |
+
Actions: 0=up, 1=right, 2=down, 3=left.
|
| 30 |
+
"""
|
| 31 |
+
|
| 32 |
+
def __init__(
|
| 33 |
+
self,
|
| 34 |
+
seed: Optional[int] = None,
|
| 35 |
+
grid_size: int = 7,
|
| 36 |
+
valley_reward_phase1: float = 2.0,
|
| 37 |
+
valley_reward_phase2: float = -0.5,
|
| 38 |
+
step_penalty: float = -0.01,
|
| 39 |
+
max_steps: int = 50,
|
| 40 |
+
phase: int = 1,
|
| 41 |
+
) -> None:
|
| 42 |
+
self.grid_size = grid_size
|
| 43 |
+
self.n_states = grid_size * grid_size
|
| 44 |
+
self.n_actions = 4
|
| 45 |
+
|
| 46 |
+
self.valley_reward_phase1 = valley_reward_phase1
|
| 47 |
+
self.valley_reward_phase2 = valley_reward_phase2
|
| 48 |
+
self.step_penalty = step_penalty
|
| 49 |
+
self.max_steps = max_steps
|
| 50 |
+
|
| 51 |
+
self.start_pos = (grid_size - 1, 0)
|
| 52 |
+
self.goal_pos = (0, grid_size - 1)
|
| 53 |
+
|
| 54 |
+
self.rng = np.random.default_rng(seed)
|
| 55 |
+
self.phase = phase
|
| 56 |
+
|
| 57 |
+
# center 3x3 block as valley
|
| 58 |
+
c = grid_size // 2
|
| 59 |
+
self.valley_cells = {
|
| 60 |
+
(r, c2)
|
| 61 |
+
for r in range(c - 1, c + 2)
|
| 62 |
+
for c2 in range(c - 1, c + 2)
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
self.pos: Tuple[int, int] = self.start_pos
|
| 66 |
+
self.steps = 0
|
| 67 |
+
|
| 68 |
+
def _state_from_pos(self, pos: Tuple[int, int]) -> int:
|
| 69 |
+
r, c = pos
|
| 70 |
+
return r * self.grid_size + c
|
| 71 |
+
|
| 72 |
+
def _obs(self) -> int:
|
| 73 |
+
return self._state_from_pos(self.pos)
|
| 74 |
+
|
| 75 |
+
def reset(self) -> int:
|
| 76 |
+
self.pos = self.start_pos
|
| 77 |
+
self.steps = 0
|
| 78 |
+
return self._obs()
|
| 79 |
+
|
| 80 |
+
def set_phase(self, phase: int) -> None:
|
| 81 |
+
if phase not in (1, 2, 3):
|
| 82 |
+
raise ValueError(f"Invalid phase: {phase}")
|
| 83 |
+
self.phase = phase
|
| 84 |
+
|
| 85 |
+
def step(self, action: int) -> StepResult:
|
| 86 |
+
self.steps += 1
|
| 87 |
+
|
| 88 |
+
r, c = self.pos
|
| 89 |
+
if action == 0: # up
|
| 90 |
+
r -= 1
|
| 91 |
+
elif action == 1: # right
|
| 92 |
+
c += 1
|
| 93 |
+
elif action == 2: # down
|
| 94 |
+
r += 1
|
| 95 |
+
elif action == 3: # left
|
| 96 |
+
c -= 1
|
| 97 |
+
|
| 98 |
+
# clamp to grid
|
| 99 |
+
r = max(0, min(self.grid_size - 1, r))
|
| 100 |
+
c = max(0, min(self.grid_size - 1, c))
|
| 101 |
+
self.pos = (r, c)
|
| 102 |
+
|
| 103 |
+
reward = self.step_penalty
|
| 104 |
+
done = False
|
| 105 |
+
info: Dict[str, Any] = {}
|
| 106 |
+
|
| 107 |
+
in_valley = self.pos in self.valley_cells
|
| 108 |
+
info["valley"] = in_valley
|
| 109 |
+
|
| 110 |
+
if self.pos == self.goal_pos:
|
| 111 |
+
reward += 1.0
|
| 112 |
+
done = True
|
| 113 |
+
info["terminal"] = "goal"
|
| 114 |
+
elif in_valley:
|
| 115 |
+
if self.phase == 1:
|
| 116 |
+
reward += self.valley_reward_phase1
|
| 117 |
+
else:
|
| 118 |
+
reward += self.valley_reward_phase2
|
| 119 |
+
|
| 120 |
+
if self.steps >= self.max_steps and not done:
|
| 121 |
+
done = True
|
| 122 |
+
info["terminal"] = "timeout"
|
| 123 |
+
|
| 124 |
+
return StepResult(
|
| 125 |
+
obs=self._obs(),
|
| 126 |
+
reward=reward,
|
| 127 |
+
done=done,
|
| 128 |
+
info=info,
|
| 129 |
+
)
|
| 130 |
+
|
| 131 |
+
def sample_action(self) -> int:
|
| 132 |
+
return self.rng.integers(0, self.n_actions)
|
Down/AntiDown/exp/plot_corrupted_valley_results.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Plot results for the Corrupted Valley tabular experiment.
|
| 3 |
+
|
| 4 |
+
Expects a CSV file created by `exp/run_corrupted_valley_tabular.py` with columns:
|
| 5 |
+
phase, phase_tag, episode, agent, total_reward, valley_visits
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
# --- twoquarks bootstrap (path-stable imports) ---
|
| 9 |
+
import sys
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
_ROOT = Path(__file__).resolve().parents[1] # project root (sibling of exp/)
|
| 12 |
+
if str(_ROOT) not in sys.path:
|
| 13 |
+
sys.path.insert(0, str(_ROOT))
|
| 14 |
+
# -------------------------------------------------
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
import csv
|
| 18 |
+
import os
|
| 19 |
+
from collections import defaultdict
|
| 20 |
+
from typing import Dict, List, Tuple
|
| 21 |
+
|
| 22 |
+
import matplotlib.pyplot as plt
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
RESULTS_DIR = Path(os.environ.get("TWOQUARKS_RESULTS_DIR", (Path(__file__).resolve().parent.parent / "results").as_posix()))
|
| 26 |
+
RESULTS_CSV = str(RESULTS_DIR / "antidown_corrupted_valley_tabular.csv")
|
| 27 |
+
OUT_DIR = Path(os.environ.get("TWOQUARKS_GRAPHICS_DIR", (Path(__file__).resolve().parent.parent / "graphics").as_posix()))
|
| 28 |
+
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
| 29 |
+
OUT_PREFIX = str(OUT_DIR / "antidown_corrupted_valley_")
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def load_results(path: str) -> List[Dict[str, str]]:
|
| 33 |
+
rows: List[Dict[str, str]] = []
|
| 34 |
+
with open(path, mode="r", newline="") as f:
|
| 35 |
+
reader = csv.DictReader(f)
|
| 36 |
+
for row in reader:
|
| 37 |
+
rows.append(row)
|
| 38 |
+
return rows
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
def build_global_index(rows: List[Dict[str, str]]) -> Tuple[Dict[int, int], Dict[int, Dict[str, List[Tuple[int, float, float]]]]]:
|
| 42 |
+
"""
|
| 43 |
+
Returns:
|
| 44 |
+
phase_to_max_ep: phase -> max episode index
|
| 45 |
+
data: phase -> agent -> list of (global_ep, total_reward, valley_visits)
|
| 46 |
+
"""
|
| 47 |
+
phase_to_eps: Dict[int, List[int]] = defaultdict(list)
|
| 48 |
+
for r in rows:
|
| 49 |
+
phase = int(r["phase"])
|
| 50 |
+
ep = int(r["episode"])
|
| 51 |
+
phase_to_eps[phase].append(ep)
|
| 52 |
+
|
| 53 |
+
phase_to_max_ep: Dict[int, int] = {
|
| 54 |
+
phase: max(eps) + 1 for phase, eps in phase_to_eps.items()
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
data: Dict[int, Dict[str, List[Tuple[int, float, float]]]] = defaultdict(
|
| 58 |
+
lambda: defaultdict(list)
|
| 59 |
+
)
|
| 60 |
+
|
| 61 |
+
for r in rows:
|
| 62 |
+
phase = int(r["phase"])
|
| 63 |
+
agent = r["agent"]
|
| 64 |
+
ep = int(r["episode"])
|
| 65 |
+
total_reward = float(r["total_reward"])
|
| 66 |
+
valley_visits = float(r["valley_visits"])
|
| 67 |
+
max_ep = phase_to_max_ep[phase]
|
| 68 |
+
global_ep = (phase - 1) * max_ep + ep
|
| 69 |
+
data[phase][agent].append((global_ep, total_reward, valley_visits))
|
| 70 |
+
|
| 71 |
+
return phase_to_max_ep, data
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
def plot_metric(
|
| 75 |
+
data: Dict[int, Dict[str, List[Tuple[int, float, float]]]],
|
| 76 |
+
metric_index: int,
|
| 77 |
+
ylabel: str,
|
| 78 |
+
out_path: str,
|
| 79 |
+
) -> None:
|
| 80 |
+
"""
|
| 81 |
+
metric_index: 1 for total_reward, 2 for valley_visits.
|
| 82 |
+
"""
|
| 83 |
+
plt.figure()
|
| 84 |
+
|
| 85 |
+
# merge across phases, keeping breaks in the global index
|
| 86 |
+
agent_to_xy: Dict[str, Tuple[List[int], List[float]]] = {}
|
| 87 |
+
|
| 88 |
+
for phase, agents in sorted(data.items()):
|
| 89 |
+
for agent, triples in agents.items():
|
| 90 |
+
xs = [t[0] for t in triples]
|
| 91 |
+
ys = [t[metric_index] for t in triples]
|
| 92 |
+
if agent not in agent_to_xy:
|
| 93 |
+
agent_to_xy[agent] = ([], [])
|
| 94 |
+
agent_to_xy[agent][0].extend(xs)
|
| 95 |
+
agent_to_xy[agent][1].extend(ys)
|
| 96 |
+
|
| 97 |
+
for agent, (xs, ys) in agent_to_xy.items():
|
| 98 |
+
# sort by x
|
| 99 |
+
pairs = sorted(zip(xs, ys), key=lambda p: p[0])
|
| 100 |
+
xs_sorted = [p[0] for p in pairs]
|
| 101 |
+
ys_sorted = [p[1] for p in pairs]
|
| 102 |
+
plt.plot(xs_sorted, ys_sorted, label=agent)
|
| 103 |
+
|
| 104 |
+
plt.xlabel("global episode index")
|
| 105 |
+
plt.ylabel(ylabel)
|
| 106 |
+
plt.legend()
|
| 107 |
+
plt.tight_layout()
|
| 108 |
+
plt.savefig(out_path)
|
| 109 |
+
plt.close()
|
| 110 |
+
|
| 111 |
+
|
| 112 |
+
def main() -> None:
|
| 113 |
+
if not os.path.exists(RESULTS_CSV):
|
| 114 |
+
raise FileNotFoundError(f"Results file not found: {RESULTS_CSV}")
|
| 115 |
+
|
| 116 |
+
rows = load_results(RESULTS_CSV)
|
| 117 |
+
_, data = build_global_index(rows)
|
| 118 |
+
|
| 119 |
+
plot_metric(
|
| 120 |
+
data,
|
| 121 |
+
metric_index=1,
|
| 122 |
+
ylabel="total reward per episode",
|
| 123 |
+
out_path=OUT_PREFIX + "reward.png",
|
| 124 |
+
)
|
| 125 |
+
|
| 126 |
+
plot_metric(
|
| 127 |
+
data,
|
| 128 |
+
metric_index=2,
|
| 129 |
+
ylabel="valley visits per episode",
|
| 130 |
+
out_path=OUT_PREFIX + "valley_visits.png",
|
| 131 |
+
)
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
if __name__ == "__main__":
|
| 135 |
+
main()
|
Down/AntiDown/exp/run_corrupted_valley_tabular.py
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Tabular experiments in the Corrupted Valley Gridworld.
|
| 3 |
+
|
| 4 |
+
Agents:
|
| 5 |
+
- EpsGreedyQAgent (baseline)
|
| 6 |
+
- SoftmaxBoltzmannAgent
|
| 7 |
+
- LevoQTabularAgent
|
| 8 |
+
- LevoThinkingEnsembleAgent
|
| 9 |
+
|
| 10 |
+
Phases:
|
| 11 |
+
1) Corrupted reward in the valley (falsely attractive).
|
| 12 |
+
2) Corrected reward.
|
| 13 |
+
3) Corrected reward + noisy TD-updates for LevoThinking heads.
|
| 14 |
+
"""
|
| 15 |
+
|
| 16 |
+
# --- twoquarks bootstrap (path-stable imports) ---
|
| 17 |
+
import sys
|
| 18 |
+
from pathlib import Path
|
| 19 |
+
_ROOT = Path(__file__).resolve().parents[1] # project root (sibling of exp/)
|
| 20 |
+
if str(_ROOT) not in sys.path:
|
| 21 |
+
sys.path.insert(0, str(_ROOT))
|
| 22 |
+
# -------------------------------------------------
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
import os
|
| 26 |
+
from typing import Dict, List, Optional, Iterable
|
| 27 |
+
|
| 28 |
+
import numpy as np
|
| 29 |
+
|
| 30 |
+
from envs.corrupted_valley import CorruptedValleyEnv
|
| 31 |
+
from levo.levo_q_tabular import LevoQTabularAgent
|
| 32 |
+
from levo.levo_thinking_ensemble import LevoThinkingEnsembleAgent
|
| 33 |
+
from utils.logging import CSVLogger
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
class EpsGreedyQAgent:
|
| 37 |
+
def __init__(
|
| 38 |
+
self,
|
| 39 |
+
n_states: int,
|
| 40 |
+
n_actions: int,
|
| 41 |
+
epsilon: float = 0.1,
|
| 42 |
+
gamma: float = 0.99,
|
| 43 |
+
alpha: float = 0.1,
|
| 44 |
+
name: str = "EpsGreedy",
|
| 45 |
+
) -> None:
|
| 46 |
+
self.n_states = n_states
|
| 47 |
+
self.n_actions = n_actions
|
| 48 |
+
self.epsilon = epsilon
|
| 49 |
+
self.gamma = gamma
|
| 50 |
+
self.alpha = alpha
|
| 51 |
+
self.name = name
|
| 52 |
+
self.Q = np.zeros((n_states, n_actions), dtype=float)
|
| 53 |
+
|
| 54 |
+
def select_action(self, state: int, rng: np.random.Generator) -> int:
|
| 55 |
+
if rng.random() < self.epsilon:
|
| 56 |
+
return int(rng.integers(0, self.n_actions))
|
| 57 |
+
q_s = self.Q[state]
|
| 58 |
+
return int(rng.choice(np.flatnonzero(q_s == q_s.max())))
|
| 59 |
+
|
| 60 |
+
def update(self, s: int, a: int, r: float, s_next: int, done: bool) -> None:
|
| 61 |
+
q_sa = self.Q[s, a]
|
| 62 |
+
if done:
|
| 63 |
+
target = r
|
| 64 |
+
else:
|
| 65 |
+
target = r + self.gamma * float(self.Q[s_next].max())
|
| 66 |
+
td = target - q_sa
|
| 67 |
+
self.Q[s, a] = q_sa + self.alpha * td
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
class SoftmaxBoltzmannAgent:
|
| 71 |
+
def __init__(
|
| 72 |
+
self,
|
| 73 |
+
n_states: int,
|
| 74 |
+
n_actions: int,
|
| 75 |
+
tau: float = 0.5,
|
| 76 |
+
gamma: float = 0.99,
|
| 77 |
+
alpha: float = 0.1,
|
| 78 |
+
name: str = "Softmax",
|
| 79 |
+
) -> None:
|
| 80 |
+
self.n_states = n_states
|
| 81 |
+
self.n_actions = n_actions
|
| 82 |
+
self.tau = tau
|
| 83 |
+
self.gamma = gamma
|
| 84 |
+
self.alpha = alpha
|
| 85 |
+
self.name = name
|
| 86 |
+
self.Q = np.zeros((n_states, n_actions), dtype=float)
|
| 87 |
+
|
| 88 |
+
def _softmax(self, q_s: np.ndarray) -> np.ndarray:
|
| 89 |
+
q = q_s / max(self.tau, 1e-8)
|
| 90 |
+
q = q - np.max(q)
|
| 91 |
+
ex = np.exp(q)
|
| 92 |
+
s = ex.sum()
|
| 93 |
+
if s <= 0.0:
|
| 94 |
+
return np.ones_like(ex) / len(ex)
|
| 95 |
+
return ex / s
|
| 96 |
+
|
| 97 |
+
def select_action(self, state: int, rng: np.random.Generator) -> int:
|
| 98 |
+
probs = self._softmax(self.Q[state])
|
| 99 |
+
return int(rng.choice(self.n_actions, p=probs))
|
| 100 |
+
|
| 101 |
+
def update(self, s: int, a: int, r: float, s_next: int, done: bool) -> None:
|
| 102 |
+
q_sa = self.Q[s, a]
|
| 103 |
+
if done:
|
| 104 |
+
target = r
|
| 105 |
+
else:
|
| 106 |
+
target = r + self.gamma * float(self.Q[s_next].max())
|
| 107 |
+
td = target - q_sa
|
| 108 |
+
self.Q[s, a] = q_sa + self.alpha * td
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
def run_episode(
|
| 112 |
+
env: CorruptedValleyEnv,
|
| 113 |
+
agent,
|
| 114 |
+
phase_id: int,
|
| 115 |
+
episode_idx: int,
|
| 116 |
+
logger: CSVLogger,
|
| 117 |
+
rng: np.random.Generator,
|
| 118 |
+
noisy_heads: Optional[Iterable[int]] = None,
|
| 119 |
+
noise_std: float = 0.0,
|
| 120 |
+
) -> None:
|
| 121 |
+
obs = env.reset()
|
| 122 |
+
total_reward = 0.0
|
| 123 |
+
valley_visits = 0
|
| 124 |
+
done = False
|
| 125 |
+
|
| 126 |
+
while not done:
|
| 127 |
+
action = agent.select_action(obs, rng=rng)
|
| 128 |
+
step = env.step(action)
|
| 129 |
+
next_obs = step.obs
|
| 130 |
+
reward = step.reward
|
| 131 |
+
done = step.done
|
| 132 |
+
info = step.info
|
| 133 |
+
|
| 134 |
+
total_reward += reward
|
| 135 |
+
if info.get("valley", False):
|
| 136 |
+
valley_visits += 1
|
| 137 |
+
|
| 138 |
+
if isinstance(agent, LevoThinkingEnsembleAgent):
|
| 139 |
+
agent.update(
|
| 140 |
+
obs,
|
| 141 |
+
action,
|
| 142 |
+
reward,
|
| 143 |
+
next_obs,
|
| 144 |
+
done,
|
| 145 |
+
noisy_heads=noisy_heads,
|
| 146 |
+
noise_std=noise_std,
|
| 147 |
+
rng=rng,
|
| 148 |
+
)
|
| 149 |
+
else:
|
| 150 |
+
agent.update(obs, action, reward, next_obs, done)
|
| 151 |
+
|
| 152 |
+
obs = next_obs
|
| 153 |
+
|
| 154 |
+
logger.log(
|
| 155 |
+
{
|
| 156 |
+
"phase": phase_id,
|
| 157 |
+
"phase_tag": f"phase{phase_id}",
|
| 158 |
+
"episode": episode_idx,
|
| 159 |
+
"agent": agent.name,
|
| 160 |
+
"total_reward": total_reward,
|
| 161 |
+
"valley_visits": valley_visits,
|
| 162 |
+
}
|
| 163 |
+
)
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
def run_phase(
|
| 167 |
+
env_seed_base: int,
|
| 168 |
+
env_seed_offset: int,
|
| 169 |
+
phase_id: int,
|
| 170 |
+
n_episodes: int,
|
| 171 |
+
agents: List,
|
| 172 |
+
logger: CSVLogger,
|
| 173 |
+
noisy_heads_spec: Optional[Iterable[int]] = None,
|
| 174 |
+
noise_std: float = 0.0,
|
| 175 |
+
) -> None:
|
| 176 |
+
"""
|
| 177 |
+
Run one phase for all agents.
|
| 178 |
+
|
| 179 |
+
Seeds are constructed as:
|
| 180 |
+
env_seed = env_seed_base + phase_id * env_seed_offset + agent_idx * 10000 + episode_idx
|
| 181 |
+
so that episodes are reproducible but independent across agents and phases.
|
| 182 |
+
"""
|
| 183 |
+
for agent_idx, agent in enumerate(agents):
|
| 184 |
+
for ep in range(n_episodes):
|
| 185 |
+
env_seed = (
|
| 186 |
+
env_seed_base
|
| 187 |
+
+ phase_id * env_seed_offset
|
| 188 |
+
+ agent_idx * 10000
|
| 189 |
+
+ ep
|
| 190 |
+
)
|
| 191 |
+
env = CorruptedValleyEnv(seed=env_seed, phase=phase_id)
|
| 192 |
+
rng = np.random.default_rng(env_seed)
|
| 193 |
+
|
| 194 |
+
if isinstance(agent, LevoThinkingEnsembleAgent):
|
| 195 |
+
if noisy_heads_spec is None:
|
| 196 |
+
# default: half of the heads receive noisy TD-updates
|
| 197 |
+
k = max(1, agent.n_heads // 2)
|
| 198 |
+
effective_noisy_heads = range(k)
|
| 199 |
+
else:
|
| 200 |
+
effective_noisy_heads = noisy_heads_spec
|
| 201 |
+
episode_noise_std = noise_std
|
| 202 |
+
else:
|
| 203 |
+
effective_noisy_heads = None
|
| 204 |
+
episode_noise_std = 0.0
|
| 205 |
+
|
| 206 |
+
run_episode(
|
| 207 |
+
env=env,
|
| 208 |
+
agent=agent,
|
| 209 |
+
phase_id=phase_id,
|
| 210 |
+
episode_idx=ep,
|
| 211 |
+
logger=logger,
|
| 212 |
+
rng=rng,
|
| 213 |
+
noisy_heads=effective_noisy_heads,
|
| 214 |
+
noise_std=episode_noise_std,
|
| 215 |
+
)
|
| 216 |
+
|
| 217 |
+
|
| 218 |
+
def main() -> None:
|
| 219 |
+
base_seed = 1234
|
| 220 |
+
seed_offset = 1000
|
| 221 |
+
|
| 222 |
+
# probe environment to get sizes
|
| 223 |
+
probe_env = CorruptedValleyEnv(seed=base_seed, phase=1)
|
| 224 |
+
n_states = probe_env.n_states
|
| 225 |
+
n_actions = probe_env.n_actions
|
| 226 |
+
|
| 227 |
+
agents = [
|
| 228 |
+
EpsGreedyQAgent(n_states, n_actions, epsilon=0.1, name="EpsGreedy"),
|
| 229 |
+
SoftmaxBoltzmannAgent(n_states, n_actions, tau=0.5, name="Softmax"),
|
| 230 |
+
LevoQTabularAgent(
|
| 231 |
+
n_states,
|
| 232 |
+
n_actions,
|
| 233 |
+
A=0.5,
|
| 234 |
+
omega=0.05,
|
| 235 |
+
ent_weight=0.0,
|
| 236 |
+
name="LevoQ",
|
| 237 |
+
),
|
| 238 |
+
LevoThinkingEnsembleAgent(
|
| 239 |
+
n_states,
|
| 240 |
+
n_actions,
|
| 241 |
+
n_heads=5,
|
| 242 |
+
A=0.5,
|
| 243 |
+
omega=0.05,
|
| 244 |
+
lambda_var=0.5,
|
| 245 |
+
name="LevoThinking",
|
| 246 |
+
),
|
| 247 |
+
]
|
| 248 |
+
|
| 249 |
+
_results_dir = Path(os.environ.get("TWOQUARKS_RESULTS_DIR", (Path(__file__).resolve().parents[1] / "results").as_posix()))
|
| 250 |
+
_results_dir.mkdir(parents=True, exist_ok=True)
|
| 251 |
+
results_path = str(_results_dir / "antidown_corrupted_valley_tabular.csv")
|
| 252 |
+
logger = CSVLogger(
|
| 253 |
+
results_path,
|
| 254 |
+
fieldnames=[
|
| 255 |
+
"phase",
|
| 256 |
+
"phase_tag",
|
| 257 |
+
"episode",
|
| 258 |
+
"agent",
|
| 259 |
+
"total_reward",
|
| 260 |
+
"valley_visits",
|
| 261 |
+
],
|
| 262 |
+
)
|
| 263 |
+
|
| 264 |
+
n_episodes = 200
|
| 265 |
+
|
| 266 |
+
# Phase 1: corrupted valley
|
| 267 |
+
run_phase(
|
| 268 |
+
env_seed_base=base_seed,
|
| 269 |
+
env_seed_offset=seed_offset,
|
| 270 |
+
phase_id=1,
|
| 271 |
+
n_episodes=n_episodes,
|
| 272 |
+
agents=agents,
|
| 273 |
+
logger=logger,
|
| 274 |
+
noisy_heads_spec=None,
|
| 275 |
+
noise_std=0.0,
|
| 276 |
+
)
|
| 277 |
+
|
| 278 |
+
# Phase 2: corrected valley
|
| 279 |
+
run_phase(
|
| 280 |
+
env_seed_base=base_seed,
|
| 281 |
+
env_seed_offset=seed_offset,
|
| 282 |
+
phase_id=2,
|
| 283 |
+
n_episodes=n_episodes,
|
| 284 |
+
agents=agents,
|
| 285 |
+
logger=logger,
|
| 286 |
+
noisy_heads_spec=None,
|
| 287 |
+
noise_std=0.0,
|
| 288 |
+
)
|
| 289 |
+
|
| 290 |
+
# Phase 3: corrected valley + noisy TD-updates for LevoThinking
|
| 291 |
+
run_phase(
|
| 292 |
+
env_seed_base=base_seed,
|
| 293 |
+
env_seed_offset=seed_offset,
|
| 294 |
+
phase_id=3,
|
| 295 |
+
n_episodes=n_episodes,
|
| 296 |
+
agents=agents,
|
| 297 |
+
logger=logger,
|
| 298 |
+
noisy_heads_spec=None, # default: half of the heads
|
| 299 |
+
noise_std=0.1,
|
| 300 |
+
)
|
| 301 |
+
|
| 302 |
+
|
| 303 |
+
if __name__ == "__main__":
|
| 304 |
+
main()
|
Down/AntiDown/levo/levo_q_tabular.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import Optional
|
| 2 |
+
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
from .policies import hf_levo_policy_tabular
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class LevoQTabularAgent:
|
| 9 |
+
"""
|
| 10 |
+
Tabular Q-learning agent with an HF-Levo policy.
|
| 11 |
+
|
| 12 |
+
The Q-update is standard:
|
| 13 |
+
Q(s, a) <- Q(s, a) + alpha * (r + gamma max_a' Q(s', a') - Q(s, a))
|
| 14 |
+
|
| 15 |
+
The policy is:
|
| 16 |
+
score(a) = Q(s, a) + A cos(omega * t + phi_a + phase_offset)
|
| 17 |
+
pi(a|s) = softmax(score / tau)
|
| 18 |
+
"""
|
| 19 |
+
|
| 20 |
+
def __init__(
|
| 21 |
+
self,
|
| 22 |
+
n_states: int,
|
| 23 |
+
n_actions: int,
|
| 24 |
+
gamma: float = 0.99,
|
| 25 |
+
alpha: float = 0.1,
|
| 26 |
+
A: float = 0.5,
|
| 27 |
+
omega: float = 0.1,
|
| 28 |
+
phase_offset: float = 0.0,
|
| 29 |
+
ent_weight: float = 0.0,
|
| 30 |
+
prior: Optional[np.ndarray] = None,
|
| 31 |
+
tau: float = 1.0,
|
| 32 |
+
name: str = "LevoQ",
|
| 33 |
+
) -> None:
|
| 34 |
+
self.n_states = n_states
|
| 35 |
+
self.n_actions = n_actions
|
| 36 |
+
self.gamma = gamma
|
| 37 |
+
self.alpha = alpha
|
| 38 |
+
self.A = A
|
| 39 |
+
self.omega = omega
|
| 40 |
+
self.phase_offset = phase_offset
|
| 41 |
+
self.ent_weight = ent_weight
|
| 42 |
+
self.prior = prior
|
| 43 |
+
self.tau = tau
|
| 44 |
+
|
| 45 |
+
self.name = name
|
| 46 |
+
self.Q = np.zeros((n_states, n_actions), dtype=float)
|
| 47 |
+
self.t = 0 # global step counter for the HF modulation
|
| 48 |
+
|
| 49 |
+
def select_action(self, state: int, rng: np.random.Generator) -> int:
|
| 50 |
+
probs = hf_levo_policy_tabular(
|
| 51 |
+
self.Q,
|
| 52 |
+
state,
|
| 53 |
+
t=self.t,
|
| 54 |
+
A=self.A,
|
| 55 |
+
omega=self.omega,
|
| 56 |
+
phase_offset=self.phase_offset,
|
| 57 |
+
ent_weight=self.ent_weight,
|
| 58 |
+
prior=self.prior,
|
| 59 |
+
tau=self.tau,
|
| 60 |
+
)
|
| 61 |
+
self.t += 1
|
| 62 |
+
return int(rng.choice(self.n_actions, p=probs))
|
| 63 |
+
|
| 64 |
+
def update(self, s: int, a: int, r: float, s_next: int, done: bool) -> None:
|
| 65 |
+
q_sa = self.Q[s, a]
|
| 66 |
+
if done:
|
| 67 |
+
target = r
|
| 68 |
+
else:
|
| 69 |
+
target = r + self.gamma * float(self.Q[s_next].max())
|
| 70 |
+
td = target - q_sa
|
| 71 |
+
self.Q[s, a] = q_sa + self.alpha * td
|
Down/AntiDown/levo/levo_thinking_ensemble.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import Iterable, Optional
|
| 2 |
+
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
from .policies import ensemble_levo_thinking_policy
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class LevoThinkingEnsembleAgent:
|
| 9 |
+
"""
|
| 10 |
+
Ensemble Q-learning agent with LevoThinking policy.
|
| 11 |
+
|
| 12 |
+
Q has shape (n_heads, n_states, n_actions).
|
| 13 |
+
|
| 14 |
+
For action selection, we use:
|
| 15 |
+
mu(a) = mean_h Q_h(s, a)
|
| 16 |
+
var(a) = var_h Q_h(s, a)
|
| 17 |
+
base_score(a) = mu(a) - lambda_var * var(a)
|
| 18 |
+
score(a) = base_score(a) + HF(t, a)
|
| 19 |
+
|
| 20 |
+
Each head is updated independently with standard Q-learning, optionally
|
| 21 |
+
adding Gaussian noise to the TD-error for a subset of heads.
|
| 22 |
+
"""
|
| 23 |
+
|
| 24 |
+
def __init__(
|
| 25 |
+
self,
|
| 26 |
+
n_states: int,
|
| 27 |
+
n_actions: int,
|
| 28 |
+
n_heads: int = 5,
|
| 29 |
+
gamma: float = 0.99,
|
| 30 |
+
alpha: float = 0.1,
|
| 31 |
+
A: float = 0.5,
|
| 32 |
+
omega: float = 0.1,
|
| 33 |
+
phase_offset: float = 0.0,
|
| 34 |
+
lambda_var: float = 0.5,
|
| 35 |
+
prior: Optional[np.ndarray] = None,
|
| 36 |
+
tau: float = 1.0,
|
| 37 |
+
name: str = "LevoThinking",
|
| 38 |
+
) -> None:
|
| 39 |
+
self.n_states = n_states
|
| 40 |
+
self.n_actions = n_actions
|
| 41 |
+
self.n_heads = n_heads
|
| 42 |
+
self.gamma = gamma
|
| 43 |
+
self.alpha = alpha
|
| 44 |
+
self.A = A
|
| 45 |
+
self.omega = omega
|
| 46 |
+
self.phase_offset = phase_offset
|
| 47 |
+
self.lambda_var = lambda_var
|
| 48 |
+
self.prior = prior
|
| 49 |
+
self.tau = tau
|
| 50 |
+
|
| 51 |
+
self.name = name
|
| 52 |
+
self.Q = np.zeros((n_heads, n_states, n_actions), dtype=float)
|
| 53 |
+
self.t = 0 # global step counter for the HF modulation
|
| 54 |
+
|
| 55 |
+
def select_action(self, state: int, rng: np.random.Generator) -> int:
|
| 56 |
+
probs = ensemble_levo_thinking_policy(
|
| 57 |
+
self.Q,
|
| 58 |
+
state,
|
| 59 |
+
t=self.t,
|
| 60 |
+
A=self.A,
|
| 61 |
+
omega=self.omega,
|
| 62 |
+
phase_offset=self.phase_offset,
|
| 63 |
+
lambda_var=self.lambda_var,
|
| 64 |
+
prior=self.prior,
|
| 65 |
+
tau=self.tau,
|
| 66 |
+
)
|
| 67 |
+
self.t += 1
|
| 68 |
+
return int(rng.choice(self.n_actions, p=probs))
|
| 69 |
+
|
| 70 |
+
def update(
|
| 71 |
+
self,
|
| 72 |
+
s: int,
|
| 73 |
+
a: int,
|
| 74 |
+
r: float,
|
| 75 |
+
s_next: int,
|
| 76 |
+
done: bool,
|
| 77 |
+
noisy_heads: Optional[Iterable[int]] = None,
|
| 78 |
+
noise_std: float = 0.0,
|
| 79 |
+
rng: Optional[np.random.Generator] = None,
|
| 80 |
+
) -> None:
|
| 81 |
+
"""
|
| 82 |
+
Update each head with standard Q-learning.
|
| 83 |
+
|
| 84 |
+
If `noisy_heads` is not None and `noise_std > 0`, then for any head h
|
| 85 |
+
in `noisy_heads`, we add N(0, noise_std) to the TD-error before the
|
| 86 |
+
update. This is used in Phase 3 to simulate corrupted learning signals.
|
| 87 |
+
"""
|
| 88 |
+
if noisy_heads is None:
|
| 89 |
+
noisy_set = set()
|
| 90 |
+
else:
|
| 91 |
+
noisy_set = set(int(h) for h in noisy_heads)
|
| 92 |
+
|
| 93 |
+
for h in range(self.n_heads):
|
| 94 |
+
q_sa = self.Q[h, s, a]
|
| 95 |
+
if done:
|
| 96 |
+
target = r
|
| 97 |
+
else:
|
| 98 |
+
target = r + self.gamma * float(self.Q[h, s_next].max())
|
| 99 |
+
td = target - q_sa
|
| 100 |
+
|
| 101 |
+
if h in noisy_set and noise_std > 0.0 and rng is not None:
|
| 102 |
+
td += float(rng.normal(loc=0.0, scale=noise_std))
|
| 103 |
+
|
| 104 |
+
self.Q[h, s, a] = q_sa + self.alpha * td
|
Down/AntiDown/levo/policies.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import math
|
| 2 |
+
from typing import Optional
|
| 3 |
+
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
def softmax(x: np.ndarray, tau: float = 1.0) -> np.ndarray:
|
| 8 |
+
x = np.asarray(x, dtype=float)
|
| 9 |
+
if tau <= 0.0:
|
| 10 |
+
raise ValueError("tau must be positive")
|
| 11 |
+
x = x / tau
|
| 12 |
+
x = x - np.max(x)
|
| 13 |
+
ex = np.exp(x)
|
| 14 |
+
s = ex.sum()
|
| 15 |
+
if s <= 0.0:
|
| 16 |
+
# fallback: uniform
|
| 17 |
+
return np.ones_like(ex) / len(ex)
|
| 18 |
+
return ex / s
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def hf_levo_policy_tabular(
|
| 22 |
+
Q: np.ndarray,
|
| 23 |
+
state: int,
|
| 24 |
+
t: int,
|
| 25 |
+
A: float = 0.5,
|
| 26 |
+
omega: float = 0.1,
|
| 27 |
+
phase_offset: float = 0.0,
|
| 28 |
+
ent_weight: float = 0.0,
|
| 29 |
+
prior: Optional[np.ndarray] = None,
|
| 30 |
+
tau: float = 1.0,
|
| 31 |
+
) -> np.ndarray:
|
| 32 |
+
"""
|
| 33 |
+
HF-Levo policy on a single Q-table.
|
| 34 |
+
|
| 35 |
+
score(a) = Q(s, a) + A cos(omega * t + phi_a + phase_offset)
|
| 36 |
+
"""
|
| 37 |
+
q_s = np.asarray(Q[state], dtype=float)
|
| 38 |
+
n_actions = q_s.shape[0]
|
| 39 |
+
|
| 40 |
+
phases = np.linspace(0.0, 2.0 * math.pi, n_actions, endpoint=False)
|
| 41 |
+
osc = A * np.cos(omega * float(t) + phases + phase_offset)
|
| 42 |
+
score = q_s + osc
|
| 43 |
+
|
| 44 |
+
p = softmax(score, tau=tau)
|
| 45 |
+
|
| 46 |
+
if prior is None or ent_weight <= 0.0:
|
| 47 |
+
return p
|
| 48 |
+
|
| 49 |
+
prior = np.asarray(prior, dtype=float)
|
| 50 |
+
prior = prior / max(prior.sum(), 1e-8)
|
| 51 |
+
w = max(0.0, min(1.0, float(ent_weight)))
|
| 52 |
+
p_mix = (1.0 - w) * p + w * prior
|
| 53 |
+
p_mix = np.clip(p_mix, 1e-8, 1.0)
|
| 54 |
+
p_mix /= p_mix.sum()
|
| 55 |
+
return p_mix
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def ensemble_levo_thinking_policy(
|
| 59 |
+
Q_ensemble: np.ndarray,
|
| 60 |
+
state: int,
|
| 61 |
+
t: int,
|
| 62 |
+
A: float = 0.5,
|
| 63 |
+
omega: float = 0.1,
|
| 64 |
+
phase_offset: float = 0.0,
|
| 65 |
+
lambda_var: float = 0.5,
|
| 66 |
+
prior: Optional[np.ndarray] = None,
|
| 67 |
+
tau: float = 1.0,
|
| 68 |
+
) -> np.ndarray:
|
| 69 |
+
"""
|
| 70 |
+
LevoThinking ensemble policy.
|
| 71 |
+
|
| 72 |
+
Let Q_h be the Q-table of head h.
|
| 73 |
+
|
| 74 |
+
mu(a) = mean_h Q_h(s, a)
|
| 75 |
+
var(a) = var_h Q_h(s, a)
|
| 76 |
+
|
| 77 |
+
base_score(a) = mu(a) - lambda_var * var(a)
|
| 78 |
+
score(a) = base_score(a) + A cos(omega * t + phi_a + phase_offset)
|
| 79 |
+
"""
|
| 80 |
+
q_heads = np.asarray(Q_ensemble[:, state, :], dtype=float)
|
| 81 |
+
mu = q_heads.mean(axis=0)
|
| 82 |
+
var = q_heads.var(axis=0)
|
| 83 |
+
|
| 84 |
+
n_actions = mu.shape[0]
|
| 85 |
+
phases = np.linspace(0.0, 2.0 * math.pi, n_actions, endpoint=False)
|
| 86 |
+
osc = A * np.cos(omega * float(t) + phases + phase_offset)
|
| 87 |
+
|
| 88 |
+
base_score = mu - lambda_var * var
|
| 89 |
+
score = base_score + osc
|
| 90 |
+
|
| 91 |
+
p = softmax(score, tau=tau)
|
| 92 |
+
|
| 93 |
+
if prior is None:
|
| 94 |
+
return p
|
| 95 |
+
|
| 96 |
+
prior = np.asarray(prior, dtype=float)
|
| 97 |
+
prior = prior / max(prior.sum(), 1e-8)
|
| 98 |
+
p_mix = 0.8 * p + 0.2 * prior
|
| 99 |
+
p_mix = np.clip(p_mix, 1e-8, 1.0)
|
| 100 |
+
p_mix /= p_mix.sum()
|
| 101 |
+
return p_mix
|
Down/AntiDown/utils/logging.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Simple logging utilities for experiments.
|
| 3 |
+
|
| 4 |
+
Provides a minimal CSVLogger that creates the output directory if needed,
|
| 5 |
+
writes a header once, and appends rows as dictionaries.
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
from __future__ import annotations
|
| 9 |
+
|
| 10 |
+
import csv
|
| 11 |
+
import os
|
| 12 |
+
from typing import Mapping, Sequence
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
class CSVLogger:
|
| 16 |
+
"""
|
| 17 |
+
Minimal CSV logger for experiment metrics.
|
| 18 |
+
|
| 19 |
+
Parameters
|
| 20 |
+
----------
|
| 21 |
+
filepath : str
|
| 22 |
+
Path to the CSV file to create/append.
|
| 23 |
+
fieldnames : Sequence[str]
|
| 24 |
+
Ordered list of column names to use as the CSV header.
|
| 25 |
+
|
| 26 |
+
Notes
|
| 27 |
+
-----
|
| 28 |
+
- The directory containing `filepath` is created if it does not exist.
|
| 29 |
+
- The file is overwritten when the logger is constructed.
|
| 30 |
+
- Each call to `log` appends a single row.
|
| 31 |
+
"""
|
| 32 |
+
|
| 33 |
+
def __init__(self, filepath: str, fieldnames: Sequence[str]) -> None:
|
| 34 |
+
self.filepath = filepath
|
| 35 |
+
# Handle the case where filepath is in the current directory.
|
| 36 |
+
directory = os.path.dirname(filepath)
|
| 37 |
+
if directory:
|
| 38 |
+
os.makedirs(directory, exist_ok=True)
|
| 39 |
+
|
| 40 |
+
self.fieldnames = list(fieldnames)
|
| 41 |
+
self._init_file()
|
| 42 |
+
|
| 43 |
+
def _init_file(self) -> None:
|
| 44 |
+
"""Create or overwrite the CSV file and write the header row."""
|
| 45 |
+
with open(self.filepath, mode="w", newline="") as f:
|
| 46 |
+
writer = csv.DictWriter(f, fieldnames=self.fieldnames)
|
| 47 |
+
writer.writeheader()
|
| 48 |
+
|
| 49 |
+
def log(self, row_dict: Mapping[str, object]) -> None:
|
| 50 |
+
"""
|
| 51 |
+
Append a single row to the CSV file.
|
| 52 |
+
|
| 53 |
+
Parameters
|
| 54 |
+
----------
|
| 55 |
+
row_dict : Mapping[str, object]
|
| 56 |
+
Dictionary mapping field name to value. Missing keys will be
|
| 57 |
+
written as empty cells; extra keys are ignored.
|
| 58 |
+
"""
|
| 59 |
+
# Project to known fieldnames to avoid surprises.
|
| 60 |
+
row = {k: row_dict.get(k, "") for k in self.fieldnames}
|
| 61 |
+
with open(self.filepath, mode="a", newline="") as f:
|
| 62 |
+
writer = csv.DictWriter(f, fieldnames=self.fieldnames)
|
| 63 |
+
writer.writerow(row)
|
Down/MODEL.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
\# Model Description: Down / AntiDown
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
\## Purpose
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
The Down / AntiDown models are reinforcement learning agents designed to expose and analyze failure modes under deceptive reward conditions. The emphasis is not on maximizing return, but on characterizing instability, collapse, and recovery dynamics.
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
\## Down Agent
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
\*\*Role:\*\*
|
| 18 |
+
|
| 19 |
+
The Down agent represents a learner operating under a corrupted reward signal that remains internally consistent but externally misaligned.
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
\*\*Key Properties:\*\*
|
| 24 |
+
|
| 25 |
+
\- Learns normally during early phases
|
| 26 |
+
|
| 27 |
+
\- Maintains high confidence even as reward becomes deceptive
|
| 28 |
+
|
| 29 |
+
\- Exhibits delayed collapse once misalignment compounds
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
\*\*Observed Behaviors:\*\*
|
| 34 |
+
|
| 35 |
+
\- Prolonged false stability
|
| 36 |
+
|
| 37 |
+
\- Sharp performance cliffs
|
| 38 |
+
|
| 39 |
+
\- Difficulty detecting reward corruption autonomously
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
\## AntiDown Agent
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
\*\*Role:\*\*
|
| 50 |
+
|
| 51 |
+
AntiDown serves as a contrasting hypothesis agent, exposed to the same environment but with altered sensitivity to reward inconsistencies.
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
\*\*Key Properties:\*\*
|
| 56 |
+
|
| 57 |
+
\- Increased sensitivity to instability signals
|
| 58 |
+
|
| 59 |
+
\- Earlier behavioral deviation under reward corruption
|
| 60 |
+
|
| 61 |
+
\- Serves as a comparative probe, not a “better” agent
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
\## Design
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
These models are not meant to be optimal. They are diagnostic instruments designed to surface questions such as:
|
| 72 |
+
|
| 73 |
+
\- When does optimization become actively misleading?
|
| 74 |
+
|
| 75 |
+
\- What internal signals precede collapse?
|
| 76 |
+
|
| 77 |
+
\- Can instability be detected before outcomes degrade?
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
\## Safety
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
Down / AntiDown formalize a common safety failure mode:
|
| 86 |
+
|
| 87 |
+
> Systems that behave correctly until they suddenly don’t — and give no warning when it matters.
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
They are intended as testbeds for studying monitoring, intervention, and robustness rather than performance.
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
|
Down/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
\# Reinforcement Learning under Deceptive Reward
|
| 2 |
+
\## Down / AntiDown
|
| 3 |
+
|
| 4 |
+
This project investigates failure modes in reinforcement learning systems operating under deceptive, corrupted, or mis-specified reward signals. Rather than optimizing for peak performance, the focus is on observing how agents behave when reward feedback becomes unreliable while confidence and apparent stability remain high.
|
| 5 |
+
|
| 6 |
+
The Down / AntiDown pair is designed as a controlled benchmark for studying robustness, collapse, and recovery dynamics under adversarial reward conditions, with direct relevance to AI safety and alignment research.
|
| 7 |
+
|
| 8 |
+
\## Core Idea
|
| 9 |
+
|
| 10 |
+
In many real-world and safety-critical settings, reward signals may be:
|
| 11 |
+
|
| 12 |
+
\- Misaligned with the true task objective
|
| 13 |
+
|
| 14 |
+
\- Delayed, noisy, or partially adversarial
|
| 15 |
+
|
| 16 |
+
\- Temporarily valid and then corrupted
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
This project studies how learning agents respond to these conditions, particularly:
|
| 20 |
+
|
| 21 |
+
\- How long they continue to act confidently under corrupted reward
|
| 22 |
+
|
| 23 |
+
\- Whether collapse occurs abruptly or gradually
|
| 24 |
+
|
| 25 |
+
\- Whether recovery is possible once reward integrity is restored
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
\## Project Structure
|
| 29 |
+
|
| 30 |
+
\- `agents/`
|
| 31 |
+
|
| 32 |
+
#Implementations of the Down and AntiDown agents.
|
| 33 |
+
|
| 34 |
+
\- `envs/`
|
| 35 |
+
|
| 36 |
+
#Custom environments modeling deceptive reward dynamics.
|
| 37 |
+
|
| 38 |
+
\- `run\_all.py`
|
| 39 |
+
|
| 40 |
+
#Entry point to run both Down and AntiDown agents in a unified experimental setup.
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
\## Running the Experiments
|
| 44 |
+
|
| 45 |
+
This project is designed to run without notebooks. (I resorted to Anaconda)
|
| 46 |
+
|
| 47 |
+
```bash
|
| 48 |
+
|
| 49 |
+
conda activate your\_env
|
| 50 |
+
|
| 51 |
+
python run\_all.py
|
| 52 |
+
|
| 53 |
+
Relevance to AI Safety
|
| 54 |
+
|
| 55 |
+
This benchmark targets a known blind spot in current ML evaluation: agents that appear competent while optimizing the wrong objective. It provides concrete tools to study:
|
| 56 |
+
|
| 57 |
+
Misalignment under deceptive feedback
|
| 58 |
+
|
| 59 |
+
Early-warning signals preceding collapse
|
| 60 |
+
|
| 61 |
+
Limits of reward-centric evaluation
|
| 62 |
+
|
| 63 |
+
The project directly supports research on stability-aware and intervention-based safety mechanisms.
|
| 64 |
+
|
Down/down/envs/env_paradox.py
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import numpy as np
|
| 3 |
+
from dataclasses import dataclass
|
| 4 |
+
from typing import Tuple, Dict, Optional
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
@dataclass(frozen=True)
|
| 8 |
+
class ParadoxState:
|
| 9 |
+
"""Structured view of the epistemic state."""
|
| 10 |
+
ambiguity_type: int # 0..2
|
| 11 |
+
evidence_bin: int # 0..2
|
| 12 |
+
risk_level: int # 0..1
|
| 13 |
+
phase: int # 1..3
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class EpistemicValleyEnv:
|
| 17 |
+
"""
|
| 18 |
+
Epistemic Valley Inframe v2
|
| 19 |
+
|
| 20 |
+
Discrete one-step environment modelling epistemic risk under ambiguity.
|
| 21 |
+
|
| 22 |
+
State s = (ambiguity_type, evidence_bin, risk_level, phase)
|
| 23 |
+
- ambiguity_type: 0=lexical, 1=scope, 2=missing-data
|
| 24 |
+
- evidence_bin: 0=low, 1=medium, 2=high
|
| 25 |
+
- risk_level: 0=low, 1=high
|
| 26 |
+
- phase: 1, 2, or 3 (reward regime)
|
| 27 |
+
|
| 28 |
+
Actions:
|
| 29 |
+
0 = HOLD (stay with current uncertainty)
|
| 30 |
+
1 = EXPAND (seek more evidence / broader context)
|
| 31 |
+
2 = CLARIFY (ask a targeted clarification)
|
| 32 |
+
3 = DEFER (explicitly postpone the decision)
|
| 33 |
+
4 = ANSWER (commit to an answer)
|
| 34 |
+
|
| 35 |
+
Episodes are single-step: reset() -> step(action) -> done=True.
|
| 36 |
+
"""
|
| 37 |
+
# actions (kept as attributes so agents can introspect)
|
| 38 |
+
HOLD = 0
|
| 39 |
+
EXPAND = 1
|
| 40 |
+
CLARIFY = 2
|
| 41 |
+
DEFER = 3
|
| 42 |
+
ANSWER = 4
|
| 43 |
+
|
| 44 |
+
def __init__(self, phase: int = 1, seed: Optional[int] = None) -> None:
|
| 45 |
+
assert phase in (1, 2, 3), "phase must be 1, 2 or 3"
|
| 46 |
+
self.ambiguity_types = ["lexical", "scope", "missing-data"]
|
| 47 |
+
self.evidence_bins = ["low", "medium", "high"]
|
| 48 |
+
self.risk_levels = ["low", "high"]
|
| 49 |
+
self.phases = [1, 2, 3]
|
| 50 |
+
|
| 51 |
+
self.n_ambiguity = len(self.ambiguity_types)
|
| 52 |
+
self.n_evidence = len(self.evidence_bins)
|
| 53 |
+
self.n_risk = len(self.risk_levels)
|
| 54 |
+
self.n_phase = len(self.phases)
|
| 55 |
+
|
| 56 |
+
self.n_states = self.n_ambiguity * self.n_evidence * self.n_risk * self.n_phase
|
| 57 |
+
self.n_actions = 5
|
| 58 |
+
|
| 59 |
+
self.phase = phase
|
| 60 |
+
self.rng = np.random.default_rng(seed)
|
| 61 |
+
self.state: Optional[ParadoxState] = None
|
| 62 |
+
self.done: bool = False
|
| 63 |
+
|
| 64 |
+
# ------------------------------------------------------------------
|
| 65 |
+
# state indexing helpers
|
| 66 |
+
# ------------------------------------------------------------------
|
| 67 |
+
def encode_state(self, s: ParadoxState) -> int:
|
| 68 |
+
"""Flatten ParadoxState into [0, n_states)."""
|
| 69 |
+
idx = s.ambiguity_type
|
| 70 |
+
idx = idx * self.n_evidence + s.evidence_bin
|
| 71 |
+
idx = idx * self.n_risk + s.risk_level
|
| 72 |
+
# phase is 1..3, internally we use 0..2
|
| 73 |
+
phase_index = s.phase - 1
|
| 74 |
+
idx = idx * self.n_phase + phase_index
|
| 75 |
+
return idx
|
| 76 |
+
|
| 77 |
+
def decode_state(self, idx: int) -> ParadoxState:
|
| 78 |
+
"""Inverse of encode_state."""
|
| 79 |
+
phase_index = idx % self.n_phase
|
| 80 |
+
idx //= self.n_phase
|
| 81 |
+
risk_level = idx % self.n_risk
|
| 82 |
+
idx //= self.n_risk
|
| 83 |
+
evidence_bin = idx % self.n_evidence
|
| 84 |
+
idx //= self.n_evidence
|
| 85 |
+
ambiguity_type = idx
|
| 86 |
+
return ParadoxState(
|
| 87 |
+
ambiguity_type=int(ambiguity_type),
|
| 88 |
+
evidence_bin=int(evidence_bin),
|
| 89 |
+
risk_level=int(risk_level),
|
| 90 |
+
phase=int(phase_index + 1),
|
| 91 |
+
)
|
| 92 |
+
|
| 93 |
+
# ------------------------------------------------------------------
|
| 94 |
+
# core env API
|
| 95 |
+
# ------------------------------------------------------------------
|
| 96 |
+
def _sample_state(self) -> ParadoxState:
|
| 97 |
+
a = int(self.rng.integers(0, self.n_ambiguity))
|
| 98 |
+
e = int(self.rng.integers(0, self.n_evidence))
|
| 99 |
+
r = int(self.rng.integers(0, self.n_risk))
|
| 100 |
+
return ParadoxState(
|
| 101 |
+
ambiguity_type=a,
|
| 102 |
+
evidence_bin=e,
|
| 103 |
+
risk_level=r,
|
| 104 |
+
phase=self.phase,
|
| 105 |
+
)
|
| 106 |
+
|
| 107 |
+
def reset(self) -> Tuple[int, Dict]:
|
| 108 |
+
"""Sample a new epistemic state and return its index + info."""
|
| 109 |
+
self.state = self._sample_state()
|
| 110 |
+
self.done = False
|
| 111 |
+
s_idx = self.encode_state(self.state)
|
| 112 |
+
return s_idx, {"state": self.state}
|
| 113 |
+
|
| 114 |
+
def step(self, action: int) -> Tuple[int, float, bool, Dict]:
|
| 115 |
+
"""Apply one action, return (next_state_index, reward, done, info)."""
|
| 116 |
+
assert self.state is not None, "Call reset() before step()."
|
| 117 |
+
s = self.state
|
| 118 |
+
reward, failure_mode = self._reward(s, action)
|
| 119 |
+
self.done = True
|
| 120 |
+
info = {
|
| 121 |
+
"state": s,
|
| 122 |
+
"failure_mode": failure_mode,
|
| 123 |
+
}
|
| 124 |
+
# one-step episode; next state is irrelevant for this env
|
| 125 |
+
return self.encode_state(s), float(reward), self.done, info
|
| 126 |
+
|
| 127 |
+
# ------------------------------------------------------------------
|
| 128 |
+
# reward function
|
| 129 |
+
# ------------------------------------------------------------------
|
| 130 |
+
def _reward(self, s: ParadoxState, action: int) -> Tuple[float, str]:
|
| 131 |
+
"""
|
| 132 |
+
Reward shaped by:
|
| 133 |
+
- evidence / risk alignment
|
| 134 |
+
- failure mode (overconfident vs overcautious)
|
| 135 |
+
- phase (reward regime and noise)
|
| 136 |
+
|
| 137 |
+
We implement a clean, reproducible version matching the narrative in
|
| 138 |
+
the original MODELS document: aggressive actions are good when
|
| 139 |
+
evidence is strong and risk is low, dangerous when evidence is weak
|
| 140 |
+
and risk is high, and conservative actions behave inversely.
|
| 141 |
+
"""
|
| 142 |
+
e_str = self.evidence_bins[s.evidence_bin]
|
| 143 |
+
r_str = self.risk_levels[s.risk_level]
|
| 144 |
+
phase = s.phase
|
| 145 |
+
|
| 146 |
+
high_risk = (r_str == "high")
|
| 147 |
+
low_risk = (r_str == "low")
|
| 148 |
+
low_evidence = (e_str == "low")
|
| 149 |
+
high_evidence = (e_str == "high")
|
| 150 |
+
|
| 151 |
+
failure_mode = "neutral"
|
| 152 |
+
base = 0.0
|
| 153 |
+
|
| 154 |
+
# --- classify aggressive vs conservative actions ---
|
| 155 |
+
aggressive = action in (self.EXPAND, self.ANSWER)
|
| 156 |
+
conservative = action in (self.HOLD, self.DEFER)
|
| 157 |
+
|
| 158 |
+
# --- base reward logic before phase-specific shaping ---
|
| 159 |
+
if aggressive and high_risk and low_evidence:
|
| 160 |
+
# archetypal overconfidence: answer aggressively with little support
|
| 161 |
+
base = -2.0
|
| 162 |
+
failure_mode = "overconfident"
|
| 163 |
+
elif conservative and low_risk and high_evidence:
|
| 164 |
+
# archetypal overcautious: you could answer safely but you freeze
|
| 165 |
+
base = -0.8
|
| 166 |
+
failure_mode = "overcautious"
|
| 167 |
+
else:
|
| 168 |
+
# reasonably aligned choices
|
| 169 |
+
if aggressive and high_evidence and low_risk:
|
| 170 |
+
base = +2.0
|
| 171 |
+
elif aggressive and not (high_risk and low_evidence):
|
| 172 |
+
base = +0.8
|
| 173 |
+
elif conservative and high_risk and low_evidence:
|
| 174 |
+
base = +1.2
|
| 175 |
+
else:
|
| 176 |
+
base = 0.0
|
| 177 |
+
|
| 178 |
+
# --- phase-specific shaping ---
|
| 179 |
+
if phase == 1:
|
| 180 |
+
# Slight bonus for successful aggressive behaviour
|
| 181 |
+
if aggressive and base > 0:
|
| 182 |
+
base += 0.5
|
| 183 |
+
elif phase == 2:
|
| 184 |
+
# Harsher overconfidence penalty
|
| 185 |
+
if failure_mode == "overconfident":
|
| 186 |
+
base -= 1.0
|
| 187 |
+
elif phase == 3:
|
| 188 |
+
# Noisy feedback regime
|
| 189 |
+
noise = float(self.rng.normal(0.0, 0.5))
|
| 190 |
+
base += noise
|
| 191 |
+
base = float(np.clip(base, -3.0, 3.0))
|
| 192 |
+
|
| 193 |
+
return base, failure_mode
|
Down/down/exp/plot_paradox_results.py
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Plot results produced by exp/run_paradox_tabular.py.
|
| 2 |
+
|
| 3 |
+
Creates PNG plots under down/graphics/.
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
from __future__ import annotations
|
| 7 |
+
|
| 8 |
+
import csv
|
| 9 |
+
import os
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
from typing import Dict, List
|
| 12 |
+
|
| 13 |
+
import matplotlib.pyplot as plt
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
def _load_csv(path: Path) -> List[Dict[str, str]]:
|
| 17 |
+
with path.open("r", newline="") as f:
|
| 18 |
+
return list(csv.DictReader(f))
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def main() -> None:
|
| 22 |
+
quark_dir = Path(__file__).resolve().parents[1] # .../down
|
| 23 |
+
results_dir = Path(os.environ.get("TWOQUARKS_RESULTS_DIR", (quark_dir / "results").as_posix()))
|
| 24 |
+
graphics_dir = Path(os.environ.get("TWOQUARKS_GRAPHICS_DIR", (quark_dir / "graphics").as_posix()))
|
| 25 |
+
results_dir.mkdir(parents=True, exist_ok=True)
|
| 26 |
+
graphics_dir.mkdir(parents=True, exist_ok=True)
|
| 27 |
+
results_csv = results_dir / "down_paradox_tabular_results.csv"
|
| 28 |
+
|
| 29 |
+
if not results_csv.exists():
|
| 30 |
+
raise FileNotFoundError(f"Missing results CSV: {results_csv}")
|
| 31 |
+
|
| 32 |
+
rows = _load_csv(results_csv)
|
| 33 |
+
if not rows:
|
| 34 |
+
raise RuntimeError(f"CSV is empty: {results_csv}")
|
| 35 |
+
|
| 36 |
+
# Normalize columns (older versions used episode_reward/rho_state)
|
| 37 |
+
def to_float(x: str) -> float:
|
| 38 |
+
try:
|
| 39 |
+
return float(x)
|
| 40 |
+
except Exception:
|
| 41 |
+
return float("nan")
|
| 42 |
+
|
| 43 |
+
# Build per-agent series
|
| 44 |
+
agents = sorted({r.get("agent", "unknown") for r in rows})
|
| 45 |
+
xs_all = [int(r.get("global_episode", r.get("episode", 0)) or 0) for r in rows]
|
| 46 |
+
|
| 47 |
+
# Episode reward plot
|
| 48 |
+
plt.figure()
|
| 49 |
+
for a in agents:
|
| 50 |
+
xs = [int(r.get("global_episode", r.get("episode", 0)) or 0) for r in rows if r.get("agent") == a]
|
| 51 |
+
ys = [to_float(r.get("episode_reward", r.get("return", "nan"))) for r in rows if r.get("agent") == a]
|
| 52 |
+
if xs:
|
| 53 |
+
plt.plot(xs, ys, label=a)
|
| 54 |
+
plt.xlabel("Global episode")
|
| 55 |
+
plt.ylabel("Episode reward")
|
| 56 |
+
plt.title("DOWN: reward over training")
|
| 57 |
+
plt.legend()
|
| 58 |
+
out1 = graphics_dir / "down_paradox_tabular_reward.png"
|
| 59 |
+
plt.savefig(out1, dpi=160, bbox_inches="tight")
|
| 60 |
+
plt.close()
|
| 61 |
+
|
| 62 |
+
# Rho plot (if present)
|
| 63 |
+
if any(("rho_state" in r) for r in rows) or any(("rho" in r) for r in rows):
|
| 64 |
+
plt.figure()
|
| 65 |
+
for a in agents:
|
| 66 |
+
xs = [int(r.get("global_episode", r.get("episode", 0)) or 0) for r in rows if r.get("agent") == a]
|
| 67 |
+
ys = [to_float(r.get("rho_state", r.get("rho", "nan"))) for r in rows if r.get("agent") == a]
|
| 68 |
+
if xs:
|
| 69 |
+
plt.plot(xs, ys, label=a)
|
| 70 |
+
plt.xlabel("Global episode")
|
| 71 |
+
plt.ylabel("rho")
|
| 72 |
+
plt.title("DOWN: rho over training")
|
| 73 |
+
plt.legend()
|
| 74 |
+
out2 = graphics_dir / "down_paradox_tabular_rho.png"
|
| 75 |
+
plt.savefig(out2, dpi=160, bbox_inches="tight")
|
| 76 |
+
plt.close()
|
| 77 |
+
|
| 78 |
+
print(f"Saved plots to {graphics_dir}")
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
if __name__ == "__main__":
|
| 82 |
+
main()
|
Down/down/exp/run_paradox_ppo_hybrid.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import csv
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
from pathlib import Path
|
| 8 |
+
import sys
|
| 9 |
+
|
| 10 |
+
_THIS_DIR = Path(__file__).resolve().parent
|
| 11 |
+
_QUARK_DIR = _THIS_DIR.parent
|
| 12 |
+
if str(_QUARK_DIR) not in sys.path:
|
| 13 |
+
sys.path.insert(0, str(_QUARK_DIR))
|
| 14 |
+
|
| 15 |
+
from envs.env_paradox import EpistemicValleyEnv
|
| 16 |
+
from levo.agent_levo_paradox import HFLevoAgent, LevoParadoxIsomerAgent
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def run_ppo_hybrid(
|
| 20 |
+
out_csv: str | Path,
|
| 21 |
+
episodes_per_phase: int = 400,
|
| 22 |
+
seed: int = 2025,
|
| 23 |
+
update_every: int = 256,
|
| 24 |
+
) -> None:
|
| 25 |
+
"""
|
| 26 |
+
Train the Levo Paradox PPO Hybrid engine on Epistemic Valley and log results.
|
| 27 |
+
|
| 28 |
+
We keep the same CSV schema as the tabular runner, plus the PPO-specific
|
| 29 |
+
rho estimate for the visited state.
|
| 30 |
+
"""
|
| 31 |
+
out_path = Path(out_csv)
|
| 32 |
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
| 33 |
+
|
| 34 |
+
rng = np.random.default_rng(seed)
|
| 35 |
+
|
| 36 |
+
# probe env for shapes
|
| 37 |
+
probe_env = EpistemicValleyEnv(phase=1, seed=seed)
|
| 38 |
+
n_states = probe_env.n_states
|
| 39 |
+
n_actions = probe_env.n_actions
|
| 40 |
+
|
| 41 |
+
agent = LevoParadoxPPOHybrid(
|
| 42 |
+
n_states=n_states,
|
| 43 |
+
n_actions=n_actions,
|
| 44 |
+
seed=seed,
|
| 45 |
+
)
|
| 46 |
+
|
| 47 |
+
global_ep = 0
|
| 48 |
+
steps_since_update = 0
|
| 49 |
+
|
| 50 |
+
with out_path.open("w", newline="") as f:
|
| 51 |
+
writer = csv.DictWriter(
|
| 52 |
+
f,
|
| 53 |
+
fieldnames=[
|
| 54 |
+
"global_episode",
|
| 55 |
+
"phase",
|
| 56 |
+
"episode",
|
| 57 |
+
"env_seed",
|
| 58 |
+
"agent",
|
| 59 |
+
"episode_reward",
|
| 60 |
+
"failure_mode",
|
| 61 |
+
"rho_state",
|
| 62 |
+
],
|
| 63 |
+
)
|
| 64 |
+
writer.writeheader()
|
| 65 |
+
|
| 66 |
+
for phase in (1, 2, 3):
|
| 67 |
+
for local_ep in range(episodes_per_phase):
|
| 68 |
+
env_seed = int(rng.integers(0, 2**31 - 1))
|
| 69 |
+
env = EpistemicValleyEnv(phase=phase, seed=env_seed)
|
| 70 |
+
|
| 71 |
+
s_idx, info = env.reset()
|
| 72 |
+
action, logp, value_est, rho_est = agent.select_action(s_idx)
|
| 73 |
+
s_next_idx, reward, done, step_info = env.step(action)
|
| 74 |
+
failure_mode = step_info.get("failure_mode", "neutral")
|
| 75 |
+
|
| 76 |
+
agent.store_transition(
|
| 77 |
+
s_idx=s_idx,
|
| 78 |
+
action=action,
|
| 79 |
+
reward=reward,
|
| 80 |
+
log_prob=logp,
|
| 81 |
+
value=value_est,
|
| 82 |
+
rho=rho_est,
|
| 83 |
+
failure_mode=failure_mode,
|
| 84 |
+
)
|
| 85 |
+
|
| 86 |
+
writer.writerow(
|
| 87 |
+
{
|
| 88 |
+
"global_episode": global_ep,
|
| 89 |
+
"phase": phase,
|
| 90 |
+
"episode": local_ep,
|
| 91 |
+
"env_seed": env_seed,
|
| 92 |
+
"agent": "LevoParadoxPPOHybrid",
|
| 93 |
+
"episode_reward": float(reward),
|
| 94 |
+
"failure_mode": failure_mode,
|
| 95 |
+
"rho_state": rho_est,
|
| 96 |
+
}
|
| 97 |
+
)
|
| 98 |
+
|
| 99 |
+
global_ep += 1
|
| 100 |
+
steps_since_update += 1
|
| 101 |
+
|
| 102 |
+
if steps_since_update >= update_every:
|
| 103 |
+
agent.update()
|
| 104 |
+
steps_since_update = 0
|
| 105 |
+
|
| 106 |
+
# final update with any remaining samples
|
| 107 |
+
if steps_since_update > 0:
|
| 108 |
+
agent.update()
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
if __name__ == "__main__":
|
| 112 |
+
run_ppo_hybrid((_QUARK_DIR / "results/paradox_ppo_results.csv").as_posix(), episodes_per_phase=400)
|
Down/down/exp/run_paradox_tabular.py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
# --- twoquarks bootstrap (path-stable imports) ---
|
| 3 |
+
import sys
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
_ROOT = Path(__file__).resolve().parents[1] # project root (sibling of exp/)
|
| 6 |
+
if str(_ROOT) not in sys.path:
|
| 7 |
+
sys.path.insert(0, str(_ROOT))
|
| 8 |
+
# -------------------------------------------------
|
| 9 |
+
|
| 10 |
+
import csv
|
| 11 |
+
import os
|
| 12 |
+
from pathlib import Path
|
| 13 |
+
import sys
|
| 14 |
+
|
| 15 |
+
import numpy as np
|
| 16 |
+
|
| 17 |
+
# Robust imports regardless of where python is launched from.
|
| 18 |
+
_THIS_DIR = Path(__file__).resolve().parent
|
| 19 |
+
_QUARK_DIR = _THIS_DIR.parent # .../down
|
| 20 |
+
_PROJECT_DIR = _QUARK_DIR.parent # .../Down
|
| 21 |
+
|
| 22 |
+
if str(_QUARK_DIR) not in sys.path:
|
| 23 |
+
sys.path.insert(0, str(_QUARK_DIR))
|
| 24 |
+
|
| 25 |
+
from envs.env_paradox import EpistemicValleyEnv
|
| 26 |
+
from levo.agent_levo_paradox import HFLevoAgent, LevoParadoxIsomerAgent
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def run_experiment(
|
| 30 |
+
out_csv: str | Path,
|
| 31 |
+
episodes_per_phase: int = 400,
|
| 32 |
+
seed: int = 2025,
|
| 33 |
+
) -> None:
|
| 34 |
+
"""
|
| 35 |
+
Run HF-Levo and Levo Paradox tabular agents and log results to CSV.
|
| 36 |
+
|
| 37 |
+
The CSV schema is:
|
| 38 |
+
|
| 39 |
+
global_episode,phase,episode,env_seed,agent,episode_reward,failure_mode,rho_state
|
| 40 |
+
"""
|
| 41 |
+
out_path = Path(out_csv)
|
| 42 |
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
| 43 |
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
| 44 |
+
|
| 45 |
+
rng = np.random.default_rng(seed)
|
| 46 |
+
|
| 47 |
+
# env for shape information only
|
| 48 |
+
probe_env = EpistemicValleyEnv(phase=1, seed=seed)
|
| 49 |
+
n_states = probe_env.n_states
|
| 50 |
+
n_actions = probe_env.n_actions
|
| 51 |
+
|
| 52 |
+
agents = [
|
| 53 |
+
HFLevoAgent(n_states, n_actions, seed=seed),
|
| 54 |
+
LevoParadoxIsomerAgent(n_states, n_actions, seed=seed + 1),
|
| 55 |
+
]
|
| 56 |
+
agent_names = ["HFLevo", "LevoParadoxIsomer"]
|
| 57 |
+
|
| 58 |
+
global_ep = 0
|
| 59 |
+
|
| 60 |
+
with out_path.open("w", newline="") as f:
|
| 61 |
+
writer = csv.DictWriter(
|
| 62 |
+
f,
|
| 63 |
+
fieldnames=[
|
| 64 |
+
"global_episode",
|
| 65 |
+
"phase",
|
| 66 |
+
"episode",
|
| 67 |
+
"env_seed",
|
| 68 |
+
"agent",
|
| 69 |
+
"episode_reward",
|
| 70 |
+
"failure_mode",
|
| 71 |
+
"rho_state",
|
| 72 |
+
],
|
| 73 |
+
)
|
| 74 |
+
writer.writeheader()
|
| 75 |
+
|
| 76 |
+
for phase in (1, 2, 3):
|
| 77 |
+
for local_ep in range(episodes_per_phase):
|
| 78 |
+
env_seed = int(rng.integers(0, 2**31 - 1))
|
| 79 |
+
|
| 80 |
+
for agent, name in zip(agents, agent_names, strict=True):
|
| 81 |
+
env = EpistemicValleyEnv(phase=phase, seed=env_seed)
|
| 82 |
+
s_idx, info = env.reset()
|
| 83 |
+
a = agent.select_action(s_idx)
|
| 84 |
+
s_next_idx, reward, done, step_info = env.step(a)
|
| 85 |
+
|
| 86 |
+
failure_mode = step_info.get("failure_mode", "neutral")
|
| 87 |
+
|
| 88 |
+
rho_state = (
|
| 89 |
+
float(getattr(agent, "rho")[s_idx]) # type: ignore[attr-defined]
|
| 90 |
+
if hasattr(agent, "rho")
|
| 91 |
+
else float("nan")
|
| 92 |
+
)
|
| 93 |
+
|
| 94 |
+
agent.update(
|
| 95 |
+
s_idx=s_idx,
|
| 96 |
+
a=a,
|
| 97 |
+
r=reward,
|
| 98 |
+
s_next_idx=s_next_idx,
|
| 99 |
+
done=done,
|
| 100 |
+
failure_mode=failure_mode,
|
| 101 |
+
)
|
| 102 |
+
|
| 103 |
+
writer.writerow(
|
| 104 |
+
{
|
| 105 |
+
"global_episode": global_ep,
|
| 106 |
+
"phase": phase,
|
| 107 |
+
"episode": local_ep,
|
| 108 |
+
"env_seed": env_seed,
|
| 109 |
+
"agent": name,
|
| 110 |
+
"episode_reward": float(reward),
|
| 111 |
+
"failure_mode": failure_mode,
|
| 112 |
+
"rho_state": rho_state,
|
| 113 |
+
}
|
| 114 |
+
)
|
| 115 |
+
|
| 116 |
+
global_ep += 1
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
if __name__ == "__main__":
|
| 120 |
+
# Allow a caller (e.g., run_all.py) to route outputs to a shared folder.
|
| 121 |
+
_results_dir = Path(os.environ.get("TWOQUARKS_RESULTS_DIR", (_QUARK_DIR / "results").as_posix()))
|
| 122 |
+
_results_dir.mkdir(parents=True, exist_ok=True)
|
| 123 |
+
_out_csv = _results_dir / "down_paradox_tabular_results.csv"
|
| 124 |
+
run_experiment(_out_csv.as_posix(), episodes_per_phase=400)
|
Down/down/levo/agent_levo_paradox.py
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import math
|
| 5 |
+
from dataclasses import dataclass
|
| 6 |
+
from typing import List, Tuple, Optional, Dict
|
| 7 |
+
|
| 8 |
+
import numpy as np
|
| 9 |
+
|
| 10 |
+
try:
|
| 11 |
+
import torch
|
| 12 |
+
import torch.nn as nn
|
| 13 |
+
import torch.optim as optim
|
| 14 |
+
except Exception: # pragma: no cover - torch might not be installed
|
| 15 |
+
torch = None # type: ignore[assignment]
|
| 16 |
+
nn = object # type: ignore[assignment]
|
| 17 |
+
optim = object # type: ignore[assignment]
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
# ---------------------------------------------------------------------------
|
| 21 |
+
# Tabular baselines (HF-Levo + isomeric Levo Paradox)
|
| 22 |
+
# ---------------------------------------------------------------------------
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
class HFLevoAgent:
|
| 26 |
+
"""
|
| 27 |
+
Single-head HF-Levo baseline agent.
|
| 28 |
+
|
| 29 |
+
A simple Q-learning agent whose exploration temperature is modulated
|
| 30 |
+
by a high-frequency term:
|
| 31 |
+
|
| 32 |
+
T_t = tau * (1 + A * sin(omega * t))
|
| 33 |
+
|
| 34 |
+
This creates oscillatory exploration / exploitation cycles.
|
| 35 |
+
"""
|
| 36 |
+
|
| 37 |
+
def __init__(
|
| 38 |
+
self,
|
| 39 |
+
n_states: int,
|
| 40 |
+
n_actions: int,
|
| 41 |
+
A: float = 0.5,
|
| 42 |
+
omega: float = 0.05,
|
| 43 |
+
tau: float = 0.7,
|
| 44 |
+
alpha: float = 0.1,
|
| 45 |
+
gamma: float = 0.95,
|
| 46 |
+
seed: Optional[int] = None,
|
| 47 |
+
) -> None:
|
| 48 |
+
self.n_states = n_states
|
| 49 |
+
self.n_actions = n_actions
|
| 50 |
+
self.A = A
|
| 51 |
+
self.omega = omega
|
| 52 |
+
self.tau = tau
|
| 53 |
+
self.alpha = alpha
|
| 54 |
+
self.gamma = gamma
|
| 55 |
+
|
| 56 |
+
self.Q = np.zeros((n_states, n_actions), dtype=np.float32)
|
| 57 |
+
self.rng = np.random.default_rng(seed)
|
| 58 |
+
self.t = 0
|
| 59 |
+
|
| 60 |
+
def _temperature(self) -> float:
|
| 61 |
+
return float(self.tau * (1.0 + self.A * math.sin(self.omega * self.t)))
|
| 62 |
+
|
| 63 |
+
def _softmax(self, q: np.ndarray, temp: float) -> np.ndarray:
|
| 64 |
+
z = q - np.max(q)
|
| 65 |
+
e = np.exp(z / max(temp, 1e-6))
|
| 66 |
+
return e / e.sum()
|
| 67 |
+
|
| 68 |
+
def select_action(self, s_idx: int) -> int:
|
| 69 |
+
temp = self._temperature()
|
| 70 |
+
probs = self._softmax(self.Q[s_idx], temp)
|
| 71 |
+
a = int(self.rng.choice(self.n_actions, p=probs))
|
| 72 |
+
self.t += 1
|
| 73 |
+
return a
|
| 74 |
+
|
| 75 |
+
def update(
|
| 76 |
+
self,
|
| 77 |
+
s_idx: int,
|
| 78 |
+
a: int,
|
| 79 |
+
r: float,
|
| 80 |
+
s_next_idx: int,
|
| 81 |
+
done: bool,
|
| 82 |
+
failure_mode: str,
|
| 83 |
+
) -> None:
|
| 84 |
+
q = self.Q
|
| 85 |
+
target = r if done else (r + self.gamma * float(np.max(q[s_next_idx])))
|
| 86 |
+
delta = target - float(q[s_idx, a])
|
| 87 |
+
q[s_idx, a] += self.alpha * delta
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
class LevoParadoxIsomerAgent:
|
| 91 |
+
"""
|
| 92 |
+
Isomeric tabular agent with conservative and aggressive Q-functions.
|
| 93 |
+
|
| 94 |
+
Two heads Q_L (conservative) and Q_R (aggressive) are mixed by a
|
| 95 |
+
contextual polarization rho[s] in [0, 1]:
|
| 96 |
+
|
| 97 |
+
Q_mix[s] = (1 - rho[s]) * Q_L[s] + rho[s] * Q_R[s]
|
| 98 |
+
|
| 99 |
+
Polarization is nudged by failure modes reported by the environment:
|
| 100 |
+
- "overconfident" -> push rho down (more conservative)
|
| 101 |
+
- "overcautious" -> push rho up (more aggressive)
|
| 102 |
+
"""
|
| 103 |
+
|
| 104 |
+
def __init__(
|
| 105 |
+
self,
|
| 106 |
+
n_states: int,
|
| 107 |
+
n_actions: int,
|
| 108 |
+
tau: float = 0.7,
|
| 109 |
+
alpha: float = 0.1,
|
| 110 |
+
gamma: float = 0.95,
|
| 111 |
+
eta: float = 0.05,
|
| 112 |
+
seed: Optional[int] = None,
|
| 113 |
+
) -> None:
|
| 114 |
+
self.n_states = n_states
|
| 115 |
+
self.n_actions = n_actions
|
| 116 |
+
self.tau = tau
|
| 117 |
+
self.alpha = alpha
|
| 118 |
+
self.gamma = gamma
|
| 119 |
+
self.eta = eta
|
| 120 |
+
|
| 121 |
+
self.Q_L = np.zeros((n_states, n_actions), dtype=np.float32)
|
| 122 |
+
self.Q_R = np.zeros((n_states, n_actions), dtype=np.float32)
|
| 123 |
+
self.rho = np.full(n_states, 0.5, dtype=np.float32)
|
| 124 |
+
|
| 125 |
+
self.rng = np.random.default_rng(seed)
|
| 126 |
+
|
| 127 |
+
def _softmax(self, x: np.ndarray) -> np.ndarray:
|
| 128 |
+
z = x - np.max(x)
|
| 129 |
+
e = np.exp(z / max(self.tau, 1e-6))
|
| 130 |
+
return e / e.sum()
|
| 131 |
+
|
| 132 |
+
def select_action(self, s_idx: int) -> int:
|
| 133 |
+
rho_s = float(self.rho[s_idx])
|
| 134 |
+
q_mix = (1.0 - rho_s) * self.Q_L[s_idx] + rho_s * self.Q_R[s_idx]
|
| 135 |
+
probs = self._softmax(q_mix)
|
| 136 |
+
a = int(self.rng.choice(self.n_actions, p=probs))
|
| 137 |
+
return a
|
| 138 |
+
|
| 139 |
+
def update(
|
| 140 |
+
self,
|
| 141 |
+
s_idx: int,
|
| 142 |
+
a: int,
|
| 143 |
+
r: float,
|
| 144 |
+
s_next_idx: int,
|
| 145 |
+
done: bool,
|
| 146 |
+
failure_mode: str,
|
| 147 |
+
) -> None:
|
| 148 |
+
# choose learning head: conservative for overconfidence,
|
| 149 |
+
# aggressive for overcautious, otherwise both share credit.
|
| 150 |
+
if failure_mode == "overconfident":
|
| 151 |
+
heads = ("L",)
|
| 152 |
+
elif failure_mode == "overcautious":
|
| 153 |
+
heads = ("R",)
|
| 154 |
+
else:
|
| 155 |
+
heads = ("L", "R")
|
| 156 |
+
|
| 157 |
+
for h in heads:
|
| 158 |
+
Q = self.Q_L if h == "L" else self.Q_R
|
| 159 |
+
target = r if done else (r + self.gamma * float(np.max(Q[s_next_idx])))
|
| 160 |
+
delta = target - float(Q[s_idx, a])
|
| 161 |
+
Q[s_idx, a] += self.alpha * delta
|
| 162 |
+
|
| 163 |
+
# polarization update
|
| 164 |
+
if failure_mode == "overconfident":
|
| 165 |
+
self.rho[s_idx] = np.clip(self.rho[s_idx] - self.eta, 0.0, 1.0)
|
| 166 |
+
elif failure_mode == "overcautious":
|
| 167 |
+
self.rho[s_idx] = np.clip(self.rho[s_idx] + self.eta, 0.0, 1.0)
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
# ---------------------------------------------------------------------------
|
| 171 |
+
# PPO Hybrid Engine (GPU-ready, isomeric actor-critic)
|
| 172 |
+
# ---------------------------------------------------------------------------
|
| 173 |
+
|
| 174 |
+
|
| 175 |
+
@dataclass
|
| 176 |
+
class Transition:
|
| 177 |
+
state_idx: int
|
| 178 |
+
action: int
|
| 179 |
+
reward: float
|
| 180 |
+
log_prob: float
|
| 181 |
+
value: float
|
| 182 |
+
rho: float
|
| 183 |
+
failure_mode: str
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
class ParadoxActorCritic(nn.Module): # type: ignore[misc]
|
| 187 |
+
"""
|
| 188 |
+
Isomeric actor-critic.
|
| 189 |
+
|
| 190 |
+
- shared MLP trunk over a one-hot encoding of the discrete state
|
| 191 |
+
- two actor heads: conservative vs aggressive
|
| 192 |
+
- one scalar gating head producing rho(s) in [0, 1]
|
| 193 |
+
- one critic head V(s)
|
| 194 |
+
|
| 195 |
+
The final policy is a mixture of the two isomers, combined inside the
|
| 196 |
+
logits space and fed through softmax.
|
| 197 |
+
"""
|
| 198 |
+
|
| 199 |
+
def __init__(self, n_states: int, n_actions: int, hidden_dim: int = 128) -> None:
|
| 200 |
+
super().__init__()
|
| 201 |
+
self.n_states = n_states
|
| 202 |
+
self.n_actions = n_actions
|
| 203 |
+
|
| 204 |
+
self.trunk = nn.Sequential(
|
| 205 |
+
nn.Linear(n_states, hidden_dim),
|
| 206 |
+
nn.ReLU(),
|
| 207 |
+
nn.Linear(hidden_dim, hidden_dim),
|
| 208 |
+
nn.ReLU(),
|
| 209 |
+
)
|
| 210 |
+
self.actor_cons = nn.Linear(hidden_dim, n_actions)
|
| 211 |
+
self.actor_aggr = nn.Linear(hidden_dim, n_actions)
|
| 212 |
+
self.gate = nn.Linear(hidden_dim, 1)
|
| 213 |
+
self.critic = nn.Linear(hidden_dim, 1)
|
| 214 |
+
|
| 215 |
+
def forward(self, state_one_hot: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
|
| 216 |
+
z = self.trunk(state_one_hot)
|
| 217 |
+
logits_cons = self.actor_cons(z)
|
| 218 |
+
logits_aggr = self.actor_aggr(z)
|
| 219 |
+
rho = torch.sigmoid(self.gate(z)) # [B, 1]
|
| 220 |
+
value = self.critic(z).squeeze(-1) # [B]
|
| 221 |
+
|
| 222 |
+
# mixture in logit space
|
| 223 |
+
logits_mix = (1.0 - rho) * logits_cons + rho * logits_aggr
|
| 224 |
+
return logits_mix, value, rho.squeeze(-1), logits_cons * 1.0 # last term unused but can help debugging
|
| 225 |
+
|
| 226 |
+
|
| 227 |
+
class LevoParadoxPPOHybrid:
|
| 228 |
+
"""
|
| 229 |
+
GPU-ready PPO hybrid engine with isomeric policy.
|
| 230 |
+
|
| 231 |
+
This agent combines:
|
| 232 |
+
- an isomeric actor (conservative + aggressive heads),
|
| 233 |
+
- a gating network rho(s) trained end-to-end,
|
| 234 |
+
- PPO-style clipped policy updates,
|
| 235 |
+
- and a value baseline for variance reduction.
|
| 236 |
+
|
| 237 |
+
It operates directly on the discrete Epistemic Valley state space using
|
| 238 |
+
a one-hot encoding, which keeps things simple and fully reproducible.
|
| 239 |
+
"""
|
| 240 |
+
|
| 241 |
+
def __init__(
|
| 242 |
+
self,
|
| 243 |
+
n_states: int,
|
| 244 |
+
n_actions: int,
|
| 245 |
+
gamma: float = 0.99,
|
| 246 |
+
lam: float = 0.95,
|
| 247 |
+
clip_eps: float = 0.2,
|
| 248 |
+
entropy_coef: float = 0.01,
|
| 249 |
+
value_coef: float = 0.5,
|
| 250 |
+
lr: float = 3e-4,
|
| 251 |
+
batch_size: int = 256,
|
| 252 |
+
update_epochs: int = 8,
|
| 253 |
+
seed: Optional[int] = None,
|
| 254 |
+
) -> None:
|
| 255 |
+
if torch is None:
|
| 256 |
+
raise RuntimeError("PyTorch is required for LevoParadoxPPOHybrid.")
|
| 257 |
+
|
| 258 |
+
self.n_states = n_states
|
| 259 |
+
self.n_actions = n_actions
|
| 260 |
+
self.gamma = gamma
|
| 261 |
+
self.lam = lam
|
| 262 |
+
self.clip_eps = clip_eps
|
| 263 |
+
self.entropy_coef = entropy_coef
|
| 264 |
+
self.value_coef = value_coef
|
| 265 |
+
self.batch_size = batch_size
|
| 266 |
+
self.update_epochs = update_epochs
|
| 267 |
+
|
| 268 |
+
if seed is not None:
|
| 269 |
+
torch.manual_seed(seed)
|
| 270 |
+
np.random.seed(seed)
|
| 271 |
+
|
| 272 |
+
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 273 |
+
self.net = ParadoxActorCritic(n_states, n_actions).to(self.device)
|
| 274 |
+
self.optimizer = optim.Adam(self.net.parameters(), lr=lr)
|
| 275 |
+
|
| 276 |
+
self.buffer: List[Transition] = []
|
| 277 |
+
|
| 278 |
+
# ---------------------------- utilities -----------------------------
|
| 279 |
+
|
| 280 |
+
def _one_hot(self, idx: np.ndarray | int) -> torch.Tensor:
|
| 281 |
+
idx_arr = np.atleast_1d(idx).astype(np.int64)
|
| 282 |
+
x = np.zeros((idx_arr.shape[0], self.n_states), dtype=np.float32)
|
| 283 |
+
x[np.arange(idx_arr.shape[0]), idx_arr] = 1.0
|
| 284 |
+
return torch.from_numpy(x).to(self.device)
|
| 285 |
+
|
| 286 |
+
# ---------------------------- interaction ---------------------------
|
| 287 |
+
|
| 288 |
+
def select_action(self, s_idx: int) -> Tuple[int, float, float, float]:
|
| 289 |
+
"""Return (action, log_prob, value_estimate, rho)."""
|
| 290 |
+
self.net.eval()
|
| 291 |
+
state_one_hot = self._one_hot(s_idx)
|
| 292 |
+
logits_mix, value, rho, _ = self.net(state_one_hot) # type: ignore[misc]
|
| 293 |
+
dist = torch.distributions.Categorical(logits=logits_mix)
|
| 294 |
+
action = dist.sample()
|
| 295 |
+
log_prob = dist.log_prob(action)
|
| 296 |
+
return int(action.item()), float(log_prob.item()), float(value.item()), float(rho.item())
|
| 297 |
+
|
| 298 |
+
def store_transition(
|
| 299 |
+
self,
|
| 300 |
+
s_idx: int,
|
| 301 |
+
action: int,
|
| 302 |
+
reward: float,
|
| 303 |
+
log_prob: float,
|
| 304 |
+
value: float,
|
| 305 |
+
rho: float,
|
| 306 |
+
failure_mode: str,
|
| 307 |
+
) -> None:
|
| 308 |
+
self.buffer.append(
|
| 309 |
+
Transition(
|
| 310 |
+
state_idx=int(s_idx),
|
| 311 |
+
action=int(action),
|
| 312 |
+
reward=float(reward),
|
| 313 |
+
log_prob=float(log_prob),
|
| 314 |
+
value=float(value),
|
| 315 |
+
rho=float(rho),
|
| 316 |
+
failure_mode=failure_mode,
|
| 317 |
+
)
|
| 318 |
+
)
|
| 319 |
+
|
| 320 |
+
# ---------------------------- learning ------------------------------
|
| 321 |
+
|
| 322 |
+
def _compute_advantages(
|
| 323 |
+
self, rewards: np.ndarray, values: np.ndarray
|
| 324 |
+
) -> Tuple[np.ndarray, np.ndarray]:
|
| 325 |
+
# For one-step episodes, advantage = reward - value, return = reward
|
| 326 |
+
returns = rewards.copy()
|
| 327 |
+
advantages = rewards - values
|
| 328 |
+
# Normalise for stability
|
| 329 |
+
advantages = (advantages - advantages.mean()) / (advantages.std() + 1e-8)
|
| 330 |
+
return returns, advantages
|
| 331 |
+
|
| 332 |
+
def update(self) -> Dict[str, float]:
|
| 333 |
+
if not self.buffer:
|
| 334 |
+
return {}
|
| 335 |
+
|
| 336 |
+
# Collect batch
|
| 337 |
+
states = np.array([t.state_idx for t in self.buffer], dtype=np.int64)
|
| 338 |
+
actions = np.array([t.action for t in self.buffer], dtype=np.int64)
|
| 339 |
+
rewards = np.array([t.reward for t in self.buffer], dtype=np.float32)
|
| 340 |
+
old_log_probs = np.array([t.log_prob for t in self.buffer], dtype=np.float32)
|
| 341 |
+
values = np.array([t.value for t in self.buffer], dtype=np.float32)
|
| 342 |
+
|
| 343 |
+
returns, advantages = self._compute_advantages(rewards, values)
|
| 344 |
+
|
| 345 |
+
# Convert to tensors
|
| 346 |
+
states_t = self._one_hot(states)
|
| 347 |
+
actions_t = torch.from_numpy(actions).to(self.device)
|
| 348 |
+
returns_t = torch.from_numpy(returns).to(self.device)
|
| 349 |
+
advantages_t = torch.from_numpy(advantages).to(self.device)
|
| 350 |
+
old_log_probs_t = torch.from_numpy(old_log_probs).to(self.device)
|
| 351 |
+
|
| 352 |
+
dataset_size = states_t.size(0)
|
| 353 |
+
idxs = np.arange(dataset_size)
|
| 354 |
+
|
| 355 |
+
stats: Dict[str, float] = {}
|
| 356 |
+
|
| 357 |
+
self.net.train()
|
| 358 |
+
for _ in range(self.update_epochs):
|
| 359 |
+
np.random.shuffle(idxs)
|
| 360 |
+
for start in range(0, dataset_size, self.batch_size):
|
| 361 |
+
batch_idx = idxs[start : start + self.batch_size]
|
| 362 |
+
if len(batch_idx) == 0:
|
| 363 |
+
continue
|
| 364 |
+
|
| 365 |
+
batch_states = states_t[batch_idx]
|
| 366 |
+
batch_actions = actions_t[batch_idx]
|
| 367 |
+
batch_returns = returns_t[batch_idx]
|
| 368 |
+
batch_adv = advantages_t[batch_idx]
|
| 369 |
+
batch_old_logp = old_log_probs_t[batch_idx]
|
| 370 |
+
|
| 371 |
+
logits_mix, values_pred, _, _ = self.net(batch_states) # type: ignore[misc]
|
| 372 |
+
dist = torch.distributions.Categorical(logits=logits_mix)
|
| 373 |
+
log_probs = dist.log_prob(batch_actions)
|
| 374 |
+
entropy = dist.entropy().mean()
|
| 375 |
+
|
| 376 |
+
# PPO clipped objective
|
| 377 |
+
ratio = torch.exp(log_probs - batch_old_logp)
|
| 378 |
+
unclipped = ratio * batch_adv
|
| 379 |
+
clipped = torch.clamp(ratio, 1.0 - self.clip_eps, 1.0 + self.clip_eps) * batch_adv
|
| 380 |
+
policy_loss = -torch.min(unclipped, clipped).mean()
|
| 381 |
+
|
| 382 |
+
value_loss = (batch_returns - values_pred).pow(2).mean()
|
| 383 |
+
|
| 384 |
+
loss = policy_loss + self.value_coef * value_loss - self.entropy_coef * entropy
|
| 385 |
+
|
| 386 |
+
self.optimizer.zero_grad()
|
| 387 |
+
loss.backward()
|
| 388 |
+
torch.nn.utils.clip_grad_norm_(self.net.parameters(), max_norm=1.0)
|
| 389 |
+
self.optimizer.step()
|
| 390 |
+
|
| 391 |
+
stats = {
|
| 392 |
+
"policy_loss": float(policy_loss.item()),
|
| 393 |
+
"value_loss": float(value_loss.item()),
|
| 394 |
+
"entropy": float(entropy.item()),
|
| 395 |
+
}
|
| 396 |
+
|
| 397 |
+
# clear buffer
|
| 398 |
+
self.buffer.clear()
|
| 399 |
+
return stats
|
Down/down/results/paradox_ppo_results.csv
ADDED
|
@@ -0,0 +1,1201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
global_episode,phase,episode,env_seed,agent,episode_reward,failure_mode,rho_state
|
| 2 |
+
0,1,0,960941037,LevoParadoxPPOHybrid,1.3,neutral,0.4752805233001709
|
| 3 |
+
1,1,1,2135581874,LevoParadoxPPOHybrid,1.3,neutral,0.47838863730430603
|
| 4 |
+
2,1,2,2131554306,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 5 |
+
3,1,3,820359671,LevoParadoxPPOHybrid,1.2,neutral,0.4746558368206024
|
| 6 |
+
4,1,4,2047814545,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 7 |
+
5,1,5,1776286830,LevoParadoxPPOHybrid,1.2,neutral,0.4746558368206024
|
| 8 |
+
6,1,6,1373214917,LevoParadoxPPOHybrid,1.2,neutral,0.4743559956550598
|
| 9 |
+
7,1,7,1797992013,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 10 |
+
8,1,8,1645535739,LevoParadoxPPOHybrid,1.2,neutral,0.4746558368206024
|
| 11 |
+
9,1,9,2095533891,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 12 |
+
10,1,10,829401385,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 13 |
+
11,1,11,165839486,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 14 |
+
12,1,12,976680886,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 15 |
+
13,1,13,681732448,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 16 |
+
14,1,14,1046126860,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 17 |
+
15,1,15,1974730198,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 18 |
+
16,1,16,2073558604,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 19 |
+
17,1,17,1451418837,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 20 |
+
18,1,18,1365011226,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 21 |
+
19,1,19,613804374,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 22 |
+
20,1,20,32280267,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 23 |
+
21,1,21,836537275,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 24 |
+
22,1,22,975647501,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 25 |
+
23,1,23,494392738,LevoParadoxPPOHybrid,1.3,neutral,0.47838863730430603
|
| 26 |
+
24,1,24,1706901824,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 27 |
+
25,1,25,358546340,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 28 |
+
26,1,26,1030268022,LevoParadoxPPOHybrid,0.0,neutral,0.4743559956550598
|
| 29 |
+
27,1,27,329502221,LevoParadoxPPOHybrid,2.5,neutral,0.4768047034740448
|
| 30 |
+
28,1,28,746578914,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 31 |
+
29,1,29,2091845998,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 32 |
+
30,1,30,1436029081,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 33 |
+
31,1,31,910309404,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 34 |
+
32,1,32,472048561,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 35 |
+
33,1,33,135600480,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 36 |
+
34,1,34,1892894588,LevoParadoxPPOHybrid,1.3,neutral,0.47656360268592834
|
| 37 |
+
35,1,35,1055673936,LevoParadoxPPOHybrid,1.2,neutral,0.4746558368206024
|
| 38 |
+
36,1,36,1340667110,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 39 |
+
37,1,37,619212679,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 40 |
+
38,1,38,120545107,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 41 |
+
39,1,39,454442609,LevoParadoxPPOHybrid,-0.8,overcautious,0.4768047034740448
|
| 42 |
+
40,1,40,295287540,LevoParadoxPPOHybrid,1.2,neutral,0.4746558368206024
|
| 43 |
+
41,1,41,445457645,LevoParadoxPPOHybrid,1.3,neutral,0.4784092605113983
|
| 44 |
+
42,1,42,307622279,LevoParadoxPPOHybrid,1.3,neutral,0.4789677560329437
|
| 45 |
+
43,1,43,1243437117,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 46 |
+
44,1,44,244133596,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 47 |
+
45,1,45,1268841274,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 48 |
+
46,1,46,1225761364,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 49 |
+
47,1,47,1907103971,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 50 |
+
48,1,48,1034799201,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 51 |
+
49,1,49,235864475,LevoParadoxPPOHybrid,1.2,neutral,0.4746558368206024
|
| 52 |
+
50,1,50,691379092,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 53 |
+
51,1,51,1065800727,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 54 |
+
52,1,52,655184241,LevoParadoxPPOHybrid,-2.0,overconfident,0.4746558368206024
|
| 55 |
+
53,1,53,623054291,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 56 |
+
54,1,54,540036626,LevoParadoxPPOHybrid,0.0,neutral,0.4768047034740448
|
| 57 |
+
55,1,55,1043358048,LevoParadoxPPOHybrid,0.0,neutral,0.47555792331695557
|
| 58 |
+
56,1,56,1932965406,LevoParadoxPPOHybrid,1.3,neutral,0.48266562819480896
|
| 59 |
+
57,1,57,2036930070,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 60 |
+
58,1,58,1526743940,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 61 |
+
59,1,59,1989662969,LevoParadoxPPOHybrid,-0.8,overcautious,0.4768047034740448
|
| 62 |
+
60,1,60,2139514329,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 63 |
+
61,1,61,1632303898,LevoParadoxPPOHybrid,1.3,neutral,0.4789677560329437
|
| 64 |
+
62,1,62,1850997508,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 65 |
+
63,1,63,1679388031,LevoParadoxPPOHybrid,1.3,neutral,0.4784092605113983
|
| 66 |
+
64,1,64,994656789,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 67 |
+
65,1,65,596802772,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 68 |
+
66,1,66,2022213408,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 69 |
+
67,1,67,1111583775,LevoParadoxPPOHybrid,0.0,neutral,0.47555792331695557
|
| 70 |
+
68,1,68,243487825,LevoParadoxPPOHybrid,1.3,neutral,0.47656360268592834
|
| 71 |
+
69,1,69,1727825584,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 72 |
+
70,1,70,138221208,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 73 |
+
71,1,71,1644995000,LevoParadoxPPOHybrid,0.0,neutral,0.4746558368206024
|
| 74 |
+
72,1,72,609184021,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 75 |
+
73,1,73,1231929388,LevoParadoxPPOHybrid,1.2,neutral,0.47555792331695557
|
| 76 |
+
74,1,74,1344075265,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 77 |
+
75,1,75,1828410100,LevoParadoxPPOHybrid,-2.0,overconfident,0.4746558368206024
|
| 78 |
+
76,1,76,2048576691,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 79 |
+
77,1,77,1829711174,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 80 |
+
78,1,78,993502358,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 81 |
+
79,1,79,796970628,LevoParadoxPPOHybrid,-0.8,overcautious,0.4768047034740448
|
| 82 |
+
80,1,80,1037953041,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 83 |
+
81,1,81,981620733,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 84 |
+
82,1,82,729569317,LevoParadoxPPOHybrid,0.0,neutral,0.4768047034740448
|
| 85 |
+
83,1,83,646784317,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 86 |
+
84,1,84,740999785,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 87 |
+
85,1,85,1740597160,LevoParadoxPPOHybrid,0.0,neutral,0.4746558368206024
|
| 88 |
+
86,1,86,661906414,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 89 |
+
87,1,87,1060388906,LevoParadoxPPOHybrid,1.3,neutral,0.4789677560329437
|
| 90 |
+
88,1,88,359430184,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 91 |
+
89,1,89,1208987810,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 92 |
+
90,1,90,2009099257,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 93 |
+
91,1,91,1034716133,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 94 |
+
92,1,92,868969428,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 95 |
+
93,1,93,545077016,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 96 |
+
94,1,94,618241786,LevoParadoxPPOHybrid,1.3,neutral,0.4780098497867584
|
| 97 |
+
95,1,95,2112109137,LevoParadoxPPOHybrid,-0.8,overcautious,0.4758386015892029
|
| 98 |
+
96,1,96,300763006,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 99 |
+
97,1,97,1182747845,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 100 |
+
98,1,98,997933218,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 101 |
+
99,1,99,2082537479,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 102 |
+
100,1,100,948374647,LevoParadoxPPOHybrid,1.3,neutral,0.4772508144378662
|
| 103 |
+
101,1,101,484158897,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 104 |
+
102,1,102,1023803420,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 105 |
+
103,1,103,1933155352,LevoParadoxPPOHybrid,-0.8,overcautious,0.4758386015892029
|
| 106 |
+
104,1,104,531436601,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 107 |
+
105,1,105,693213698,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 108 |
+
106,1,106,1411219987,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 109 |
+
107,1,107,707739816,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 110 |
+
108,1,108,7444596,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 111 |
+
109,1,109,1531464733,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 112 |
+
110,1,110,1407225246,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 113 |
+
111,1,111,1617971802,LevoParadoxPPOHybrid,0.0,neutral,0.4758386015892029
|
| 114 |
+
112,1,112,1856904126,LevoParadoxPPOHybrid,1.3,neutral,0.47656360268592834
|
| 115 |
+
113,1,113,2080438781,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 116 |
+
114,1,114,92845013,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 117 |
+
115,1,115,2051487433,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 118 |
+
116,1,116,1625881056,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 119 |
+
117,1,117,1999467027,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 120 |
+
118,1,118,759769092,LevoParadoxPPOHybrid,2.5,neutral,0.4768047034740448
|
| 121 |
+
119,1,119,1368848130,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 122 |
+
120,1,120,2079957582,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 123 |
+
121,1,121,858968924,LevoParadoxPPOHybrid,1.3,neutral,0.47656360268592834
|
| 124 |
+
122,1,122,2037278180,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 125 |
+
123,1,123,301224287,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 126 |
+
124,1,124,595106119,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 127 |
+
125,1,125,830628267,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 128 |
+
126,1,126,2056643707,LevoParadoxPPOHybrid,1.3,neutral,0.47838863730430603
|
| 129 |
+
127,1,127,676826452,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 130 |
+
128,1,128,1391976925,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 131 |
+
129,1,129,1312449805,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 132 |
+
130,1,130,441735078,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 133 |
+
131,1,131,1198114699,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 134 |
+
132,1,132,1177544228,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 135 |
+
133,1,133,235682355,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 136 |
+
134,1,134,594730155,LevoParadoxPPOHybrid,2.5,neutral,0.4768047034740448
|
| 137 |
+
135,1,135,1031283908,LevoParadoxPPOHybrid,0.0,neutral,0.4743559956550598
|
| 138 |
+
136,1,136,1468565562,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 139 |
+
137,1,137,1799515670,LevoParadoxPPOHybrid,1.2,neutral,0.47555792331695557
|
| 140 |
+
138,1,138,1374703813,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 141 |
+
139,1,139,1412669082,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 142 |
+
140,1,140,342509991,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 143 |
+
141,1,141,129641700,LevoParadoxPPOHybrid,1.2,neutral,0.47555792331695557
|
| 144 |
+
142,1,142,1979539584,LevoParadoxPPOHybrid,0.0,neutral,0.4746558368206024
|
| 145 |
+
143,1,143,181563758,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 146 |
+
144,1,144,2121376515,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 147 |
+
145,1,145,359483640,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 148 |
+
146,1,146,1009660805,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 149 |
+
147,1,147,1772095163,LevoParadoxPPOHybrid,-0.8,overcautious,0.4768047034740448
|
| 150 |
+
148,1,148,793047113,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 151 |
+
149,1,149,2123812620,LevoParadoxPPOHybrid,1.2,neutral,0.47555792331695557
|
| 152 |
+
150,1,150,160023209,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 153 |
+
151,1,151,883833601,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 154 |
+
152,1,152,1345236526,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 155 |
+
153,1,153,2123563640,LevoParadoxPPOHybrid,1.3,neutral,0.4740993082523346
|
| 156 |
+
154,1,154,1188897582,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 157 |
+
155,1,155,1835296655,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 158 |
+
156,1,156,263292300,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 159 |
+
157,1,157,339487389,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 160 |
+
158,1,158,640187192,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 161 |
+
159,1,159,1603617236,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 162 |
+
160,1,160,437479272,LevoParadoxPPOHybrid,-0.8,overcautious,0.4768047034740448
|
| 163 |
+
161,1,161,1297938304,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 164 |
+
162,1,162,1736782144,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 165 |
+
163,1,163,1188005741,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 166 |
+
164,1,164,1925962876,LevoParadoxPPOHybrid,1.3,neutral,0.4772508144378662
|
| 167 |
+
165,1,165,1419686978,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 168 |
+
166,1,166,113085408,LevoParadoxPPOHybrid,0.0,neutral,0.4772508144378662
|
| 169 |
+
167,1,167,2107650812,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 170 |
+
168,1,168,1556544035,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 171 |
+
169,1,169,409268109,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 172 |
+
170,1,170,1707984479,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 173 |
+
171,1,171,2028373425,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 174 |
+
172,1,172,1712063860,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 175 |
+
173,1,173,729831432,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 176 |
+
174,1,174,1945712103,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 177 |
+
175,1,175,1662118687,LevoParadoxPPOHybrid,1.3,neutral,0.4784092605113983
|
| 178 |
+
176,1,176,1263277082,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 179 |
+
177,1,177,600780774,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 180 |
+
178,1,178,389237547,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 181 |
+
179,1,179,531352528,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 182 |
+
180,1,180,308998320,LevoParadoxPPOHybrid,1.2,neutral,0.47555792331695557
|
| 183 |
+
181,1,181,133112608,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 184 |
+
182,1,182,1335500866,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 185 |
+
183,1,183,1455247303,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 186 |
+
184,1,184,818574077,LevoParadoxPPOHybrid,-2.0,overconfident,0.4746558368206024
|
| 187 |
+
185,1,185,783962675,LevoParadoxPPOHybrid,0.0,neutral,0.4743559956550598
|
| 188 |
+
186,1,186,181722168,LevoParadoxPPOHybrid,-0.8,overcautious,0.4768047034740448
|
| 189 |
+
187,1,187,922465315,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 190 |
+
188,1,188,1058682574,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 191 |
+
189,1,189,2126397323,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 192 |
+
190,1,190,23796221,LevoParadoxPPOHybrid,0.0,neutral,0.4743559956550598
|
| 193 |
+
191,1,191,677074079,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 194 |
+
192,1,192,1977263236,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 195 |
+
193,1,193,1768875981,LevoParadoxPPOHybrid,0.0,neutral,0.47838863730430603
|
| 196 |
+
194,1,194,1212545188,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 197 |
+
195,1,195,1186674390,LevoParadoxPPOHybrid,1.3,neutral,0.47656360268592834
|
| 198 |
+
196,1,196,1056632766,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 199 |
+
197,1,197,268535661,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 200 |
+
198,1,198,888167157,LevoParadoxPPOHybrid,1.2,neutral,0.4743559956550598
|
| 201 |
+
199,1,199,530391691,LevoParadoxPPOHybrid,1.3,neutral,0.48266562819480896
|
| 202 |
+
200,1,200,50594990,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 203 |
+
201,1,201,222395105,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 204 |
+
202,1,202,287284573,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 205 |
+
203,1,203,514973304,LevoParadoxPPOHybrid,0.0,neutral,0.4752705693244934
|
| 206 |
+
204,1,204,1909475802,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 207 |
+
205,1,205,1879525266,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 208 |
+
206,1,206,1420380137,LevoParadoxPPOHybrid,-0.8,overcautious,0.4810570776462555
|
| 209 |
+
207,1,207,1737331410,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 210 |
+
208,1,208,1064923684,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 211 |
+
209,1,209,1238273317,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 212 |
+
210,1,210,144185798,LevoParadoxPPOHybrid,1.3,neutral,0.48266562819480896
|
| 213 |
+
211,1,211,575162410,LevoParadoxPPOHybrid,0.0,neutral,0.4780098497867584
|
| 214 |
+
212,1,212,707283582,LevoParadoxPPOHybrid,-0.8,overcautious,0.4758386015892029
|
| 215 |
+
213,1,213,1405835406,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 216 |
+
214,1,214,789235422,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 217 |
+
215,1,215,1388271326,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 218 |
+
216,1,216,1865718892,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 219 |
+
217,1,217,1293915651,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 220 |
+
218,1,218,1428150647,LevoParadoxPPOHybrid,0.0,neutral,0.4810570776462555
|
| 221 |
+
219,1,219,19248056,LevoParadoxPPOHybrid,-0.8,overcautious,0.4758386015892029
|
| 222 |
+
220,1,220,491031830,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 223 |
+
221,1,221,636126198,LevoParadoxPPOHybrid,1.3,neutral,0.4789677560329437
|
| 224 |
+
222,1,222,456728828,LevoParadoxPPOHybrid,0.0,neutral,0.4743559956550598
|
| 225 |
+
223,1,223,966697912,LevoParadoxPPOHybrid,0.0,neutral,0.47555792331695557
|
| 226 |
+
224,1,224,1166498720,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 227 |
+
225,1,225,1571014065,LevoParadoxPPOHybrid,2.5,neutral,0.4768047034740448
|
| 228 |
+
226,1,226,714126436,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 229 |
+
227,1,227,1206418342,LevoParadoxPPOHybrid,0.0,neutral,0.47656360268592834
|
| 230 |
+
228,1,228,1372090007,LevoParadoxPPOHybrid,-2.0,overconfident,0.4743559956550598
|
| 231 |
+
229,1,229,769009050,LevoParadoxPPOHybrid,2.5,neutral,0.4758386015892029
|
| 232 |
+
230,1,230,1353001314,LevoParadoxPPOHybrid,0.0,neutral,0.47702598571777344
|
| 233 |
+
231,1,231,1733327736,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 234 |
+
232,1,232,638285556,LevoParadoxPPOHybrid,1.3,neutral,0.48266562819480896
|
| 235 |
+
233,1,233,988454733,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 236 |
+
234,1,234,1459581848,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 237 |
+
235,1,235,1106839428,LevoParadoxPPOHybrid,1.2,neutral,0.47555792331695557
|
| 238 |
+
236,1,236,388494700,LevoParadoxPPOHybrid,-2.0,overconfident,0.47555792331695557
|
| 239 |
+
237,1,237,1441804184,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 240 |
+
238,1,238,683008548,LevoParadoxPPOHybrid,1.3,neutral,0.4784092605113983
|
| 241 |
+
239,1,239,557447257,LevoParadoxPPOHybrid,0.0,neutral,0.4789677560329437
|
| 242 |
+
240,1,240,1553434256,LevoParadoxPPOHybrid,-2.0,overconfident,0.4746558368206024
|
| 243 |
+
241,1,241,1196216329,LevoParadoxPPOHybrid,0.0,neutral,0.4740993082523346
|
| 244 |
+
242,1,242,205445195,LevoParadoxPPOHybrid,0.0,neutral,0.47567713260650635
|
| 245 |
+
243,1,243,138987130,LevoParadoxPPOHybrid,1.3,neutral,0.48266562819480896
|
| 246 |
+
244,1,244,1601279830,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 247 |
+
245,1,245,523497866,LevoParadoxPPOHybrid,0.0,neutral,0.4768047034740448
|
| 248 |
+
246,1,246,1681903654,LevoParadoxPPOHybrid,1.3,neutral,0.4772508144378662
|
| 249 |
+
247,1,247,1447758672,LevoParadoxPPOHybrid,0.0,neutral,0.4784092605113983
|
| 250 |
+
248,1,248,1263090791,LevoParadoxPPOHybrid,0.0,neutral,0.4746558368206024
|
| 251 |
+
249,1,249,2069934169,LevoParadoxPPOHybrid,1.3,neutral,0.4752705693244934
|
| 252 |
+
250,1,250,1175589659,LevoParadoxPPOHybrid,0.0,neutral,0.4746558368206024
|
| 253 |
+
251,1,251,792436927,LevoParadoxPPOHybrid,1.3,neutral,0.4789677560329437
|
| 254 |
+
252,1,252,77793463,LevoParadoxPPOHybrid,1.3,neutral,0.47567713260650635
|
| 255 |
+
253,1,253,1178447001,LevoParadoxPPOHybrid,0.0,neutral,0.4752805233001709
|
| 256 |
+
254,1,254,1867902247,LevoParadoxPPOHybrid,1.3,neutral,0.47702598571777344
|
| 257 |
+
255,1,255,1132483487,LevoParadoxPPOHybrid,0.0,neutral,0.48266562819480896
|
| 258 |
+
256,1,256,1108550737,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 259 |
+
257,1,257,761845810,LevoParadoxPPOHybrid,0.0,neutral,0.47729626297950745
|
| 260 |
+
258,1,258,2026103214,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 261 |
+
259,1,259,1320383576,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 262 |
+
260,1,260,165278918,LevoParadoxPPOHybrid,1.2,neutral,0.4783268868923187
|
| 263 |
+
261,1,261,1264440670,LevoParadoxPPOHybrid,-0.8,overcautious,0.4791228175163269
|
| 264 |
+
262,1,262,859892894,LevoParadoxPPOHybrid,1.3,neutral,0.48010820150375366
|
| 265 |
+
263,1,263,411458685,LevoParadoxPPOHybrid,0.0,neutral,0.479666531085968
|
| 266 |
+
264,1,264,1931263994,LevoParadoxPPOHybrid,0.0,neutral,0.4829937219619751
|
| 267 |
+
265,1,265,213511530,LevoParadoxPPOHybrid,2.5,neutral,0.48367613554000854
|
| 268 |
+
266,1,266,1137608613,LevoParadoxPPOHybrid,-2.0,overconfident,0.4773579239845276
|
| 269 |
+
267,1,267,843567272,LevoParadoxPPOHybrid,0.0,neutral,0.4863224923610687
|
| 270 |
+
268,1,268,11175988,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 271 |
+
269,1,269,687107894,LevoParadoxPPOHybrid,1.3,neutral,0.47729626297950745
|
| 272 |
+
270,1,270,291918902,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 273 |
+
271,1,271,1087591275,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 274 |
+
272,1,272,1813734633,LevoParadoxPPOHybrid,0.0,neutral,0.4791228175163269
|
| 275 |
+
273,1,273,461816730,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 276 |
+
274,1,274,441050625,LevoParadoxPPOHybrid,0.0,neutral,0.4863224923610687
|
| 277 |
+
275,1,275,2141182885,LevoParadoxPPOHybrid,0.0,neutral,0.4808143377304077
|
| 278 |
+
276,1,276,749647573,LevoParadoxPPOHybrid,-0.8,overcautious,0.4791228175163269
|
| 279 |
+
277,1,277,702601389,LevoParadoxPPOHybrid,1.3,neutral,0.4818275570869446
|
| 280 |
+
278,1,278,500813039,LevoParadoxPPOHybrid,1.3,neutral,0.4829937219619751
|
| 281 |
+
279,1,279,1327850191,LevoParadoxPPOHybrid,0.0,neutral,0.4788035750389099
|
| 282 |
+
280,1,280,1479353871,LevoParadoxPPOHybrid,0.0,neutral,0.48367613554000854
|
| 283 |
+
281,1,281,875883029,LevoParadoxPPOHybrid,-0.8,overcautious,0.4791228175163269
|
| 284 |
+
282,1,282,956514865,LevoParadoxPPOHybrid,0.0,neutral,0.4773579239845276
|
| 285 |
+
283,1,283,140168808,LevoParadoxPPOHybrid,2.5,neutral,0.48367613554000854
|
| 286 |
+
284,1,284,2023927855,LevoParadoxPPOHybrid,0.0,neutral,0.4777975380420685
|
| 287 |
+
285,1,285,1850097089,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 288 |
+
286,1,286,366267895,LevoParadoxPPOHybrid,1.3,neutral,0.48010820150375366
|
| 289 |
+
287,1,287,833125277,LevoParadoxPPOHybrid,0.0,neutral,0.48244643211364746
|
| 290 |
+
288,1,288,1062058470,LevoParadoxPPOHybrid,-0.8,overcautious,0.48367613554000854
|
| 291 |
+
289,1,289,755011055,LevoParadoxPPOHybrid,1.3,neutral,0.4805646538734436
|
| 292 |
+
290,1,290,1193341725,LevoParadoxPPOHybrid,0.0,neutral,0.4784007668495178
|
| 293 |
+
291,1,291,47566427,LevoParadoxPPOHybrid,1.3,neutral,0.4829937219619751
|
| 294 |
+
292,1,292,1480907230,LevoParadoxPPOHybrid,1.3,neutral,0.4818275570869446
|
| 295 |
+
293,1,293,1193747826,LevoParadoxPPOHybrid,0.0,neutral,0.4863224923610687
|
| 296 |
+
294,1,294,188056822,LevoParadoxPPOHybrid,1.3,neutral,0.479666531085968
|
| 297 |
+
295,1,295,2058188731,LevoParadoxPPOHybrid,1.3,neutral,0.4784007668495178
|
| 298 |
+
296,1,296,131903334,LevoParadoxPPOHybrid,2.5,neutral,0.48367613554000854
|
| 299 |
+
297,1,297,2023999375,LevoParadoxPPOHybrid,0.0,neutral,0.4782043993473053
|
| 300 |
+
298,1,298,14284283,LevoParadoxPPOHybrid,1.3,neutral,0.4829937219619751
|
| 301 |
+
299,1,299,430728515,LevoParadoxPPOHybrid,1.3,neutral,0.4818275570869446
|
| 302 |
+
300,1,300,1773637227,LevoParadoxPPOHybrid,0.0,neutral,0.4784007668495178
|
| 303 |
+
301,1,301,1447643177,LevoParadoxPPOHybrid,2.5,neutral,0.4791228175163269
|
| 304 |
+
302,1,302,980890604,LevoParadoxPPOHybrid,-0.8,overcautious,0.4791228175163269
|
| 305 |
+
303,1,303,1738676116,LevoParadoxPPOHybrid,2.5,neutral,0.48367613554000854
|
| 306 |
+
304,1,304,202567723,LevoParadoxPPOHybrid,1.3,neutral,0.479666531085968
|
| 307 |
+
305,1,305,1153805088,LevoParadoxPPOHybrid,1.2,neutral,0.4783268868923187
|
| 308 |
+
306,1,306,972971566,LevoParadoxPPOHybrid,-2.0,overconfident,0.4783268868923187
|
| 309 |
+
307,1,307,1472596543,LevoParadoxPPOHybrid,-0.8,overcautious,0.48367613554000854
|
| 310 |
+
308,1,308,1472317967,LevoParadoxPPOHybrid,1.3,neutral,0.48244643211364746
|
| 311 |
+
309,1,309,215008918,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 312 |
+
310,1,310,1105771947,LevoParadoxPPOHybrid,0.0,neutral,0.48244643211364746
|
| 313 |
+
311,1,311,652569339,LevoParadoxPPOHybrid,0.0,neutral,0.4805646538734436
|
| 314 |
+
312,1,312,1726057777,LevoParadoxPPOHybrid,-0.8,overcautious,0.48367613554000854
|
| 315 |
+
313,1,313,1485944499,LevoParadoxPPOHybrid,1.3,neutral,0.48244643211364746
|
| 316 |
+
314,1,314,294205674,LevoParadoxPPOHybrid,0.0,neutral,0.479666531085968
|
| 317 |
+
315,1,315,1016871026,LevoParadoxPPOHybrid,0.0,neutral,0.4783268868923187
|
| 318 |
+
316,1,316,1168910589,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 319 |
+
317,1,317,1517292813,LevoParadoxPPOHybrid,0.0,neutral,0.4863224923610687
|
| 320 |
+
318,1,318,2030522066,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 321 |
+
319,1,319,959589186,LevoParadoxPPOHybrid,1.2,neutral,0.4773579239845276
|
| 322 |
+
320,1,320,590193953,LevoParadoxPPOHybrid,1.3,neutral,0.479666531085968
|
| 323 |
+
321,1,321,675005705,LevoParadoxPPOHybrid,0.0,neutral,0.4777975380420685
|
| 324 |
+
322,1,322,925232956,LevoParadoxPPOHybrid,0.0,neutral,0.4784007668495178
|
| 325 |
+
323,1,323,1408472699,LevoParadoxPPOHybrid,-0.8,overcautious,0.4791228175163269
|
| 326 |
+
324,1,324,859189252,LevoParadoxPPOHybrid,1.3,neutral,0.4777975380420685
|
| 327 |
+
325,1,325,399323533,LevoParadoxPPOHybrid,0.0,neutral,0.48244643211364746
|
| 328 |
+
326,1,326,980315658,LevoParadoxPPOHybrid,-2.0,overconfident,0.4788035750389099
|
| 329 |
+
327,1,327,123987181,LevoParadoxPPOHybrid,1.2,neutral,0.4773579239845276
|
| 330 |
+
328,1,328,409996997,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 331 |
+
329,1,329,708892450,LevoParadoxPPOHybrid,-2.0,overconfident,0.4783268868923187
|
| 332 |
+
330,1,330,1373932302,LevoParadoxPPOHybrid,1.3,neutral,0.47729626297950745
|
| 333 |
+
331,1,331,2077742390,LevoParadoxPPOHybrid,1.3,neutral,0.4784007668495178
|
| 334 |
+
332,1,332,761108960,LevoParadoxPPOHybrid,0.0,neutral,0.4784007668495178
|
| 335 |
+
333,1,333,1211512608,LevoParadoxPPOHybrid,0.0,neutral,0.4863224923610687
|
| 336 |
+
334,1,334,1884662523,LevoParadoxPPOHybrid,0.0,neutral,0.4777975380420685
|
| 337 |
+
335,1,335,2002191522,LevoParadoxPPOHybrid,0.0,neutral,0.4863224923610687
|
| 338 |
+
336,1,336,2028646946,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 339 |
+
337,1,337,589112024,LevoParadoxPPOHybrid,0.0,neutral,0.48244643211364746
|
| 340 |
+
338,1,338,610703030,LevoParadoxPPOHybrid,0.0,neutral,0.4802131950855255
|
| 341 |
+
339,1,339,972829234,LevoParadoxPPOHybrid,0.0,neutral,0.4777975380420685
|
| 342 |
+
340,1,340,465154269,LevoParadoxPPOHybrid,2.5,neutral,0.4782043993473053
|
| 343 |
+
341,1,341,470901255,LevoParadoxPPOHybrid,0.0,neutral,0.48244643211364746
|
| 344 |
+
342,1,342,1990213325,LevoParadoxPPOHybrid,0.0,neutral,0.47729626297950745
|
| 345 |
+
343,1,343,1646775850,LevoParadoxPPOHybrid,0.0,neutral,0.4829937219619751
|
| 346 |
+
344,1,344,1057311607,LevoParadoxPPOHybrid,1.3,neutral,0.4802131950855255
|
| 347 |
+
345,1,345,590319545,LevoParadoxPPOHybrid,0.0,neutral,0.4802131950855255
|
| 348 |
+
346,1,346,516318123,LevoParadoxPPOHybrid,1.3,neutral,0.47729626297950745
|
| 349 |
+
347,1,347,70890343,LevoParadoxPPOHybrid,0.0,neutral,0.47729626297950745
|
| 350 |
+
348,1,348,804413128,LevoParadoxPPOHybrid,2.5,neutral,0.4782043993473053
|
| 351 |
+
349,1,349,1504695760,LevoParadoxPPOHybrid,1.3,neutral,0.4805646538734436
|
| 352 |
+
350,1,350,940669613,LevoParadoxPPOHybrid,0.0,neutral,0.4808143377304077
|
| 353 |
+
351,1,351,821018278,LevoParadoxPPOHybrid,1.3,neutral,0.48010820150375366
|
| 354 |
+
352,1,352,2080007758,LevoParadoxPPOHybrid,0.0,neutral,0.48367613554000854
|
| 355 |
+
353,1,353,461373511,LevoParadoxPPOHybrid,0.0,neutral,0.4808143377304077
|
| 356 |
+
354,1,354,1987269884,LevoParadoxPPOHybrid,0.0,neutral,0.4805646538734436
|
| 357 |
+
355,1,355,885162807,LevoParadoxPPOHybrid,1.3,neutral,0.4863224923610687
|
| 358 |
+
356,1,356,779768070,LevoParadoxPPOHybrid,0.0,neutral,0.4802131950855255
|
| 359 |
+
357,1,357,966063187,LevoParadoxPPOHybrid,-2.0,overconfident,0.4783268868923187
|
| 360 |
+
358,1,358,1359588046,LevoParadoxPPOHybrid,1.3,neutral,0.4808143377304077
|
| 361 |
+
359,1,359,393633121,LevoParadoxPPOHybrid,0.0,neutral,0.4802131950855255
|
| 362 |
+
360,1,360,991070115,LevoParadoxPPOHybrid,1.3,neutral,0.4818275570869446
|
| 363 |
+
361,1,361,1695833246,LevoParadoxPPOHybrid,1.3,neutral,0.4808143377304077
|
| 364 |
+
362,1,362,259218709,LevoParadoxPPOHybrid,0.0,neutral,0.4773579239845276
|
| 365 |
+
363,1,363,1252523270,LevoParadoxPPOHybrid,1.2,neutral,0.4788035750389099
|
| 366 |
+
364,1,364,618943155,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 367 |
+
365,1,365,1149281050,LevoParadoxPPOHybrid,1.3,neutral,0.4805646538734436
|
| 368 |
+
366,1,366,605383710,LevoParadoxPPOHybrid,1.3,neutral,0.4784007668495178
|
| 369 |
+
367,1,367,1156676417,LevoParadoxPPOHybrid,-2.0,overconfident,0.4788035750389099
|
| 370 |
+
368,1,368,988215448,LevoParadoxPPOHybrid,1.3,neutral,0.4802131950855255
|
| 371 |
+
369,1,369,1630817173,LevoParadoxPPOHybrid,-0.8,overcautious,0.48367613554000854
|
| 372 |
+
370,1,370,1326405127,LevoParadoxPPOHybrid,1.3,neutral,0.4863224923610687
|
| 373 |
+
371,1,371,279363521,LevoParadoxPPOHybrid,1.3,neutral,0.4805646538734436
|
| 374 |
+
372,1,372,673386525,LevoParadoxPPOHybrid,0.0,neutral,0.479666531085968
|
| 375 |
+
373,1,373,1485190259,LevoParadoxPPOHybrid,1.3,neutral,0.4808143377304077
|
| 376 |
+
374,1,374,757249346,LevoParadoxPPOHybrid,1.3,neutral,0.4784007668495178
|
| 377 |
+
375,1,375,2139173341,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 378 |
+
376,1,376,1407830714,LevoParadoxPPOHybrid,0.0,neutral,0.4777975380420685
|
| 379 |
+
377,1,377,1328293493,LevoParadoxPPOHybrid,-2.0,overconfident,0.4783268868923187
|
| 380 |
+
378,1,378,1561225140,LevoParadoxPPOHybrid,0.0,neutral,0.4802131950855255
|
| 381 |
+
379,1,379,2054053838,LevoParadoxPPOHybrid,0.0,neutral,0.4791228175163269
|
| 382 |
+
380,1,380,1538665569,LevoParadoxPPOHybrid,0.0,neutral,0.4773579239845276
|
| 383 |
+
381,1,381,578245576,LevoParadoxPPOHybrid,1.3,neutral,0.4802131950855255
|
| 384 |
+
382,1,382,1001750142,LevoParadoxPPOHybrid,1.3,neutral,0.4863224923610687
|
| 385 |
+
383,1,383,247349919,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 386 |
+
384,1,384,1913641746,LevoParadoxPPOHybrid,0.0,neutral,0.48010820150375366
|
| 387 |
+
385,1,385,191896624,LevoParadoxPPOHybrid,-0.8,overcautious,0.4782043993473053
|
| 388 |
+
386,1,386,358450787,LevoParadoxPPOHybrid,0.0,neutral,0.47729626297950745
|
| 389 |
+
387,1,387,1304006934,LevoParadoxPPOHybrid,1.3,neutral,0.4863224923610687
|
| 390 |
+
388,1,388,854476003,LevoParadoxPPOHybrid,1.3,neutral,0.48244643211364746
|
| 391 |
+
389,1,389,718810870,LevoParadoxPPOHybrid,0.0,neutral,0.48244643211364746
|
| 392 |
+
390,1,390,2087848673,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 393 |
+
391,1,391,565983639,LevoParadoxPPOHybrid,0.0,neutral,0.48367613554000854
|
| 394 |
+
392,1,392,406083697,LevoParadoxPPOHybrid,0.0,neutral,0.4805646538734436
|
| 395 |
+
393,1,393,1812367355,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 396 |
+
394,1,394,1054994518,LevoParadoxPPOHybrid,1.3,neutral,0.4802131950855255
|
| 397 |
+
395,1,395,235136936,LevoParadoxPPOHybrid,0.0,neutral,0.4808143377304077
|
| 398 |
+
396,1,396,111732250,LevoParadoxPPOHybrid,-2.0,overconfident,0.4773579239845276
|
| 399 |
+
397,1,397,289408596,LevoParadoxPPOHybrid,1.3,neutral,0.4802131950855255
|
| 400 |
+
398,1,398,1197540953,LevoParadoxPPOHybrid,0.0,neutral,0.479666531085968
|
| 401 |
+
399,1,399,34196977,LevoParadoxPPOHybrid,0.0,neutral,0.4818275570869446
|
| 402 |
+
400,2,0,2034269964,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 403 |
+
401,2,1,912146831,LevoParadoxPPOHybrid,0.0,neutral,0.48142847418785095
|
| 404 |
+
402,2,2,144856919,LevoParadoxPPOHybrid,1.2,neutral,0.47782430052757263
|
| 405 |
+
403,2,3,685506823,LevoParadoxPPOHybrid,1.2,neutral,0.4803639352321625
|
| 406 |
+
404,2,4,1939181862,LevoParadoxPPOHybrid,0.0,neutral,0.4791390895843506
|
| 407 |
+
405,2,5,1502803201,LevoParadoxPPOHybrid,0.0,neutral,0.47879713773727417
|
| 408 |
+
406,2,6,1504803878,LevoParadoxPPOHybrid,-3.0,overconfident,0.4803639352321625
|
| 409 |
+
407,2,7,67883367,LevoParadoxPPOHybrid,2.0,neutral,0.48142847418785095
|
| 410 |
+
408,2,8,235174993,LevoParadoxPPOHybrid,0.8,neutral,0.48121845722198486
|
| 411 |
+
409,2,9,1767017071,LevoParadoxPPOHybrid,2.0,neutral,0.48142847418785095
|
| 412 |
+
410,2,10,1195637117,LevoParadoxPPOHybrid,-3.0,overconfident,0.48439839482307434
|
| 413 |
+
411,2,11,2140388521,LevoParadoxPPOHybrid,0.0,neutral,0.47790008783340454
|
| 414 |
+
412,2,12,285128217,LevoParadoxPPOHybrid,0.0,neutral,0.47782430052757263
|
| 415 |
+
413,2,13,1297214282,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 416 |
+
414,2,14,2128926662,LevoParadoxPPOHybrid,0.8,neutral,0.4789300858974457
|
| 417 |
+
415,2,15,1227615478,LevoParadoxPPOHybrid,0.0,neutral,0.4791390895843506
|
| 418 |
+
416,2,16,562820587,LevoParadoxPPOHybrid,-3.0,overconfident,0.48439839482307434
|
| 419 |
+
417,2,17,1938965903,LevoParadoxPPOHybrid,2.0,neutral,0.47879713773727417
|
| 420 |
+
418,2,18,1938899583,LevoParadoxPPOHybrid,0.0,neutral,0.48121845722198486
|
| 421 |
+
419,2,19,146416322,LevoParadoxPPOHybrid,2.0,neutral,0.47879713773727417
|
| 422 |
+
420,2,20,2034761172,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 423 |
+
421,2,21,1531184118,LevoParadoxPPOHybrid,0.8,neutral,0.47790008783340454
|
| 424 |
+
422,2,22,1624823478,LevoParadoxPPOHybrid,-3.0,overconfident,0.47782430052757263
|
| 425 |
+
423,2,23,1973982599,LevoParadoxPPOHybrid,0.0,neutral,0.47879713773727417
|
| 426 |
+
424,2,24,1433121745,LevoParadoxPPOHybrid,0.0,neutral,0.47766703367233276
|
| 427 |
+
425,2,25,269942302,LevoParadoxPPOHybrid,-0.8,overcautious,0.47879713773727417
|
| 428 |
+
426,2,26,662577618,LevoParadoxPPOHybrid,-3.0,overconfident,0.48439839482307434
|
| 429 |
+
427,2,27,1680792863,LevoParadoxPPOHybrid,1.2,neutral,0.47782430052757263
|
| 430 |
+
428,2,28,608196857,LevoParadoxPPOHybrid,0.0,neutral,0.4791390895843506
|
| 431 |
+
429,2,29,750797946,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 432 |
+
430,2,30,1703067462,LevoParadoxPPOHybrid,0.0,neutral,0.4789300858974457
|
| 433 |
+
431,2,31,354277540,LevoParadoxPPOHybrid,2.0,neutral,0.48142847418785095
|
| 434 |
+
432,2,32,516686757,LevoParadoxPPOHybrid,0.0,neutral,0.4789300858974457
|
| 435 |
+
433,2,33,145581260,LevoParadoxPPOHybrid,0.8,neutral,0.47702041268348694
|
| 436 |
+
434,2,34,1801241574,LevoParadoxPPOHybrid,2.0,neutral,0.47879713773727417
|
| 437 |
+
435,2,35,2100309440,LevoParadoxPPOHybrid,2.0,neutral,0.47879713773727417
|
| 438 |
+
436,2,36,1637824222,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 439 |
+
437,2,37,1781578254,LevoParadoxPPOHybrid,0.0,neutral,0.47879713773727417
|
| 440 |
+
438,2,38,774535340,LevoParadoxPPOHybrid,0.0,neutral,0.47766703367233276
|
| 441 |
+
439,2,39,1592536280,LevoParadoxPPOHybrid,0.8,neutral,0.47760096192359924
|
| 442 |
+
440,2,40,803715272,LevoParadoxPPOHybrid,0.0,neutral,0.47968432307243347
|
| 443 |
+
441,2,41,1295445709,LevoParadoxPPOHybrid,-0.8,overcautious,0.47879713773727417
|
| 444 |
+
442,2,42,580455628,LevoParadoxPPOHybrid,0.8,neutral,0.47702041268348694
|
| 445 |
+
443,2,43,608571353,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 446 |
+
444,2,44,220247617,LevoParadoxPPOHybrid,0.8,neutral,0.47702041268348694
|
| 447 |
+
445,2,45,1007502304,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 448 |
+
446,2,46,1485027697,LevoParadoxPPOHybrid,1.2,neutral,0.47782430052757263
|
| 449 |
+
447,2,47,308424123,LevoParadoxPPOHybrid,0.8,neutral,0.481337308883667
|
| 450 |
+
448,2,48,1831539103,LevoParadoxPPOHybrid,0.0,neutral,0.4791390895843506
|
| 451 |
+
449,2,49,96205481,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 452 |
+
450,2,50,572983894,LevoParadoxPPOHybrid,0.8,neutral,0.4789300858974457
|
| 453 |
+
451,2,51,1559559556,LevoParadoxPPOHybrid,0.0,neutral,0.48121845722198486
|
| 454 |
+
452,2,52,289588363,LevoParadoxPPOHybrid,0.0,neutral,0.4781184792518616
|
| 455 |
+
453,2,53,1021080331,LevoParadoxPPOHybrid,0.8,neutral,0.47968432307243347
|
| 456 |
+
454,2,54,43845046,LevoParadoxPPOHybrid,0.0,neutral,0.47968432307243347
|
| 457 |
+
455,2,55,1969391451,LevoParadoxPPOHybrid,0.0,neutral,0.47984620928764343
|
| 458 |
+
456,2,56,112141255,LevoParadoxPPOHybrid,0.0,neutral,0.47984620928764343
|
| 459 |
+
457,2,57,407044235,LevoParadoxPPOHybrid,0.0,neutral,0.48121845722198486
|
| 460 |
+
458,2,58,1413331621,LevoParadoxPPOHybrid,0.0,neutral,0.4791390895843506
|
| 461 |
+
459,2,59,1124438664,LevoParadoxPPOHybrid,2.0,neutral,0.479806512594223
|
| 462 |
+
460,2,60,1823383091,LevoParadoxPPOHybrid,0.0,neutral,0.47702041268348694
|
| 463 |
+
461,2,61,1452420947,LevoParadoxPPOHybrid,-3.0,overconfident,0.47782430052757263
|
| 464 |
+
462,2,62,2031250630,LevoParadoxPPOHybrid,-3.0,overconfident,0.4803639352321625
|
| 465 |
+
463,2,63,788674418,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 466 |
+
464,2,64,1437390327,LevoParadoxPPOHybrid,0.8,neutral,0.48121845722198486
|
| 467 |
+
465,2,65,879262169,LevoParadoxPPOHybrid,0.0,neutral,0.479806512594223
|
| 468 |
+
466,2,66,958652521,LevoParadoxPPOHybrid,0.8,neutral,0.4793781638145447
|
| 469 |
+
467,2,67,2142602411,LevoParadoxPPOHybrid,0.0,neutral,0.4789300858974457
|
| 470 |
+
468,2,68,59947504,LevoParadoxPPOHybrid,0.8,neutral,0.47766703367233276
|
| 471 |
+
469,2,69,384107305,LevoParadoxPPOHybrid,0.0,neutral,0.47968432307243347
|
| 472 |
+
470,2,70,1830507375,LevoParadoxPPOHybrid,0.8,neutral,0.4789300858974457
|
| 473 |
+
471,2,71,571519169,LevoParadoxPPOHybrid,0.8,neutral,0.4793781638145447
|
| 474 |
+
472,2,72,1626492832,LevoParadoxPPOHybrid,0.8,neutral,0.4789300858974457
|
| 475 |
+
473,2,73,1386853771,LevoParadoxPPOHybrid,0.8,neutral,0.47760096192359924
|
| 476 |
+
474,2,74,1706685627,LevoParadoxPPOHybrid,-0.8,overcautious,0.47879713773727417
|
| 477 |
+
475,2,75,1611897310,LevoParadoxPPOHybrid,2.0,neutral,0.48142847418785095
|
| 478 |
+
476,2,76,1751003019,LevoParadoxPPOHybrid,0.8,neutral,0.47790008783340454
|
| 479 |
+
477,2,77,1422082962,LevoParadoxPPOHybrid,1.2,neutral,0.48439839482307434
|
| 480 |
+
478,2,78,1883691922,LevoParadoxPPOHybrid,0.0,neutral,0.481337308883667
|
| 481 |
+
479,2,79,1013721795,LevoParadoxPPOHybrid,0.8,neutral,0.4791390895843506
|
| 482 |
+
480,2,80,820766304,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 483 |
+
481,2,81,292577686,LevoParadoxPPOHybrid,0.8,neutral,0.481337308883667
|
| 484 |
+
482,2,82,1774181236,LevoParadoxPPOHybrid,0.8,neutral,0.47968432307243347
|
| 485 |
+
483,2,83,16477750,LevoParadoxPPOHybrid,0.8,neutral,0.4781184792518616
|
| 486 |
+
484,2,84,270709347,LevoParadoxPPOHybrid,0.0,neutral,0.47766703367233276
|
| 487 |
+
485,2,85,117649210,LevoParadoxPPOHybrid,0.8,neutral,0.47790008783340454
|
| 488 |
+
486,2,86,1315442558,LevoParadoxPPOHybrid,0.0,neutral,0.47984620928764343
|
| 489 |
+
487,2,87,2057676732,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 490 |
+
488,2,88,211459733,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 491 |
+
489,2,89,91146202,LevoParadoxPPOHybrid,0.0,neutral,0.47702041268348694
|
| 492 |
+
490,2,90,588068454,LevoParadoxPPOHybrid,0.8,neutral,0.47968432307243347
|
| 493 |
+
491,2,91,467526601,LevoParadoxPPOHybrid,-0.8,overcautious,0.479806512594223
|
| 494 |
+
492,2,92,335299668,LevoParadoxPPOHybrid,0.8,neutral,0.47984620928764343
|
| 495 |
+
493,2,93,779362037,LevoParadoxPPOHybrid,0.0,neutral,0.47968432307243347
|
| 496 |
+
494,2,94,660339976,LevoParadoxPPOHybrid,2.0,neutral,0.479806512594223
|
| 497 |
+
495,2,95,637136818,LevoParadoxPPOHybrid,1.2,neutral,0.48439839482307434
|
| 498 |
+
496,2,96,1999866855,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 499 |
+
497,2,97,139896496,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 500 |
+
498,2,98,863743810,LevoParadoxPPOHybrid,0.0,neutral,0.4781184792518616
|
| 501 |
+
499,2,99,1908673249,LevoParadoxPPOHybrid,2.0,neutral,0.479806512594223
|
| 502 |
+
500,2,100,1039141574,LevoParadoxPPOHybrid,0.0,neutral,0.47984620928764343
|
| 503 |
+
501,2,101,1051567495,LevoParadoxPPOHybrid,-3.0,overconfident,0.4803639352321625
|
| 504 |
+
502,2,102,837394817,LevoParadoxPPOHybrid,0.8,neutral,0.47968432307243347
|
| 505 |
+
503,2,103,2013481887,LevoParadoxPPOHybrid,0.0,neutral,0.47760096192359924
|
| 506 |
+
504,2,104,438355621,LevoParadoxPPOHybrid,0.0,neutral,0.481337308883667
|
| 507 |
+
505,2,105,993080718,LevoParadoxPPOHybrid,0.0,neutral,0.4781184792518616
|
| 508 |
+
506,2,106,1682379032,LevoParadoxPPOHybrid,0.0,neutral,0.47766703367233276
|
| 509 |
+
507,2,107,1013432362,LevoParadoxPPOHybrid,0.8,neutral,0.47702041268348694
|
| 510 |
+
508,2,108,1856562955,LevoParadoxPPOHybrid,0.8,neutral,0.47702041268348694
|
| 511 |
+
509,2,109,1667805176,LevoParadoxPPOHybrid,1.2,neutral,0.48439839482307434
|
| 512 |
+
510,2,110,506300911,LevoParadoxPPOHybrid,0.0,neutral,0.4781184792518616
|
| 513 |
+
511,2,111,222604131,LevoParadoxPPOHybrid,0.0,neutral,0.4793781638145447
|
| 514 |
+
512,2,112,804599567,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 515 |
+
513,2,113,1492613445,LevoParadoxPPOHybrid,0.0,neutral,0.481283962726593
|
| 516 |
+
514,2,114,552650077,LevoParadoxPPOHybrid,-3.0,overconfident,0.4819849133491516
|
| 517 |
+
515,2,115,930025102,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 518 |
+
516,2,116,873459449,LevoParadoxPPOHybrid,2.0,neutral,0.48265746235847473
|
| 519 |
+
517,2,117,467662889,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 520 |
+
518,2,118,445679122,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 521 |
+
519,2,119,1328599419,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 522 |
+
520,2,120,1323806708,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 523 |
+
521,2,121,1034589592,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 524 |
+
522,2,122,413811598,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 525 |
+
523,2,123,753550936,LevoParadoxPPOHybrid,0.0,neutral,0.4846201539039612
|
| 526 |
+
524,2,124,1202521986,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 527 |
+
525,2,125,1933381577,LevoParadoxPPOHybrid,0.0,neutral,0.4850122034549713
|
| 528 |
+
526,2,126,1963329040,LevoParadoxPPOHybrid,0.8,neutral,0.48379752039909363
|
| 529 |
+
527,2,127,1399821071,LevoParadoxPPOHybrid,0.0,neutral,0.4850122034549713
|
| 530 |
+
528,2,128,1828929971,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 531 |
+
529,2,129,1100686433,LevoParadoxPPOHybrid,0.0,neutral,0.4818302094936371
|
| 532 |
+
530,2,130,423774818,LevoParadoxPPOHybrid,0.8,neutral,0.4854736030101776
|
| 533 |
+
531,2,131,2047001195,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 534 |
+
532,2,132,127060851,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 535 |
+
533,2,133,1430942851,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 536 |
+
534,2,134,1194133788,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 537 |
+
535,2,135,30246456,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 538 |
+
536,2,136,1871301169,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 539 |
+
537,2,137,1724977905,LevoParadoxPPOHybrid,0.0,neutral,0.4846201539039612
|
| 540 |
+
538,2,138,1717796771,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 541 |
+
539,2,139,1593858573,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 542 |
+
540,2,140,200663940,LevoParadoxPPOHybrid,-3.0,overconfident,0.4846201539039612
|
| 543 |
+
541,2,141,1366649604,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 544 |
+
542,2,142,1673519505,LevoParadoxPPOHybrid,0.8,neutral,0.4811937212944031
|
| 545 |
+
543,2,143,1177626327,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 546 |
+
544,2,144,262855495,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 547 |
+
545,2,145,1035690989,LevoParadoxPPOHybrid,0.0,neutral,0.4819849133491516
|
| 548 |
+
546,2,146,192999926,LevoParadoxPPOHybrid,0.8,neutral,0.4811937212944031
|
| 549 |
+
547,2,147,1097961901,LevoParadoxPPOHybrid,-0.8,overcautious,0.48265746235847473
|
| 550 |
+
548,2,148,1040646467,LevoParadoxPPOHybrid,2.0,neutral,0.4850122034549713
|
| 551 |
+
549,2,149,1995566658,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 552 |
+
550,2,150,390674833,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 553 |
+
551,2,151,662645968,LevoParadoxPPOHybrid,1.2,neutral,0.4846201539039612
|
| 554 |
+
552,2,152,111224037,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 555 |
+
553,2,153,1242319339,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 556 |
+
554,2,154,1295579201,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 557 |
+
555,2,155,88079789,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 558 |
+
556,2,156,1218832160,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 559 |
+
557,2,157,1199450774,LevoParadoxPPOHybrid,0.8,neutral,0.48379752039909363
|
| 560 |
+
558,2,158,93920744,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 561 |
+
559,2,159,301211568,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 562 |
+
560,2,160,606831608,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 563 |
+
561,2,161,248267762,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 564 |
+
562,2,162,479831997,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 565 |
+
563,2,163,443794762,LevoParadoxPPOHybrid,1.2,neutral,0.4876437187194824
|
| 566 |
+
564,2,164,317845088,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 567 |
+
565,2,165,976368810,LevoParadoxPPOHybrid,0.0,neutral,0.4876437187194824
|
| 568 |
+
566,2,166,1096060710,LevoParadoxPPOHybrid,1.2,neutral,0.4846201539039612
|
| 569 |
+
567,2,167,1786432503,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 570 |
+
568,2,168,92915493,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 571 |
+
569,2,169,169421372,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 572 |
+
570,2,170,827738447,LevoParadoxPPOHybrid,-0.8,overcautious,0.48265746235847473
|
| 573 |
+
571,2,171,91871503,LevoParadoxPPOHybrid,0.8,neutral,0.4812925159931183
|
| 574 |
+
572,2,172,1181786707,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 575 |
+
573,2,173,14354338,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 576 |
+
574,2,174,2140443672,LevoParadoxPPOHybrid,0.0,neutral,0.4819849133491516
|
| 577 |
+
575,2,175,318790932,LevoParadoxPPOHybrid,2.0,neutral,0.48265746235847473
|
| 578 |
+
576,2,176,721850175,LevoParadoxPPOHybrid,2.0,neutral,0.48265746235847473
|
| 579 |
+
577,2,177,1030785601,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 580 |
+
578,2,178,1316251630,LevoParadoxPPOHybrid,0.0,neutral,0.4850122034549713
|
| 581 |
+
579,2,179,1719447051,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 582 |
+
580,2,180,574594100,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 583 |
+
581,2,181,2130613154,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 584 |
+
582,2,182,527701015,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 585 |
+
583,2,183,1227208042,LevoParadoxPPOHybrid,-3.0,overconfident,0.4846201539039612
|
| 586 |
+
584,2,184,633972706,LevoParadoxPPOHybrid,0.8,neutral,0.4818302094936371
|
| 587 |
+
585,2,185,1481264686,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 588 |
+
586,2,186,1403332419,LevoParadoxPPOHybrid,0.8,neutral,0.48329493403434753
|
| 589 |
+
587,2,187,573328882,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 590 |
+
588,2,188,896430961,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 591 |
+
589,2,189,861308429,LevoParadoxPPOHybrid,-3.0,overconfident,0.4819849133491516
|
| 592 |
+
590,2,190,857542805,LevoParadoxPPOHybrid,-3.0,overconfident,0.4846201539039612
|
| 593 |
+
591,2,191,555627012,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 594 |
+
592,2,192,883473089,LevoParadoxPPOHybrid,1.2,neutral,0.4876437187194824
|
| 595 |
+
593,2,193,1183906577,LevoParadoxPPOHybrid,-0.8,overcautious,0.48265746235847473
|
| 596 |
+
594,2,194,1295404722,LevoParadoxPPOHybrid,0.0,neutral,0.4842311441898346
|
| 597 |
+
595,2,195,1602782174,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 598 |
+
596,2,196,1168170146,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 599 |
+
597,2,197,247049848,LevoParadoxPPOHybrid,0.8,neutral,0.4829106330871582
|
| 600 |
+
598,2,198,1217521579,LevoParadoxPPOHybrid,2.0,neutral,0.4850122034549713
|
| 601 |
+
599,2,199,1154221074,LevoParadoxPPOHybrid,-3.0,overconfident,0.4846201539039612
|
| 602 |
+
600,2,200,1039822287,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 603 |
+
601,2,201,403774715,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 604 |
+
602,2,202,1937799744,LevoParadoxPPOHybrid,0.0,neutral,0.4812925159931183
|
| 605 |
+
603,2,203,1530207800,LevoParadoxPPOHybrid,0.8,neutral,0.48379752039909363
|
| 606 |
+
604,2,204,899360822,LevoParadoxPPOHybrid,0.8,neutral,0.4812925159931183
|
| 607 |
+
605,2,205,839140609,LevoParadoxPPOHybrid,2.0,neutral,0.48265746235847473
|
| 608 |
+
606,2,206,2141035731,LevoParadoxPPOHybrid,0.0,neutral,0.4842311441898346
|
| 609 |
+
607,2,207,778084307,LevoParadoxPPOHybrid,1.2,neutral,0.4846201539039612
|
| 610 |
+
608,2,208,350945807,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 611 |
+
609,2,209,970046052,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 612 |
+
610,2,210,828658713,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 613 |
+
611,2,211,899193899,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 614 |
+
612,2,212,1918263815,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 615 |
+
613,2,213,861402774,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 616 |
+
614,2,214,545630730,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 617 |
+
615,2,215,1771344806,LevoParadoxPPOHybrid,0.8,neutral,0.4818302094936371
|
| 618 |
+
616,2,216,835556689,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 619 |
+
617,2,217,920739262,LevoParadoxPPOHybrid,0.8,neutral,0.4857918918132782
|
| 620 |
+
618,2,218,1075133249,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 621 |
+
619,2,219,1466130915,LevoParadoxPPOHybrid,0.8,neutral,0.4811937212944031
|
| 622 |
+
620,2,220,1545638251,LevoParadoxPPOHybrid,-3.0,overconfident,0.4819849133491516
|
| 623 |
+
621,2,221,379504837,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 624 |
+
622,2,222,833504022,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 625 |
+
623,2,223,1846676001,LevoParadoxPPOHybrid,1.2,neutral,0.4876437187194824
|
| 626 |
+
624,2,224,6416948,LevoParadoxPPOHybrid,0.0,neutral,0.4818302094936371
|
| 627 |
+
625,2,225,1751117666,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 628 |
+
626,2,226,284570123,LevoParadoxPPOHybrid,0.8,neutral,0.48379752039909363
|
| 629 |
+
627,2,227,189352376,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 630 |
+
628,2,228,1370043294,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 631 |
+
629,2,229,1967776583,LevoParadoxPPOHybrid,0.0,neutral,0.4818302094936371
|
| 632 |
+
630,2,230,1013942334,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 633 |
+
631,2,231,600184202,LevoParadoxPPOHybrid,0.8,neutral,0.4829106330871582
|
| 634 |
+
632,2,232,2085636407,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 635 |
+
633,2,233,328848547,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 636 |
+
634,2,234,63425983,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 637 |
+
635,2,235,531264304,LevoParadoxPPOHybrid,0.0,neutral,0.48265746235847473
|
| 638 |
+
636,2,236,1531168957,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 639 |
+
637,2,237,1789312949,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 640 |
+
638,2,238,1084402395,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 641 |
+
639,2,239,1545622175,LevoParadoxPPOHybrid,0.8,neutral,0.4854736030101776
|
| 642 |
+
640,2,240,999431888,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 643 |
+
641,2,241,1725426490,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 644 |
+
642,2,242,669407095,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 645 |
+
643,2,243,1417993163,LevoParadoxPPOHybrid,0.8,neutral,0.4818302094936371
|
| 646 |
+
644,2,244,1057045593,LevoParadoxPPOHybrid,0.8,neutral,0.4829106330871582
|
| 647 |
+
645,2,245,1380890934,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 648 |
+
646,2,246,238129855,LevoParadoxPPOHybrid,0.8,neutral,0.4854736030101776
|
| 649 |
+
647,2,247,1486485713,LevoParadoxPPOHybrid,0.8,neutral,0.4811937212944031
|
| 650 |
+
648,2,248,30716145,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 651 |
+
649,2,249,1615261593,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 652 |
+
650,2,250,2052819092,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 653 |
+
651,2,251,11185487,LevoParadoxPPOHybrid,0.0,neutral,0.4812925159931183
|
| 654 |
+
652,2,252,928000143,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 655 |
+
653,2,253,2023963770,LevoParadoxPPOHybrid,1.2,neutral,0.4876437187194824
|
| 656 |
+
654,2,254,1301736393,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 657 |
+
655,2,255,398352915,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 658 |
+
656,2,256,299104752,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 659 |
+
657,2,257,1900619662,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 660 |
+
658,2,258,402834001,LevoParadoxPPOHybrid,1.2,neutral,0.4846201539039612
|
| 661 |
+
659,2,259,618191185,LevoParadoxPPOHybrid,1.2,neutral,0.4876437187194824
|
| 662 |
+
660,2,260,1107226955,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 663 |
+
661,2,261,1079996997,LevoParadoxPPOHybrid,0.8,neutral,0.4857918918132782
|
| 664 |
+
662,2,262,1090799708,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 665 |
+
663,2,263,614807561,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 666 |
+
664,2,264,1110540374,LevoParadoxPPOHybrid,0.0,neutral,0.4850122034549713
|
| 667 |
+
665,2,265,230358128,LevoParadoxPPOHybrid,0.8,neutral,0.4857918918132782
|
| 668 |
+
666,2,266,1307025172,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 669 |
+
667,2,267,2128513208,LevoParadoxPPOHybrid,-3.0,overconfident,0.4846201539039612
|
| 670 |
+
668,2,268,1813190214,LevoParadoxPPOHybrid,1.2,neutral,0.4876437187194824
|
| 671 |
+
669,2,269,427517589,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 672 |
+
670,2,270,971704768,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 673 |
+
671,2,271,379120844,LevoParadoxPPOHybrid,0.8,neutral,0.4857918918132782
|
| 674 |
+
672,2,272,366674027,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 675 |
+
673,2,273,1267589757,LevoParadoxPPOHybrid,0.8,neutral,0.4818302094936371
|
| 676 |
+
674,2,274,397609752,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 677 |
+
675,2,275,544583423,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 678 |
+
676,2,276,1765101426,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 679 |
+
677,2,277,569693597,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 680 |
+
678,2,278,189460983,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 681 |
+
679,2,279,505940532,LevoParadoxPPOHybrid,0.0,neutral,0.481283962726593
|
| 682 |
+
680,2,280,961700536,LevoParadoxPPOHybrid,1.2,neutral,0.4819849133491516
|
| 683 |
+
681,2,281,932456279,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 684 |
+
682,2,282,390287427,LevoParadoxPPOHybrid,2.0,neutral,0.4850122034549713
|
| 685 |
+
683,2,283,297976648,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 686 |
+
684,2,284,436098708,LevoParadoxPPOHybrid,0.0,neutral,0.481283962726593
|
| 687 |
+
685,2,285,794629335,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 688 |
+
686,2,286,1214082779,LevoParadoxPPOHybrid,0.8,neutral,0.481283962726593
|
| 689 |
+
687,2,287,1935214602,LevoParadoxPPOHybrid,0.0,neutral,0.4842311441898346
|
| 690 |
+
688,2,288,284248471,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 691 |
+
689,2,289,1230641234,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 692 |
+
690,2,290,388858966,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 693 |
+
691,2,291,1021791854,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 694 |
+
692,2,292,603303402,LevoParadoxPPOHybrid,0.8,neutral,0.48379752039909363
|
| 695 |
+
693,2,293,862608619,LevoParadoxPPOHybrid,0.8,neutral,0.481283962726593
|
| 696 |
+
694,2,294,1651871421,LevoParadoxPPOHybrid,0.8,neutral,0.4811937212944031
|
| 697 |
+
695,2,295,2051444313,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 698 |
+
696,2,296,144628230,LevoParadoxPPOHybrid,0.8,neutral,0.48329493403434753
|
| 699 |
+
697,2,297,1520429634,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 700 |
+
698,2,298,881109934,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 701 |
+
699,2,299,1255956995,LevoParadoxPPOHybrid,0.0,neutral,0.481283962726593
|
| 702 |
+
700,2,300,208230768,LevoParadoxPPOHybrid,0.8,neutral,0.4829106330871582
|
| 703 |
+
701,2,301,1460257335,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 704 |
+
702,2,302,1011782590,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 705 |
+
703,2,303,1789340557,LevoParadoxPPOHybrid,2.0,neutral,0.48265746235847473
|
| 706 |
+
704,2,304,1869217819,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 707 |
+
705,2,305,1673802110,LevoParadoxPPOHybrid,0.0,neutral,0.481283962726593
|
| 708 |
+
706,2,306,62463393,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 709 |
+
707,2,307,2074841997,LevoParadoxPPOHybrid,-3.0,overconfident,0.4846201539039612
|
| 710 |
+
708,2,308,1764116324,LevoParadoxPPOHybrid,-3.0,overconfident,0.4819849133491516
|
| 711 |
+
709,2,309,1361763883,LevoParadoxPPOHybrid,0.0,neutral,0.4819849133491516
|
| 712 |
+
710,2,310,2068149571,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 713 |
+
711,2,311,1761270974,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 714 |
+
712,2,312,1610445955,LevoParadoxPPOHybrid,0.8,neutral,0.4818302094936371
|
| 715 |
+
713,2,313,527574022,LevoParadoxPPOHybrid,0.8,neutral,0.4857918918132782
|
| 716 |
+
714,2,314,1948416385,LevoParadoxPPOHybrid,0.8,neutral,0.4812925159931183
|
| 717 |
+
715,2,315,842515162,LevoParadoxPPOHybrid,1.2,neutral,0.4846201539039612
|
| 718 |
+
716,2,316,728127582,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 719 |
+
717,2,317,1807809684,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 720 |
+
718,2,318,1911608906,LevoParadoxPPOHybrid,0.8,neutral,0.481283962726593
|
| 721 |
+
719,2,319,507860031,LevoParadoxPPOHybrid,0.8,neutral,0.48329493403434753
|
| 722 |
+
720,2,320,1559660249,LevoParadoxPPOHybrid,0.0,neutral,0.4812925159931183
|
| 723 |
+
721,2,321,817113483,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 724 |
+
722,2,322,181612330,LevoParadoxPPOHybrid,0.0,neutral,0.4818302094936371
|
| 725 |
+
723,2,323,330146939,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 726 |
+
724,2,324,1451519916,LevoParadoxPPOHybrid,0.8,neutral,0.48329493403434753
|
| 727 |
+
725,2,325,429715005,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 728 |
+
726,2,326,1836744305,LevoParadoxPPOHybrid,2.0,neutral,0.48265746235847473
|
| 729 |
+
727,2,327,200999922,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 730 |
+
728,2,328,686960989,LevoParadoxPPOHybrid,1.2,neutral,0.4819849133491516
|
| 731 |
+
729,2,329,2137759524,LevoParadoxPPOHybrid,0.0,neutral,0.4857918918132782
|
| 732 |
+
730,2,330,48470119,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 733 |
+
731,2,331,1429722682,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 734 |
+
732,2,332,218074447,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 735 |
+
733,2,333,2104545774,LevoParadoxPPOHybrid,0.8,neutral,0.4811937212944031
|
| 736 |
+
734,2,334,1816453390,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 737 |
+
735,2,335,639577193,LevoParadoxPPOHybrid,0.0,neutral,0.48379752039909363
|
| 738 |
+
736,2,336,231860645,LevoParadoxPPOHybrid,1.2,neutral,0.4846201539039612
|
| 739 |
+
737,2,337,1142197128,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 740 |
+
738,2,338,1321680746,LevoParadoxPPOHybrid,0.8,neutral,0.48379752039909363
|
| 741 |
+
739,2,339,1746554905,LevoParadoxPPOHybrid,0.0,neutral,0.4812925159931183
|
| 742 |
+
740,2,340,396707811,LevoParadoxPPOHybrid,0.8,neutral,0.4854736030101776
|
| 743 |
+
741,2,341,491514850,LevoParadoxPPOHybrid,0.8,neutral,0.48286885023117065
|
| 744 |
+
742,2,342,461674718,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 745 |
+
743,2,343,1701500925,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 746 |
+
744,2,344,1344298913,LevoParadoxPPOHybrid,0.0,neutral,0.4818302094936371
|
| 747 |
+
745,2,345,1354823084,LevoParadoxPPOHybrid,0.0,neutral,0.4811937212944031
|
| 748 |
+
746,2,346,118160105,LevoParadoxPPOHybrid,1.2,neutral,0.4819849133491516
|
| 749 |
+
747,2,347,1044584312,LevoParadoxPPOHybrid,0.8,neutral,0.4839756190776825
|
| 750 |
+
748,2,348,1524392230,LevoParadoxPPOHybrid,0.0,neutral,0.4819849133491516
|
| 751 |
+
749,2,349,428869864,LevoParadoxPPOHybrid,0.8,neutral,0.48329493403434753
|
| 752 |
+
750,2,350,180994417,LevoParadoxPPOHybrid,0.8,neutral,0.4829106330871582
|
| 753 |
+
751,2,351,885019589,LevoParadoxPPOHybrid,0.0,neutral,0.4812925159931183
|
| 754 |
+
752,2,352,1231928222,LevoParadoxPPOHybrid,0.0,neutral,0.4854736030101776
|
| 755 |
+
753,2,353,1670237802,LevoParadoxPPOHybrid,0.0,neutral,0.4839756190776825
|
| 756 |
+
754,2,354,1414482049,LevoParadoxPPOHybrid,0.8,neutral,0.4854736030101776
|
| 757 |
+
755,2,355,1971477631,LevoParadoxPPOHybrid,2.0,neutral,0.4842311441898346
|
| 758 |
+
756,2,356,883215094,LevoParadoxPPOHybrid,0.0,neutral,0.4846201539039612
|
| 759 |
+
757,2,357,343285816,LevoParadoxPPOHybrid,-3.0,overconfident,0.4819849133491516
|
| 760 |
+
758,2,358,1993664325,LevoParadoxPPOHybrid,-0.8,overcautious,0.4850122034549713
|
| 761 |
+
759,2,359,538994041,LevoParadoxPPOHybrid,0.8,neutral,0.4818005859851837
|
| 762 |
+
760,2,360,365720817,LevoParadoxPPOHybrid,-0.8,overcautious,0.4842311441898346
|
| 763 |
+
761,2,361,1931073180,LevoParadoxPPOHybrid,0.0,neutral,0.48286885023117065
|
| 764 |
+
762,2,362,330654991,LevoParadoxPPOHybrid,0.0,neutral,0.4818005859851837
|
| 765 |
+
763,2,363,2117986561,LevoParadoxPPOHybrid,-3.0,overconfident,0.4876437187194824
|
| 766 |
+
764,2,364,1745610389,LevoParadoxPPOHybrid,0.0,neutral,0.48265746235847473
|
| 767 |
+
765,2,365,1935491097,LevoParadoxPPOHybrid,0.8,neutral,0.481283962726593
|
| 768 |
+
766,2,366,816460352,LevoParadoxPPOHybrid,0.0,neutral,0.48329493403434753
|
| 769 |
+
767,2,367,2034287239,LevoParadoxPPOHybrid,0.0,neutral,0.4829106330871582
|
| 770 |
+
768,2,368,1494357375,LevoParadoxPPOHybrid,0.8,neutral,0.48519960045814514
|
| 771 |
+
769,2,369,525099930,LevoParadoxPPOHybrid,0.8,neutral,0.48731231689453125
|
| 772 |
+
770,2,370,461861420,LevoParadoxPPOHybrid,0.8,neutral,0.4886108636856079
|
| 773 |
+
771,2,371,424434369,LevoParadoxPPOHybrid,0.0,neutral,0.48417460918426514
|
| 774 |
+
772,2,372,1696040440,LevoParadoxPPOHybrid,0.0,neutral,0.48826003074645996
|
| 775 |
+
773,2,373,1327732050,LevoParadoxPPOHybrid,0.8,neutral,0.48468780517578125
|
| 776 |
+
774,2,374,1275639253,LevoParadoxPPOHybrid,0.8,neutral,0.48519960045814514
|
| 777 |
+
775,2,375,180175624,LevoParadoxPPOHybrid,0.0,neutral,0.48731231689453125
|
| 778 |
+
776,2,376,853325992,LevoParadoxPPOHybrid,1.2,neutral,0.48919999599456787
|
| 779 |
+
777,2,377,35314844,LevoParadoxPPOHybrid,0.0,neutral,0.4842897355556488
|
| 780 |
+
778,2,378,512421119,LevoParadoxPPOHybrid,-0.8,overcautious,0.48792359232902527
|
| 781 |
+
779,2,379,1818877815,LevoParadoxPPOHybrid,0.0,neutral,0.4842897355556488
|
| 782 |
+
780,2,380,244612068,LevoParadoxPPOHybrid,0.8,neutral,0.48738181591033936
|
| 783 |
+
781,2,381,438090890,LevoParadoxPPOHybrid,0.8,neutral,0.4872293472290039
|
| 784 |
+
782,2,382,71908212,LevoParadoxPPOHybrid,0.0,neutral,0.4857252836227417
|
| 785 |
+
783,2,383,763979621,LevoParadoxPPOHybrid,0.0,neutral,0.4857252836227417
|
| 786 |
+
784,2,384,492409950,LevoParadoxPPOHybrid,0.8,neutral,0.4872293472290039
|
| 787 |
+
785,2,385,1939330706,LevoParadoxPPOHybrid,-3.0,overconfident,0.48516950011253357
|
| 788 |
+
786,2,386,304266562,LevoParadoxPPOHybrid,0.8,neutral,0.4857252836227417
|
| 789 |
+
787,2,387,1839152413,LevoParadoxPPOHybrid,0.8,neutral,0.48519960045814514
|
| 790 |
+
788,2,388,1584964798,LevoParadoxPPOHybrid,0.8,neutral,0.48738181591033936
|
| 791 |
+
789,2,389,1705345529,LevoParadoxPPOHybrid,0.0,neutral,0.48468780517578125
|
| 792 |
+
790,2,390,530680927,LevoParadoxPPOHybrid,0.0,neutral,0.48826003074645996
|
| 793 |
+
791,2,391,601158382,LevoParadoxPPOHybrid,-3.0,overconfident,0.4865123927593231
|
| 794 |
+
792,2,392,661312537,LevoParadoxPPOHybrid,0.8,neutral,0.4886108636856079
|
| 795 |
+
793,2,393,1099910893,LevoParadoxPPOHybrid,0.8,neutral,0.48417460918426514
|
| 796 |
+
794,2,394,1777836792,LevoParadoxPPOHybrid,1.2,neutral,0.4865123927593231
|
| 797 |
+
795,2,395,320819501,LevoParadoxPPOHybrid,0.0,neutral,0.48519960045814514
|
| 798 |
+
796,2,396,1262930064,LevoParadoxPPOHybrid,0.0,neutral,0.48468780517578125
|
| 799 |
+
797,2,397,1476382876,LevoParadoxPPOHybrid,0.8,neutral,0.48468780517578125
|
| 800 |
+
798,2,398,229480971,LevoParadoxPPOHybrid,0.0,neutral,0.48731231689453125
|
| 801 |
+
799,2,399,1346765522,LevoParadoxPPOHybrid,0.0,neutral,0.48731231689453125
|
| 802 |
+
800,3,0,1015467875,LevoParadoxPPOHybrid,0.49029308438457947,neutral,0.48342037200927734
|
| 803 |
+
801,3,1,871703027,LevoParadoxPPOHybrid,0.2583186351063763,neutral,0.48847508430480957
|
| 804 |
+
802,3,2,1121193219,LevoParadoxPPOHybrid,-0.9285687801394484,overcautious,0.4896336793899536
|
| 805 |
+
803,3,3,1844331605,LevoParadoxPPOHybrid,1.268712954493355,neutral,0.4856588840484619
|
| 806 |
+
804,3,4,376821421,LevoParadoxPPOHybrid,-2.1540989698282287,overconfident,0.49011749029159546
|
| 807 |
+
805,3,5,1528947293,LevoParadoxPPOHybrid,1.9236203197456223,neutral,0.49011749029159546
|
| 808 |
+
806,3,6,1457385050,LevoParadoxPPOHybrid,-0.388878696540991,neutral,0.48847508430480957
|
| 809 |
+
807,3,7,1930833205,LevoParadoxPPOHybrid,1.8947708652049988,neutral,0.4878310561180115
|
| 810 |
+
808,3,8,331658631,LevoParadoxPPOHybrid,-0.34637226145235095,overcautious,0.48912549018859863
|
| 811 |
+
809,3,9,1392760183,LevoParadoxPPOHybrid,-1.7470900488231007,overconfident,0.48763468861579895
|
| 812 |
+
810,3,10,1410154195,LevoParadoxPPOHybrid,0.37503834948416703,neutral,0.48973292112350464
|
| 813 |
+
811,3,11,1330897656,LevoParadoxPPOHybrid,1.9046013636486836,neutral,0.49011749029159546
|
| 814 |
+
812,3,12,755426389,LevoParadoxPPOHybrid,-0.08449315822425026,neutral,0.4876002371311188
|
| 815 |
+
813,3,13,478344337,LevoParadoxPPOHybrid,-0.20334804248604185,neutral,0.48973292112350464
|
| 816 |
+
814,3,14,2135473267,LevoParadoxPPOHybrid,-0.321538017298501,neutral,0.48342037200927734
|
| 817 |
+
815,3,15,1381920965,LevoParadoxPPOHybrid,-0.8946149359899849,neutral,0.4856588840484619
|
| 818 |
+
816,3,16,790353978,LevoParadoxPPOHybrid,0.805089675891586,neutral,0.48261088132858276
|
| 819 |
+
817,3,17,886917887,LevoParadoxPPOHybrid,-2.0434560465424223,overconfident,0.48763468861579895
|
| 820 |
+
818,3,18,1326287162,LevoParadoxPPOHybrid,0.35056089697345333,neutral,0.4878310561180115
|
| 821 |
+
819,3,19,132467973,LevoParadoxPPOHybrid,0.7640856467236494,neutral,0.49011749029159546
|
| 822 |
+
820,3,20,896694920,LevoParadoxPPOHybrid,0.6314368917416728,neutral,0.48973292112350464
|
| 823 |
+
821,3,21,265295982,LevoParadoxPPOHybrid,0.472286750236512,neutral,0.48261088132858276
|
| 824 |
+
822,3,22,188123431,LevoParadoxPPOHybrid,0.7270211373649718,neutral,0.4841948449611664
|
| 825 |
+
823,3,23,1385912200,LevoParadoxPPOHybrid,0.5742713840510624,neutral,0.48847508430480957
|
| 826 |
+
824,3,24,449987729,LevoParadoxPPOHybrid,0.150792838879278,neutral,0.4853600561618805
|
| 827 |
+
825,3,25,593302824,LevoParadoxPPOHybrid,-0.045015931355259255,neutral,0.48763468861579895
|
| 828 |
+
826,3,26,194879931,LevoParadoxPPOHybrid,0.17815411284413574,neutral,0.4832690358161926
|
| 829 |
+
827,3,27,1758518115,LevoParadoxPPOHybrid,1.045585673873838,neutral,0.49009424448013306
|
| 830 |
+
828,3,28,1545311517,LevoParadoxPPOHybrid,0.1627856125489353,neutral,0.4856588840484619
|
| 831 |
+
829,3,29,562603550,LevoParadoxPPOHybrid,1.2183364147364109,neutral,0.48261088132858276
|
| 832 |
+
830,3,30,1059808449,LevoParadoxPPOHybrid,1.2917831804345576,neutral,0.48261088132858276
|
| 833 |
+
831,3,31,614383066,LevoParadoxPPOHybrid,0.016342221885410586,neutral,0.48973292112350464
|
| 834 |
+
832,3,32,1192512057,LevoParadoxPPOHybrid,-0.5442359769557571,overcautious,0.48912549018859863
|
| 835 |
+
833,3,33,950581637,LevoParadoxPPOHybrid,-0.8977958223217277,neutral,0.48956099152565
|
| 836 |
+
834,3,34,1863772308,LevoParadoxPPOHybrid,0.45308998140979106,neutral,0.48973292112350464
|
| 837 |
+
835,3,35,1007304414,LevoParadoxPPOHybrid,0.5254077508874286,neutral,0.48956099152565
|
| 838 |
+
836,3,36,809066309,LevoParadoxPPOHybrid,-1.1110986321443062,overcautious,0.4853600561618805
|
| 839 |
+
837,3,37,1514006645,LevoParadoxPPOHybrid,-0.3418469151415457,neutral,0.48763468861579895
|
| 840 |
+
838,3,38,1146495174,LevoParadoxPPOHybrid,-0.2942163006184566,neutral,0.48847508430480957
|
| 841 |
+
839,3,39,1859928275,LevoParadoxPPOHybrid,2.5861061474664324,neutral,0.48912549018859863
|
| 842 |
+
840,3,40,303035184,LevoParadoxPPOHybrid,2.2035140269583504,neutral,0.4896336793899536
|
| 843 |
+
841,3,41,1724145893,LevoParadoxPPOHybrid,0.9938873972881753,neutral,0.4878310561180115
|
| 844 |
+
842,3,42,1035035036,LevoParadoxPPOHybrid,2.053749158155912,neutral,0.4853600561618805
|
| 845 |
+
843,3,43,278635683,LevoParadoxPPOHybrid,1.54230006707985,neutral,0.4896336793899536
|
| 846 |
+
844,3,44,377801781,LevoParadoxPPOHybrid,2.2669636777741404,neutral,0.48912549018859863
|
| 847 |
+
845,3,45,1487506785,LevoParadoxPPOHybrid,0.5730128127334602,neutral,0.4841948449611664
|
| 848 |
+
846,3,46,766738768,LevoParadoxPPOHybrid,1.7451958636224911,neutral,0.48763468861579895
|
| 849 |
+
847,3,47,1469590444,LevoParadoxPPOHybrid,-0.11980525970062122,neutral,0.4856588840484619
|
| 850 |
+
848,3,48,1527511243,LevoParadoxPPOHybrid,0.47426746416333615,neutral,0.4882761538028717
|
| 851 |
+
849,3,49,1889868992,LevoParadoxPPOHybrid,0.18740335053313484,neutral,0.48342037200927734
|
| 852 |
+
850,3,50,808836466,LevoParadoxPPOHybrid,1.4424045317149554,neutral,0.48342037200927734
|
| 853 |
+
851,3,51,880209119,LevoParadoxPPOHybrid,-0.41698242562591825,neutral,0.4856588840484619
|
| 854 |
+
852,3,52,2069774123,LevoParadoxPPOHybrid,1.1358277140176187,neutral,0.48973292112350464
|
| 855 |
+
853,3,53,59978537,LevoParadoxPPOHybrid,1.2273143926451668,neutral,0.48261088132858276
|
| 856 |
+
854,3,54,268314216,LevoParadoxPPOHybrid,1.1038476892173612,neutral,0.49011749029159546
|
| 857 |
+
855,3,55,786773386,LevoParadoxPPOHybrid,1.2293653945237177,neutral,0.48973292112350464
|
| 858 |
+
856,3,56,1078804137,LevoParadoxPPOHybrid,1.9968823651873315,neutral,0.4896336793899536
|
| 859 |
+
857,3,57,88529032,LevoParadoxPPOHybrid,0.9139455244229703,neutral,0.48261088132858276
|
| 860 |
+
858,3,58,733437594,LevoParadoxPPOHybrid,0.9998437802015792,neutral,0.4832690358161926
|
| 861 |
+
859,3,59,1895500654,LevoParadoxPPOHybrid,1.1147969815448564,neutral,0.4832690358161926
|
| 862 |
+
860,3,60,1156794677,LevoParadoxPPOHybrid,0.2822839034147425,neutral,0.4878310561180115
|
| 863 |
+
861,3,61,1733698348,LevoParadoxPPOHybrid,1.1083787111148988,neutral,0.48261088132858276
|
| 864 |
+
862,3,62,1987643195,LevoParadoxPPOHybrid,1.6494336690825908,neutral,0.48973292112350464
|
| 865 |
+
863,3,63,968829821,LevoParadoxPPOHybrid,-1.3638653475842197,overcautious,0.4896336793899536
|
| 866 |
+
864,3,64,2125839782,LevoParadoxPPOHybrid,-0.2783466794080766,neutral,0.4832690358161926
|
| 867 |
+
865,3,65,1588322590,LevoParadoxPPOHybrid,2.2909286951175467,neutral,0.4859134256839752
|
| 868 |
+
866,3,66,956367808,LevoParadoxPPOHybrid,-0.13769164780464407,neutral,0.49011749029159546
|
| 869 |
+
867,3,67,2135886715,LevoParadoxPPOHybrid,0.9020338710094363,neutral,0.48261088132858276
|
| 870 |
+
868,3,68,705297723,LevoParadoxPPOHybrid,2.267886356355249,neutral,0.48912549018859863
|
| 871 |
+
869,3,69,493712258,LevoParadoxPPOHybrid,0.07995221270930497,neutral,0.4876002371311188
|
| 872 |
+
870,3,70,75420035,LevoParadoxPPOHybrid,1.2007933704297795,neutral,0.4856588840484619
|
| 873 |
+
871,3,71,1867815399,LevoParadoxPPOHybrid,-1.475944225695721,overconfident,0.4882761538028717
|
| 874 |
+
872,3,72,509860178,LevoParadoxPPOHybrid,-1.0158303213136595,neutral,0.48973292112350464
|
| 875 |
+
873,3,73,687658415,LevoParadoxPPOHybrid,-0.044455013110146525,neutral,0.48956099152565
|
| 876 |
+
874,3,74,319346835,LevoParadoxPPOHybrid,1.1336872360109915,neutral,0.49009424448013306
|
| 877 |
+
875,3,75,985914893,LevoParadoxPPOHybrid,-1.1520970521006983,overconfident,0.49011749029159546
|
| 878 |
+
876,3,76,456914363,LevoParadoxPPOHybrid,-0.5563823345326576,neutral,0.48847508430480957
|
| 879 |
+
877,3,77,1903234235,LevoParadoxPPOHybrid,-0.6168972120738625,neutral,0.48973292112350464
|
| 880 |
+
878,3,78,1104964239,LevoParadoxPPOHybrid,-0.5537494140426967,neutral,0.4859134256839752
|
| 881 |
+
879,3,79,800272976,LevoParadoxPPOHybrid,1.0014376600959138,neutral,0.48763468861579895
|
| 882 |
+
880,3,80,514077870,LevoParadoxPPOHybrid,1.348889466402683,neutral,0.4878310561180115
|
| 883 |
+
881,3,81,2084198909,LevoParadoxPPOHybrid,1.1757541313429112,neutral,0.48973292112350464
|
| 884 |
+
882,3,82,909365514,LevoParadoxPPOHybrid,1.6573741369785153,neutral,0.4832690358161926
|
| 885 |
+
883,3,83,1338386269,LevoParadoxPPOHybrid,-2.0258053677846037,overconfident,0.4882761538028717
|
| 886 |
+
884,3,84,947429886,LevoParadoxPPOHybrid,0.6408681653569512,neutral,0.48342037200927734
|
| 887 |
+
885,3,85,58590834,LevoParadoxPPOHybrid,1.324978671615042,neutral,0.49009424448013306
|
| 888 |
+
886,3,86,684669113,LevoParadoxPPOHybrid,0.7636384160065989,neutral,0.48973292112350464
|
| 889 |
+
887,3,87,898917724,LevoParadoxPPOHybrid,-1.2982161592441008,overcautious,0.48912549018859863
|
| 890 |
+
888,3,88,548630351,LevoParadoxPPOHybrid,-0.2270660769418316,neutral,0.4832690358161926
|
| 891 |
+
889,3,89,1616758964,LevoParadoxPPOHybrid,1.9765640849812711,neutral,0.49011749029159546
|
| 892 |
+
890,3,90,2082505679,LevoParadoxPPOHybrid,-0.6935378671763233,neutral,0.4841948449611664
|
| 893 |
+
891,3,91,741581883,LevoParadoxPPOHybrid,-0.0517050103645994,neutral,0.48847508430480957
|
| 894 |
+
892,3,92,393553070,LevoParadoxPPOHybrid,-1.66724885658832,overconfident,0.48763468861579895
|
| 895 |
+
893,3,93,890404536,LevoParadoxPPOHybrid,0.11880035600180827,neutral,0.48847508430480957
|
| 896 |
+
894,3,94,179225205,LevoParadoxPPOHybrid,1.1151171438000786,neutral,0.48912549018859863
|
| 897 |
+
895,3,95,852483643,LevoParadoxPPOHybrid,1.0428840098478962,neutral,0.4878310561180115
|
| 898 |
+
896,3,96,596549345,LevoParadoxPPOHybrid,1.0439902976490092,neutral,0.4859134256839752
|
| 899 |
+
897,3,97,1246421089,LevoParadoxPPOHybrid,1.363801434612391,neutral,0.48763468861579895
|
| 900 |
+
898,3,98,505921964,LevoParadoxPPOHybrid,-1.858527642939623,overconfident,0.49011749029159546
|
| 901 |
+
899,3,99,1670483738,LevoParadoxPPOHybrid,2.368154360450977,neutral,0.4896336793899536
|
| 902 |
+
900,3,100,598294997,LevoParadoxPPOHybrid,1.318673479308487,neutral,0.4878310561180115
|
| 903 |
+
901,3,101,1370406670,LevoParadoxPPOHybrid,-0.6009999531995625,overcautious,0.48912549018859863
|
| 904 |
+
902,3,102,1690182943,LevoParadoxPPOHybrid,0.4903581932462463,neutral,0.4882761538028717
|
| 905 |
+
903,3,103,1763960416,LevoParadoxPPOHybrid,0.10068445791849981,neutral,0.4878310561180115
|
| 906 |
+
904,3,104,1645746969,LevoParadoxPPOHybrid,0.4513871460018203,neutral,0.4882761538028717
|
| 907 |
+
905,3,105,820931753,LevoParadoxPPOHybrid,0.962884542235,neutral,0.4878310561180115
|
| 908 |
+
906,3,106,1937660724,LevoParadoxPPOHybrid,0.20491593125696084,neutral,0.48763468861579895
|
| 909 |
+
907,3,107,536112434,LevoParadoxPPOHybrid,-0.6515974640687232,neutral,0.4859134256839752
|
| 910 |
+
908,3,108,852564596,LevoParadoxPPOHybrid,1.9825755691164177,neutral,0.49011749029159546
|
| 911 |
+
909,3,109,2109579034,LevoParadoxPPOHybrid,0.849483274776245,neutral,0.4876002371311188
|
| 912 |
+
910,3,110,1119218651,LevoParadoxPPOHybrid,2.36103349569904,neutral,0.48912549018859863
|
| 913 |
+
911,3,111,1171844126,LevoParadoxPPOHybrid,0.6209249958307298,neutral,0.4896336793899536
|
| 914 |
+
912,3,112,1066832,LevoParadoxPPOHybrid,-1.592546479482495,overconfident,0.48763468861579895
|
| 915 |
+
913,3,113,2039855300,LevoParadoxPPOHybrid,-1.504881615380498,overconfident,0.49011749029159546
|
| 916 |
+
914,3,114,1830413706,LevoParadoxPPOHybrid,0.6645794180980706,neutral,0.48973292112350464
|
| 917 |
+
915,3,115,1536434038,LevoParadoxPPOHybrid,-2.4062797861421963,overconfident,0.48763468861579895
|
| 918 |
+
916,3,116,204181968,LevoParadoxPPOHybrid,0.6050677080581792,neutral,0.4841948449611664
|
| 919 |
+
917,3,117,782074719,LevoParadoxPPOHybrid,0.5091854411977584,neutral,0.48342037200927734
|
| 920 |
+
918,3,118,1683677695,LevoParadoxPPOHybrid,-0.13301843465527774,neutral,0.4882761538028717
|
| 921 |
+
919,3,119,811003462,LevoParadoxPPOHybrid,0.23188393912158678,neutral,0.48973292112350464
|
| 922 |
+
920,3,120,1843531798,LevoParadoxPPOHybrid,-2.1411527352505653,overconfident,0.4882761538028717
|
| 923 |
+
921,3,121,244956048,LevoParadoxPPOHybrid,-3.0,overconfident,0.4882761538028717
|
| 924 |
+
922,3,122,521744775,LevoParadoxPPOHybrid,1.2719310359187297,neutral,0.48973292112350464
|
| 925 |
+
923,3,123,137476059,LevoParadoxPPOHybrid,-0.01526260625040965,overcautious,0.4896336793899536
|
| 926 |
+
924,3,124,1493249395,LevoParadoxPPOHybrid,0.7601033690157201,neutral,0.48342037200927734
|
| 927 |
+
925,3,125,1658377656,LevoParadoxPPOHybrid,-0.0057138258475040145,neutral,0.48847508430480957
|
| 928 |
+
926,3,126,1598149764,LevoParadoxPPOHybrid,-0.7555320294233012,overcautious,0.4896336793899536
|
| 929 |
+
927,3,127,1973871594,LevoParadoxPPOHybrid,-0.17183341968445853,neutral,0.48342037200927734
|
| 930 |
+
928,3,128,1575988774,LevoParadoxPPOHybrid,1.1486204800254285,neutral,0.4878310561180115
|
| 931 |
+
929,3,129,352160276,LevoParadoxPPOHybrid,-0.09552234063130116,overcautious,0.4896336793899536
|
| 932 |
+
930,3,130,1951098323,LevoParadoxPPOHybrid,-0.30943551223890026,overcautious,0.4896336793899536
|
| 933 |
+
931,3,131,496971788,LevoParadoxPPOHybrid,0.12521537161674298,neutral,0.48342037200927734
|
| 934 |
+
932,3,132,1527624590,LevoParadoxPPOHybrid,0.27854327915885413,neutral,0.4859134256839752
|
| 935 |
+
933,3,133,400244675,LevoParadoxPPOHybrid,0.4690883568339111,neutral,0.48261088132858276
|
| 936 |
+
934,3,134,386029926,LevoParadoxPPOHybrid,1.6115419185654172,neutral,0.48847508430480957
|
| 937 |
+
935,3,135,573115058,LevoParadoxPPOHybrid,0.3348870252362766,neutral,0.4878310561180115
|
| 938 |
+
936,3,136,575530726,LevoParadoxPPOHybrid,-0.4869844334164761,neutral,0.4878310561180115
|
| 939 |
+
937,3,137,1964806113,LevoParadoxPPOHybrid,1.646603023563101,neutral,0.48956099152565
|
| 940 |
+
938,3,138,1773149752,LevoParadoxPPOHybrid,-1.4756296842408974,overcautious,0.4853600561618805
|
| 941 |
+
939,3,139,1241865463,LevoParadoxPPOHybrid,0.7525970473504748,neutral,0.4856588840484619
|
| 942 |
+
940,3,140,330338515,LevoParadoxPPOHybrid,0.14435952462764418,neutral,0.49011749029159546
|
| 943 |
+
941,3,141,761423743,LevoParadoxPPOHybrid,1.498481325424641,neutral,0.48912549018859863
|
| 944 |
+
942,3,142,455706626,LevoParadoxPPOHybrid,-0.4525828220379003,neutral,0.48342037200927734
|
| 945 |
+
943,3,143,1509528211,LevoParadoxPPOHybrid,0.26559561736173787,neutral,0.48847508430480957
|
| 946 |
+
944,3,144,1356675324,LevoParadoxPPOHybrid,-3.0,overconfident,0.48763468861579895
|
| 947 |
+
945,3,145,567724229,LevoParadoxPPOHybrid,-1.9704376301344195,overconfident,0.48763468861579895
|
| 948 |
+
946,3,146,490459625,LevoParadoxPPOHybrid,-0.4252469944816251,neutral,0.48973292112350464
|
| 949 |
+
947,3,147,1407038082,LevoParadoxPPOHybrid,-0.4074473579795859,neutral,0.4832690358161926
|
| 950 |
+
948,3,148,247701853,LevoParadoxPPOHybrid,0.8320849787931718,neutral,0.48261088132858276
|
| 951 |
+
949,3,149,1656318998,LevoParadoxPPOHybrid,-1.844959510594005,overconfident,0.49011749029159546
|
| 952 |
+
950,3,150,1050418889,LevoParadoxPPOHybrid,-1.712401117846471,overconfident,0.4882761538028717
|
| 953 |
+
951,3,151,1647828121,LevoParadoxPPOHybrid,-2.585520438420843,overconfident,0.49011749029159546
|
| 954 |
+
952,3,152,1665251223,LevoParadoxPPOHybrid,0.4598923759613715,neutral,0.48956099152565
|
| 955 |
+
953,3,153,1158119200,LevoParadoxPPOHybrid,-0.3010780110926538,neutral,0.4882761538028717
|
| 956 |
+
954,3,154,1745086003,LevoParadoxPPOHybrid,1.3934767393490588,neutral,0.49011749029159546
|
| 957 |
+
955,3,155,1329952935,LevoParadoxPPOHybrid,0.4028712963253857,neutral,0.48847508430480957
|
| 958 |
+
956,3,156,129216577,LevoParadoxPPOHybrid,1.6226525683891055,neutral,0.48973292112350464
|
| 959 |
+
957,3,157,264447624,LevoParadoxPPOHybrid,-0.2925163838635117,neutral,0.48956099152565
|
| 960 |
+
958,3,158,1239906804,LevoParadoxPPOHybrid,-0.3826083405585227,neutral,0.4878310561180115
|
| 961 |
+
959,3,159,1968251934,LevoParadoxPPOHybrid,-3.0,overconfident,0.4882761538028717
|
| 962 |
+
960,3,160,1710361518,LevoParadoxPPOHybrid,0.24410679553415088,neutral,0.4859134256839752
|
| 963 |
+
961,3,161,1919087800,LevoParadoxPPOHybrid,1.3080289495019592,neutral,0.48261088132858276
|
| 964 |
+
962,3,162,1038210496,LevoParadoxPPOHybrid,-0.795060643378411,neutral,0.4878310561180115
|
| 965 |
+
963,3,163,1786593305,LevoParadoxPPOHybrid,-0.4133444185482581,neutral,0.48956099152565
|
| 966 |
+
964,3,164,2098346951,LevoParadoxPPOHybrid,0.37264748440059975,neutral,0.4876002371311188
|
| 967 |
+
965,3,165,1526904777,LevoParadoxPPOHybrid,0.24330040162795474,neutral,0.4853600561618805
|
| 968 |
+
966,3,166,1540522504,LevoParadoxPPOHybrid,0.3133023273996773,neutral,0.4841948449611664
|
| 969 |
+
967,3,167,2109348201,LevoParadoxPPOHybrid,0.6798652475070099,neutral,0.4832690358161926
|
| 970 |
+
968,3,168,1132622124,LevoParadoxPPOHybrid,-0.6901294612165475,overcautious,0.4896336793899536
|
| 971 |
+
969,3,169,1615465936,LevoParadoxPPOHybrid,-2.3064563431034584,overconfident,0.49011749029159546
|
| 972 |
+
970,3,170,364326948,LevoParadoxPPOHybrid,1.0815486952393436,neutral,0.4876002371311188
|
| 973 |
+
971,3,171,1220814450,LevoParadoxPPOHybrid,0.8723429375012457,neutral,0.4841948449611664
|
| 974 |
+
972,3,172,731873456,LevoParadoxPPOHybrid,0.612363357663838,neutral,0.4859134256839752
|
| 975 |
+
973,3,173,1247536227,LevoParadoxPPOHybrid,-0.8071191221540742,neutral,0.48261088132858276
|
| 976 |
+
974,3,174,1337517349,LevoParadoxPPOHybrid,-0.04748141792384848,neutral,0.48956099152565
|
| 977 |
+
975,3,175,988735470,LevoParadoxPPOHybrid,-0.22941818391398483,neutral,0.49009424448013306
|
| 978 |
+
976,3,176,624782456,LevoParadoxPPOHybrid,0.20896413148081383,neutral,0.49009424448013306
|
| 979 |
+
977,3,177,1614653143,LevoParadoxPPOHybrid,-0.4293029498830948,neutral,0.4856588840484619
|
| 980 |
+
978,3,178,1500038813,LevoParadoxPPOHybrid,1.1161432423615547,neutral,0.4856588840484619
|
| 981 |
+
979,3,179,2130149343,LevoParadoxPPOHybrid,-0.6482581247171009,neutral,0.4832690358161926
|
| 982 |
+
980,3,180,132980447,LevoParadoxPPOHybrid,-1.6670530094964546,neutral,0.4896336793899536
|
| 983 |
+
981,3,181,1952726781,LevoParadoxPPOHybrid,-2.434336344440533,overconfident,0.48763468861579895
|
| 984 |
+
982,3,182,555625828,LevoParadoxPPOHybrid,0.7003550926274642,neutral,0.4876002371311188
|
| 985 |
+
983,3,183,498814370,LevoParadoxPPOHybrid,-0.2862536747479175,neutral,0.48261088132858276
|
| 986 |
+
984,3,184,206366738,LevoParadoxPPOHybrid,0.8775826217617475,neutral,0.48956099152565
|
| 987 |
+
985,3,185,400273478,LevoParadoxPPOHybrid,-0.2835608641021956,neutral,0.4832690358161926
|
| 988 |
+
986,3,186,670771760,LevoParadoxPPOHybrid,0.14429033269177619,neutral,0.4859134256839752
|
| 989 |
+
987,3,187,1820812129,LevoParadoxPPOHybrid,1.1935862197370715,neutral,0.48956099152565
|
| 990 |
+
988,3,188,1243239295,LevoParadoxPPOHybrid,-1.127181247498464,overcautious,0.4853600561618805
|
| 991 |
+
989,3,189,1980464422,LevoParadoxPPOHybrid,0.2808684424586057,neutral,0.4856588840484619
|
| 992 |
+
990,3,190,1156736002,LevoParadoxPPOHybrid,-0.28270551923738596,neutral,0.48956099152565
|
| 993 |
+
991,3,191,1697044130,LevoParadoxPPOHybrid,0.4826422855105287,neutral,0.48912549018859863
|
| 994 |
+
992,3,192,562498219,LevoParadoxPPOHybrid,0.07891803981678115,neutral,0.4859134256839752
|
| 995 |
+
993,3,193,1878178784,LevoParadoxPPOHybrid,0.20228392169117065,neutral,0.48956099152565
|
| 996 |
+
994,3,194,2065152970,LevoParadoxPPOHybrid,1.3065279618298171,neutral,0.48261088132858276
|
| 997 |
+
995,3,195,775550551,LevoParadoxPPOHybrid,0.7688120776761941,neutral,0.4876002371311188
|
| 998 |
+
996,3,196,1056375082,LevoParadoxPPOHybrid,2.643885410414239,neutral,0.48912549018859863
|
| 999 |
+
997,3,197,1600998019,LevoParadoxPPOHybrid,0.04270551606696389,neutral,0.4853600561618805
|
| 1000 |
+
998,3,198,1027113059,LevoParadoxPPOHybrid,0.6819952539956415,neutral,0.48763468861579895
|
| 1001 |
+
999,3,199,609138227,LevoParadoxPPOHybrid,1.2826738383017549,neutral,0.4876002371311188
|
| 1002 |
+
1000,3,200,122699067,LevoParadoxPPOHybrid,1.4645920019362932,neutral,0.4882761538028717
|
| 1003 |
+
1001,3,201,365381056,LevoParadoxPPOHybrid,0.1175398932744254,neutral,0.49011749029159546
|
| 1004 |
+
1002,3,202,1238636582,LevoParadoxPPOHybrid,1.5278968205399832,neutral,0.4853600561618805
|
| 1005 |
+
1003,3,203,1658289347,LevoParadoxPPOHybrid,-2.3608989109395417,overconfident,0.4882761538028717
|
| 1006 |
+
1004,3,204,1322727040,LevoParadoxPPOHybrid,-0.5812129563754665,neutral,0.49009424448013306
|
| 1007 |
+
1005,3,205,2126230739,LevoParadoxPPOHybrid,0.055286863165256224,neutral,0.4856588840484619
|
| 1008 |
+
1006,3,206,289701504,LevoParadoxPPOHybrid,-0.6531967872653202,neutral,0.4832690358161926
|
| 1009 |
+
1007,3,207,1261784629,LevoParadoxPPOHybrid,0.1842492194028491,neutral,0.48342037200927734
|
| 1010 |
+
1008,3,208,1377412115,LevoParadoxPPOHybrid,0.6245206594688067,neutral,0.48763468861579895
|
| 1011 |
+
1009,3,209,1724786786,LevoParadoxPPOHybrid,0.8985310433229601,neutral,0.48956099152565
|
| 1012 |
+
1010,3,210,89300232,LevoParadoxPPOHybrid,0.6123175354440541,neutral,0.48261088132858276
|
| 1013 |
+
1011,3,211,1017426355,LevoParadoxPPOHybrid,1.4029986467083133,neutral,0.48261088132858276
|
| 1014 |
+
1012,3,212,1395142654,LevoParadoxPPOHybrid,1.3212883154759467,neutral,0.48763468861579895
|
| 1015 |
+
1013,3,213,939770990,LevoParadoxPPOHybrid,0.3690192392322482,neutral,0.48847508430480957
|
| 1016 |
+
1014,3,214,1446797165,LevoParadoxPPOHybrid,2.042922515816966,neutral,0.48912549018859863
|
| 1017 |
+
1015,3,215,464152649,LevoParadoxPPOHybrid,0.66230012650082,neutral,0.48956099152565
|
| 1018 |
+
1016,3,216,495168830,LevoParadoxPPOHybrid,2.231253447189229,neutral,0.4853600561618805
|
| 1019 |
+
1017,3,217,1239321323,LevoParadoxPPOHybrid,0.7971781308027754,neutral,0.4832690358161926
|
| 1020 |
+
1018,3,218,1388207032,LevoParadoxPPOHybrid,0.19859386994917153,neutral,0.4841948449611664
|
| 1021 |
+
1019,3,219,1731639298,LevoParadoxPPOHybrid,-0.01593363519287893,neutral,0.48261088132858276
|
| 1022 |
+
1020,3,220,1605648698,LevoParadoxPPOHybrid,0.5776867006145332,neutral,0.4841948449611664
|
| 1023 |
+
1021,3,221,281650086,LevoParadoxPPOHybrid,0.1894277803351234,neutral,0.4832690358161926
|
| 1024 |
+
1022,3,222,931350263,LevoParadoxPPOHybrid,0.98787063742711,neutral,0.4841948449611664
|
| 1025 |
+
1023,3,223,691328288,LevoParadoxPPOHybrid,0.0743356805063284,neutral,0.48261088132858276
|
| 1026 |
+
1024,3,224,633318446,LevoParadoxPPOHybrid,1.8361888649880167,neutral,0.48833152651786804
|
| 1027 |
+
1025,3,225,1081427988,LevoParadoxPPOHybrid,0.1338333666167951,neutral,0.49327588081359863
|
| 1028 |
+
1026,3,226,115545717,LevoParadoxPPOHybrid,1.360667887399388,neutral,0.48658421635627747
|
| 1029 |
+
1027,3,227,309528326,LevoParadoxPPOHybrid,-1.4173429922782725,overcautious,0.49301716685295105
|
| 1030 |
+
1028,3,228,396994132,LevoParadoxPPOHybrid,0.22439107870340078,neutral,0.49331241846084595
|
| 1031 |
+
1029,3,229,1235689954,LevoParadoxPPOHybrid,0.266905886575473,neutral,0.489418625831604
|
| 1032 |
+
1030,3,230,992703584,LevoParadoxPPOHybrid,0.3321246635033697,neutral,0.49285888671875
|
| 1033 |
+
1031,3,231,1080333835,LevoParadoxPPOHybrid,1.6931666633730826,neutral,0.4898187220096588
|
| 1034 |
+
1032,3,232,610075266,LevoParadoxPPOHybrid,0.1761494721175345,neutral,0.49076247215270996
|
| 1035 |
+
1033,3,233,131753921,LevoParadoxPPOHybrid,0.543341071924465,neutral,0.4936416745185852
|
| 1036 |
+
1034,3,234,1547145187,LevoParadoxPPOHybrid,-0.09291703783075383,neutral,0.48658421635627747
|
| 1037 |
+
1035,3,235,1112526292,LevoParadoxPPOHybrid,0.9173411436063477,neutral,0.4916113317012787
|
| 1038 |
+
1036,3,236,1114040609,LevoParadoxPPOHybrid,-0.466186548405527,neutral,0.48658421635627747
|
| 1039 |
+
1037,3,237,9016300,LevoParadoxPPOHybrid,0.5729399550735099,neutral,0.4916086792945862
|
| 1040 |
+
1038,3,238,2021796480,LevoParadoxPPOHybrid,1.1871455134687214,neutral,0.48658421635627747
|
| 1041 |
+
1039,3,239,1032777022,LevoParadoxPPOHybrid,1.5605861822412053,neutral,0.49060913920402527
|
| 1042 |
+
1040,3,240,430409080,LevoParadoxPPOHybrid,0.47291951840375646,neutral,0.486750990152359
|
| 1043 |
+
1041,3,241,1399360085,LevoParadoxPPOHybrid,-2.6455916936013986,overconfident,0.4898187220096588
|
| 1044 |
+
1042,3,242,436964639,LevoParadoxPPOHybrid,2.487891437358731,neutral,0.49301716685295105
|
| 1045 |
+
1043,3,243,1154674875,LevoParadoxPPOHybrid,1.0635383620472745,neutral,0.48833152651786804
|
| 1046 |
+
1044,3,244,1018060628,LevoParadoxPPOHybrid,0.9310030302878805,neutral,0.4895656704902649
|
| 1047 |
+
1045,3,245,302524943,LevoParadoxPPOHybrid,0.050867633534433285,neutral,0.489418625831604
|
| 1048 |
+
1046,3,246,993587315,LevoParadoxPPOHybrid,0.2719540899073052,neutral,0.489418625831604
|
| 1049 |
+
1047,3,247,821789357,LevoParadoxPPOHybrid,1.6952904194648668,neutral,0.49283483624458313
|
| 1050 |
+
1048,3,248,2140712286,LevoParadoxPPOHybrid,0.17938752569393754,neutral,0.4895656704902649
|
| 1051 |
+
1049,3,249,791580549,LevoParadoxPPOHybrid,0.5520582714410324,neutral,0.49327588081359863
|
| 1052 |
+
1050,3,250,1895531684,LevoParadoxPPOHybrid,-0.2268423785723466,neutral,0.48658421635627747
|
| 1053 |
+
1051,3,251,245446075,LevoParadoxPPOHybrid,1.4389144622355732,neutral,0.49060913920402527
|
| 1054 |
+
1052,3,252,528694894,LevoParadoxPPOHybrid,0.2077126290733675,neutral,0.489418625831604
|
| 1055 |
+
1053,3,253,383543867,LevoParadoxPPOHybrid,-0.5433073101045013,neutral,0.4916113317012787
|
| 1056 |
+
1054,3,254,507831984,LevoParadoxPPOHybrid,0.7572496251706334,neutral,0.4916113317012787
|
| 1057 |
+
1055,3,255,1866575340,LevoParadoxPPOHybrid,0.6129199969750596,neutral,0.49285888671875
|
| 1058 |
+
1056,3,256,1604134655,LevoParadoxPPOHybrid,1.0593717973391175,neutral,0.4866838753223419
|
| 1059 |
+
1057,3,257,2099757217,LevoParadoxPPOHybrid,-2.40684095296509,overconfident,0.49060913920402527
|
| 1060 |
+
1058,3,258,113075702,LevoParadoxPPOHybrid,1.5841466214856086,neutral,0.49283483624458313
|
| 1061 |
+
1059,3,259,1114107496,LevoParadoxPPOHybrid,-0.40426330871151356,neutral,0.49060913920402527
|
| 1062 |
+
1060,3,260,540143375,LevoParadoxPPOHybrid,-0.3669807746773094,neutral,0.4866838753223419
|
| 1063 |
+
1061,3,261,1516404,LevoParadoxPPOHybrid,2.304766172762145,neutral,0.49301716685295105
|
| 1064 |
+
1062,3,262,444535043,LevoParadoxPPOHybrid,1.689358900483771,neutral,0.49060913920402527
|
| 1065 |
+
1063,3,263,413354163,LevoParadoxPPOHybrid,0.4654184462253926,neutral,0.4916113317012787
|
| 1066 |
+
1064,3,264,554663744,LevoParadoxPPOHybrid,1.1133992594778106,neutral,0.4936416745185852
|
| 1067 |
+
1065,3,265,903269569,LevoParadoxPPOHybrid,0.8714377976361631,neutral,0.4916086792945862
|
| 1068 |
+
1066,3,266,1932585699,LevoParadoxPPOHybrid,0.23303728348539654,neutral,0.49327588081359863
|
| 1069 |
+
1067,3,267,127998833,LevoParadoxPPOHybrid,-0.3177470682658397,neutral,0.49285888671875
|
| 1070 |
+
1068,3,268,880556158,LevoParadoxPPOHybrid,1.106183553403016,neutral,0.4916113317012787
|
| 1071 |
+
1069,3,269,936001589,LevoParadoxPPOHybrid,0.7549588091802616,neutral,0.4936416745185852
|
| 1072 |
+
1070,3,270,1501301443,LevoParadoxPPOHybrid,0.9736562726861935,neutral,0.4936416745185852
|
| 1073 |
+
1071,3,271,19383980,LevoParadoxPPOHybrid,0.6944357474098843,neutral,0.49331241846084595
|
| 1074 |
+
1072,3,272,1157426772,LevoParadoxPPOHybrid,-1.7601137690719457,overconfident,0.49060913920402527
|
| 1075 |
+
1073,3,273,1952228844,LevoParadoxPPOHybrid,-0.7176220302503407,neutral,0.486750990152359
|
| 1076 |
+
1074,3,274,1211030371,LevoParadoxPPOHybrid,1.7340914342199532,neutral,0.48833152651786804
|
| 1077 |
+
1075,3,275,1321059392,LevoParadoxPPOHybrid,-0.8466103390976051,neutral,0.4936416745185852
|
| 1078 |
+
1076,3,276,1798791588,LevoParadoxPPOHybrid,-1.9097750416271517,overconfident,0.49060913920402527
|
| 1079 |
+
1077,3,277,1246246285,LevoParadoxPPOHybrid,0.8795901381968463,neutral,0.49285888671875
|
| 1080 |
+
1078,3,278,457172572,LevoParadoxPPOHybrid,0.4305942352110612,neutral,0.4936416745185852
|
| 1081 |
+
1079,3,279,448736337,LevoParadoxPPOHybrid,0.6904533826305582,neutral,0.4916113317012787
|
| 1082 |
+
1080,3,280,1299406706,LevoParadoxPPOHybrid,1.4523638955546416,neutral,0.4895656704902649
|
| 1083 |
+
1081,3,281,1264773565,LevoParadoxPPOHybrid,0.6735045597096321,neutral,0.49331241846084595
|
| 1084 |
+
1082,3,282,1354099525,LevoParadoxPPOHybrid,-0.9555847332433495,neutral,0.49285888671875
|
| 1085 |
+
1083,3,283,372058917,LevoParadoxPPOHybrid,0.7365455977878236,neutral,0.489418625831604
|
| 1086 |
+
1084,3,284,1037785478,LevoParadoxPPOHybrid,-0.4828807234404753,neutral,0.48658421635627747
|
| 1087 |
+
1085,3,285,1811624747,LevoParadoxPPOHybrid,0.6071438024245759,neutral,0.4858545958995819
|
| 1088 |
+
1086,3,286,1038158713,LevoParadoxPPOHybrid,0.6997274493131587,neutral,0.489418625831604
|
| 1089 |
+
1087,3,287,2093019788,LevoParadoxPPOHybrid,-1.0100227353420415,neutral,0.489418625831604
|
| 1090 |
+
1088,3,288,212225853,LevoParadoxPPOHybrid,-0.38702110349628943,neutral,0.486750990152359
|
| 1091 |
+
1089,3,289,780127530,LevoParadoxPPOHybrid,1.3053559696215205,neutral,0.4916113317012787
|
| 1092 |
+
1090,3,290,708820677,LevoParadoxPPOHybrid,0.6396186228494765,neutral,0.486750990152359
|
| 1093 |
+
1091,3,291,1943826058,LevoParadoxPPOHybrid,0.5280049650751485,neutral,0.4858545958995819
|
| 1094 |
+
1092,3,292,1228600845,LevoParadoxPPOHybrid,2.351804957931147,neutral,0.49283483624458313
|
| 1095 |
+
1093,3,293,1907054980,LevoParadoxPPOHybrid,0.47626137268114643,neutral,0.49285888671875
|
| 1096 |
+
1094,3,294,684222005,LevoParadoxPPOHybrid,2.0141844440006436,neutral,0.4898187220096588
|
| 1097 |
+
1095,3,295,1264548661,LevoParadoxPPOHybrid,0.9825214353567251,neutral,0.4898187220096588
|
| 1098 |
+
1096,3,296,1936568871,LevoParadoxPPOHybrid,-1.105227888104164,overcautious,0.48833152651786804
|
| 1099 |
+
1097,3,297,1497319181,LevoParadoxPPOHybrid,0.06488571313026902,neutral,0.4916086792945862
|
| 1100 |
+
1098,3,298,97345709,LevoParadoxPPOHybrid,-0.269915704835884,neutral,0.4916086792945862
|
| 1101 |
+
1099,3,299,652059175,LevoParadoxPPOHybrid,1.4430543711983108,neutral,0.49331241846084595
|
| 1102 |
+
1100,3,300,130313659,LevoParadoxPPOHybrid,1.4325859998188804,neutral,0.4936416745185852
|
| 1103 |
+
1101,3,301,1373428940,LevoParadoxPPOHybrid,0.22583825072159266,neutral,0.4866838753223419
|
| 1104 |
+
1102,3,302,1763220031,LevoParadoxPPOHybrid,0.5867242898117275,neutral,0.4858545958995819
|
| 1105 |
+
1103,3,303,766053327,LevoParadoxPPOHybrid,2.286235206364041,neutral,0.49283483624458313
|
| 1106 |
+
1104,3,304,186108448,LevoParadoxPPOHybrid,1.687379567654013,neutral,0.48833152651786804
|
| 1107 |
+
1105,3,305,1525727770,LevoParadoxPPOHybrid,-0.2806885114658522,neutral,0.49283483624458313
|
| 1108 |
+
1106,3,306,1723298298,LevoParadoxPPOHybrid,-2.053392775572538,overconfident,0.4898187220096588
|
| 1109 |
+
1107,3,307,1809177412,LevoParadoxPPOHybrid,-0.21809959973084328,neutral,0.4916086792945862
|
| 1110 |
+
1108,3,308,808471678,LevoParadoxPPOHybrid,-0.21586492152146408,neutral,0.48658421635627747
|
| 1111 |
+
1109,3,309,1012658889,LevoParadoxPPOHybrid,0.659992373614612,neutral,0.489418625831604
|
| 1112 |
+
1110,3,310,123240018,LevoParadoxPPOHybrid,-0.02788444401156496,neutral,0.49076247215270996
|
| 1113 |
+
1111,3,311,595923089,LevoParadoxPPOHybrid,-0.45128377826996513,overcautious,0.49283483624458313
|
| 1114 |
+
1112,3,312,64946568,LevoParadoxPPOHybrid,1.0220192129178896,neutral,0.4866838753223419
|
| 1115 |
+
1113,3,313,1694054676,LevoParadoxPPOHybrid,3.0,neutral,0.49283483624458313
|
| 1116 |
+
1114,3,314,1378532479,LevoParadoxPPOHybrid,1.6602005302173342,neutral,0.48833152651786804
|
| 1117 |
+
1115,3,315,294177744,LevoParadoxPPOHybrid,0.9431097985305882,neutral,0.4866838753223419
|
| 1118 |
+
1116,3,316,382616457,LevoParadoxPPOHybrid,0.19900701204930193,neutral,0.489418625831604
|
| 1119 |
+
1117,3,317,654022692,LevoParadoxPPOHybrid,0.5937927035952054,neutral,0.48658421635627747
|
| 1120 |
+
1118,3,318,1938298404,LevoParadoxPPOHybrid,-1.83814468538334,overconfident,0.4898187220096588
|
| 1121 |
+
1119,3,319,1251753220,LevoParadoxPPOHybrid,0.25922762062913374,neutral,0.49076247215270996
|
| 1122 |
+
1120,3,320,164235737,LevoParadoxPPOHybrid,0.9360725189336654,neutral,0.4916113317012787
|
| 1123 |
+
1121,3,321,1176577515,LevoParadoxPPOHybrid,-0.07777068337054072,neutral,0.4866838753223419
|
| 1124 |
+
1122,3,322,66131236,LevoParadoxPPOHybrid,0.08199780321756987,neutral,0.4916113317012787
|
| 1125 |
+
1123,3,323,816614407,LevoParadoxPPOHybrid,1.8730655609120999,neutral,0.48833152651786804
|
| 1126 |
+
1124,3,324,1678449735,LevoParadoxPPOHybrid,0.5252050183718692,neutral,0.486750990152359
|
| 1127 |
+
1125,3,325,155847418,LevoParadoxPPOHybrid,-0.02681169897223142,neutral,0.4936416745185852
|
| 1128 |
+
1126,3,326,385469728,LevoParadoxPPOHybrid,2.376726011756658,neutral,0.49283483624458313
|
| 1129 |
+
1127,3,327,2122723976,LevoParadoxPPOHybrid,1.4471731631475728,neutral,0.4866838753223419
|
| 1130 |
+
1128,3,328,1933100203,LevoParadoxPPOHybrid,-2.0497120652466028,overconfident,0.4898187220096588
|
| 1131 |
+
1129,3,329,650925416,LevoParadoxPPOHybrid,-0.49579878845179687,neutral,0.489418625831604
|
| 1132 |
+
1130,3,330,1094127659,LevoParadoxPPOHybrid,-0.07141335729505123,neutral,0.48658421635627747
|
| 1133 |
+
1131,3,331,876865270,LevoParadoxPPOHybrid,-0.5407918798944782,neutral,0.49327588081359863
|
| 1134 |
+
1132,3,332,1319422772,LevoParadoxPPOHybrid,1.6276730098197536,neutral,0.49301716685295105
|
| 1135 |
+
1133,3,333,174465858,LevoParadoxPPOHybrid,0.2544404882028042,neutral,0.49076247215270996
|
| 1136 |
+
1134,3,334,2060489424,LevoParadoxPPOHybrid,0.2477776674203278,neutral,0.4898187220096588
|
| 1137 |
+
1135,3,335,1621988536,LevoParadoxPPOHybrid,-0.48591510057403453,neutral,0.49331241846084595
|
| 1138 |
+
1136,3,336,965810292,LevoParadoxPPOHybrid,0.049978842421051245,neutral,0.49301716685295105
|
| 1139 |
+
1137,3,337,2093565938,LevoParadoxPPOHybrid,2.4772099381580697,neutral,0.49301716685295105
|
| 1140 |
+
1138,3,338,1650235702,LevoParadoxPPOHybrid,0.1418919856891526,neutral,0.4858545958995819
|
| 1141 |
+
1139,3,339,511412748,LevoParadoxPPOHybrid,0.6346451568587965,neutral,0.489418625831604
|
| 1142 |
+
1140,3,340,922611389,LevoParadoxPPOHybrid,-0.8616451980838941,overcautious,0.48833152651786804
|
| 1143 |
+
1141,3,341,652729866,LevoParadoxPPOHybrid,1.948976720949957,neutral,0.49331241846084595
|
| 1144 |
+
1142,3,342,221600474,LevoParadoxPPOHybrid,0.9973383239464882,neutral,0.4916113317012787
|
| 1145 |
+
1143,3,343,31421970,LevoParadoxPPOHybrid,0.02929702365773283,neutral,0.4866838753223419
|
| 1146 |
+
1144,3,344,1192414163,LevoParadoxPPOHybrid,0.6691241621227473,neutral,0.4916086792945862
|
| 1147 |
+
1145,3,345,649875877,LevoParadoxPPOHybrid,0.7070359587513864,neutral,0.4895656704902649
|
| 1148 |
+
1146,3,346,105131269,LevoParadoxPPOHybrid,2.652461124351755,neutral,0.48833152651786804
|
| 1149 |
+
1147,3,347,156751511,LevoParadoxPPOHybrid,0.6272225859885717,neutral,0.4895656704902649
|
| 1150 |
+
1148,3,348,761801730,LevoParadoxPPOHybrid,-0.5934301134706246,neutral,0.4895656704902649
|
| 1151 |
+
1149,3,349,2081080430,LevoParadoxPPOHybrid,0.5738879582462928,neutral,0.4866838753223419
|
| 1152 |
+
1150,3,350,2015553861,LevoParadoxPPOHybrid,-1.4177993539631866,neutral,0.4895656704902649
|
| 1153 |
+
1151,3,351,1908286303,LevoParadoxPPOHybrid,1.506092772192412,neutral,0.4895656704902649
|
| 1154 |
+
1152,3,352,911061556,LevoParadoxPPOHybrid,1.3687399763929848,neutral,0.49285888671875
|
| 1155 |
+
1153,3,353,34499089,LevoParadoxPPOHybrid,-0.9282651241178062,overcautious,0.49301716685295105
|
| 1156 |
+
1154,3,354,2098425720,LevoParadoxPPOHybrid,-0.9085834687581021,neutral,0.4936416745185852
|
| 1157 |
+
1155,3,355,1106840722,LevoParadoxPPOHybrid,-0.24296696671554552,overcautious,0.49301716685295105
|
| 1158 |
+
1156,3,356,317986024,LevoParadoxPPOHybrid,0.5275187514191623,neutral,0.4916086792945862
|
| 1159 |
+
1157,3,357,129256349,LevoParadoxPPOHybrid,1.1843746050806352,neutral,0.49327588081359863
|
| 1160 |
+
1158,3,358,431303789,LevoParadoxPPOHybrid,0.071342761929298,overcautious,0.49301716685295105
|
| 1161 |
+
1159,3,359,523632446,LevoParadoxPPOHybrid,0.08805085928707428,neutral,0.4858545958995819
|
| 1162 |
+
1160,3,360,1950687447,LevoParadoxPPOHybrid,0.26743054682592193,neutral,0.49076247215270996
|
| 1163 |
+
1161,3,361,1411833232,LevoParadoxPPOHybrid,0.8063372079804664,neutral,0.4895656704902649
|
| 1164 |
+
1162,3,362,690319881,LevoParadoxPPOHybrid,-1.4350170010233716,overconfident,0.49327588081359863
|
| 1165 |
+
1163,3,363,175246150,LevoParadoxPPOHybrid,0.8602184244464084,neutral,0.49060913920402527
|
| 1166 |
+
1164,3,364,1182674932,LevoParadoxPPOHybrid,1.7870325658814412,neutral,0.4898187220096588
|
| 1167 |
+
1165,3,365,393595655,LevoParadoxPPOHybrid,0.049699194185405235,neutral,0.48658421635627747
|
| 1168 |
+
1166,3,366,1029071917,LevoParadoxPPOHybrid,-0.5707083935878005,neutral,0.48658421635627747
|
| 1169 |
+
1167,3,367,440607926,LevoParadoxPPOHybrid,0.3759669685649799,neutral,0.48658421635627747
|
| 1170 |
+
1168,3,368,990295427,LevoParadoxPPOHybrid,0.7107320242384884,neutral,0.4858545958995819
|
| 1171 |
+
1169,3,369,1533915152,LevoParadoxPPOHybrid,0.1294248189887542,neutral,0.486750990152359
|
| 1172 |
+
1170,3,370,2028880655,LevoParadoxPPOHybrid,1.0673159176286864,neutral,0.4866838753223419
|
| 1173 |
+
1171,3,371,1110082952,LevoParadoxPPOHybrid,-0.14934540849956535,neutral,0.489418625831604
|
| 1174 |
+
1172,3,372,1351612215,LevoParadoxPPOHybrid,0.4566579866558717,neutral,0.489418625831604
|
| 1175 |
+
1173,3,373,161873384,LevoParadoxPPOHybrid,0.4425368930740302,neutral,0.49331241846084595
|
| 1176 |
+
1174,3,374,1943568012,LevoParadoxPPOHybrid,-1.0470027903099404,overcautious,0.48833152651786804
|
| 1177 |
+
1175,3,375,27538724,LevoParadoxPPOHybrid,1.1698618251818689,neutral,0.49327588081359863
|
| 1178 |
+
1176,3,376,534070892,LevoParadoxPPOHybrid,0.204998638571319,neutral,0.48658421635627747
|
| 1179 |
+
1177,3,377,1484958114,LevoParadoxPPOHybrid,1.2965587422443934,neutral,0.49285888671875
|
| 1180 |
+
1178,3,378,1217763652,LevoParadoxPPOHybrid,1.4505600122642395,neutral,0.4898187220096588
|
| 1181 |
+
1179,3,379,951904837,LevoParadoxPPOHybrid,-0.6140963258839023,neutral,0.4916113317012787
|
| 1182 |
+
1180,3,380,1611118613,LevoParadoxPPOHybrid,0.7767451020137636,neutral,0.4895656704902649
|
| 1183 |
+
1181,3,381,518917746,LevoParadoxPPOHybrid,-0.3309841660977714,neutral,0.49285888671875
|
| 1184 |
+
1182,3,382,64896530,LevoParadoxPPOHybrid,-1.7495881572101664,overconfident,0.49060913920402527
|
| 1185 |
+
1183,3,383,703323482,LevoParadoxPPOHybrid,0.39758457782113854,neutral,0.49285888671875
|
| 1186 |
+
1184,3,384,878877531,LevoParadoxPPOHybrid,-0.45663118508894723,neutral,0.49076247215270996
|
| 1187 |
+
1185,3,385,743424612,LevoParadoxPPOHybrid,0.15881701687226527,neutral,0.4898187220096588
|
| 1188 |
+
1186,3,386,1611600344,LevoParadoxPPOHybrid,1.1958528378072517,neutral,0.486750990152359
|
| 1189 |
+
1187,3,387,1653110007,LevoParadoxPPOHybrid,-1.294775431953231,overcautious,0.48833152651786804
|
| 1190 |
+
1188,3,388,1477247030,LevoParadoxPPOHybrid,0.06359680112012978,neutral,0.49060913920402527
|
| 1191 |
+
1189,3,389,460418126,LevoParadoxPPOHybrid,2.5444399454267375,neutral,0.49283483624458313
|
| 1192 |
+
1190,3,390,965728184,LevoParadoxPPOHybrid,-0.5056482391152837,neutral,0.4936416745185852
|
| 1193 |
+
1191,3,391,800112339,LevoParadoxPPOHybrid,1.3941253259697812,neutral,0.4866838753223419
|
| 1194 |
+
1192,3,392,1881978705,LevoParadoxPPOHybrid,0.11355250158904308,neutral,0.4858545958995819
|
| 1195 |
+
1193,3,393,765013452,LevoParadoxPPOHybrid,0.1964416250166414,neutral,0.49331241846084595
|
| 1196 |
+
1194,3,394,1327556692,LevoParadoxPPOHybrid,0.27807276108114626,neutral,0.49076247215270996
|
| 1197 |
+
1195,3,395,149816571,LevoParadoxPPOHybrid,0.536807514032734,neutral,0.49331241846084595
|
| 1198 |
+
1196,3,396,338046121,LevoParadoxPPOHybrid,0.3025212168232634,neutral,0.48833152651786804
|
| 1199 |
+
1197,3,397,994124776,LevoParadoxPPOHybrid,0.38399826581662966,neutral,0.49076247215270996
|
| 1200 |
+
1198,3,398,713057376,LevoParadoxPPOHybrid,1.3402040989179698,neutral,0.4866838753223419
|
| 1201 |
+
1199,3,399,1118891224,LevoParadoxPPOHybrid,-0.48269914185478485,neutral,0.489418625831604
|
Down/down/results/paradox_tabular_results.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Down/graphics/graphics/antidown_corrupted_valley_reward.png
ADDED
|
Down/graphics/graphics/antidown_corrupted_valley_valley_visits.png
ADDED
|
Down/graphics/graphics/down_paradox_tabular_reward.png
ADDED
|
Git LFS Details
|
Down/graphics/graphics/down_paradox_tabular_rho.png
ADDED
|
Down/graphics/graphics/dual_down_antidown_episode_return.png
ADDED
|
Git LFS Details
|
Down/graphics/graphics/figure_failures.png
ADDED
|
Down/graphics/graphics/figure_reward.png
ADDED
|
Down/graphics/index.html
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8"/>
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
| 6 |
+
<title>DOWN • Graphics</title>
|
| 7 |
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml"/>
|
| 8 |
+
|
| 9 |
+
<style>
|
| 10 |
+
*{margin:0;padding:0;box-sizing:border-box}
|
| 11 |
+
:root{
|
| 12 |
+
--bg:#000; --fg:#fff; --muted:rgba(255,255,255,.62);
|
| 13 |
+
--card:rgba(255,255,255,.04); --stroke:rgba(255,255,255,.10); --glass:rgba(0,0,0,.38);
|
| 14 |
+
--accent:#8cb4ff;
|
| 15 |
+
}
|
| 16 |
+
body{font-family:Inter,system-ui,Segoe UI,Roboto,Arial;background:var(--bg);color:var(--fg);overflow-x:hidden}
|
| 17 |
+
#quantumField{position:fixed;inset:0;width:100vw;height:100vh;z-index:-10;background:#000}
|
| 18 |
+
|
| 19 |
+
nav{position:fixed;top:0;left:0;right:0;z-index:1000;padding:14px 24px;background:var(--glass);backdrop-filter:blur(12px);border-bottom:1px solid rgba(255,255,255,.06)}
|
| 20 |
+
.nav-inner{max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:16px}
|
| 21 |
+
.brand{font-weight:700;font-size:1.1rem}
|
| 22 |
+
.nav-links{display:flex;gap:10px;margin-left:18px}
|
| 23 |
+
.nav-links a{text-decoration:none;color:var(--fg);padding:8px 12px;border:1px solid rgba(255,255,255,.12);border-radius:999px;font-size:.9rem;opacity:.86;transition:.15s ease;white-space:nowrap}
|
| 24 |
+
.nav-links a:hover{opacity:1;background:rgba(255,255,255,.06)}
|
| 25 |
+
.spacer{flex:1}
|
| 26 |
+
.menu-btn{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.18);border-radius:12px;cursor:pointer;background:rgba(255,255,255,.02)}
|
| 27 |
+
.menu-btn span{display:block;width:18px;height:2px;background:#fff;position:relative}
|
| 28 |
+
.menu-btn span::before,.menu-btn span::after{content:"";position:absolute;left:0;width:18px;height:2px;background:#fff}
|
| 29 |
+
.menu-btn span::before{top:-6px} .menu-btn span::after{top:6px}
|
| 30 |
+
.menu{position:absolute;top:60px;right:24px;min-width:220px;padding:10px;border-radius:14px;background:var(--glass);backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.10);box-shadow:0 0 30px rgba(0,0,0,.6);display:none}
|
| 31 |
+
.menu.open{display:block}
|
| 32 |
+
.menu a{display:block;padding:10px 10px;border-radius:10px;text-decoration:none;color:var(--fg);opacity:.9}
|
| 33 |
+
.menu a:hover{background:rgba(255,255,255,.06);opacity:1}
|
| 34 |
+
.menu .sep{height:1px;background:rgba(255,255,255,.10);margin:8px 2px}
|
| 35 |
+
|
| 36 |
+
.wrap{max-width:1100px;margin:0 auto;padding:110px 6vw 70px}
|
| 37 |
+
.h{font-size:1.35rem;font-weight:650}
|
| 38 |
+
.sub{color:var(--muted);margin-top:10px;line-height:1.6;max-width:980px}
|
| 39 |
+
|
| 40 |
+
.viewer{margin-top:20px;display:grid;gap:18px;justify-items:center}
|
| 41 |
+
|
| 42 |
+
/* 15% smaller */
|
| 43 |
+
img{
|
| 44 |
+
width:85%;
|
| 45 |
+
max-width:850px;
|
| 46 |
+
max-height:60vh;
|
| 47 |
+
object-fit:contain;
|
| 48 |
+
border-radius:14px;
|
| 49 |
+
background:rgba(255,255,255,.03);
|
| 50 |
+
border:1px solid rgba(255,255,255,.10)
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
/* centered controls */
|
| 54 |
+
.controls{
|
| 55 |
+
display:flex;
|
| 56 |
+
justify-content:center;
|
| 57 |
+
align-items:center;
|
| 58 |
+
gap:18px;
|
| 59 |
+
margin-top:6px;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
.btn{text-decoration:none;color:var(--fg);padding:10px 14px;border-radius:999px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.03);opacity:.92;transition:.15s ease}
|
| 63 |
+
.btn:hover{opacity:1;background:rgba(255,255,255,.07)}
|
| 64 |
+
|
| 65 |
+
.kbd{font-family:ui-monospace,Menlo,Consolas,monospace;background:#15151b;border:1px solid #2a2a33;border-radius:6px;padding:2px 6px;font-size:.85em;color:var(--muted)}
|
| 66 |
+
|
| 67 |
+
.cap{color:var(--muted);max-width:980px;line-height:1.55;text-align:center}
|
| 68 |
+
.cap strong{color:rgba(255,255,255,.9)}
|
| 69 |
+
.rule{border:0;border-top:1px solid rgba(255,255,255,.10);margin:22px 0}
|
| 70 |
+
.interp{color:var(--muted);max-width:980px;line-height:1.65}
|
| 71 |
+
</style>
|
| 72 |
+
</head>
|
| 73 |
+
|
| 74 |
+
<body>
|
| 75 |
+
<canvas id="quantumField"></canvas>
|
| 76 |
+
|
| 77 |
+
<nav>
|
| 78 |
+
<div class="nav-inner">
|
| 79 |
+
<div class="brand">TwoQuarks</div>
|
| 80 |
+
<div class="nav-links">
|
| 81 |
+
<a href="../../../index.html#down">DOWN</a>
|
| 82 |
+
<a href="../../../index.html#strange">STRANGE</a>
|
| 83 |
+
<a href="../../../index.html#top">TOP</a>
|
| 84 |
+
<a href="../../../index.html#charm">CHARM</a>
|
| 85 |
+
<a href="../../../index.html#up">UP</a>
|
| 86 |
+
<a href="../../../index.html#bottom">BOTTOM</a>
|
| 87 |
+
</div>
|
| 88 |
+
<div class="spacer"></div>
|
| 89 |
+
<div class="menu-btn" id="menuBtn"><span></span></div>
|
| 90 |
+
<div class="menu" id="siteMenu">
|
| 91 |
+
<a href="../../../index.html#about">ABOUT</a>
|
| 92 |
+
<a href="../../../quarkslab.html">QuarksLab</a>
|
| 93 |
+
<div class="sep"></div>
|
| 94 |
+
<a href="../../../quarks/bottom/resume.pdf">Resume</a>
|
| 95 |
+
<a href="../../../summary.pdf">Summary</a>
|
| 96 |
+
</div>
|
| 97 |
+
</div>
|
| 98 |
+
</nav>
|
| 99 |
+
|
| 100 |
+
<div class="wrap">
|
| 101 |
+
<div class="h">DOWN · Visual Diagnostics</div>
|
| 102 |
+
<div class="sub">
|
| 103 |
+
Use keyboard arrows or the buttons below to navigate.
|
| 104 |
+
</div>
|
| 105 |
+
|
| 106 |
+
<div class="viewer">
|
| 107 |
+
<img id="img" src="graphics/antidown_corrupted_valley_reward.png" alt="figure"/>
|
| 108 |
+
<div class="controls">
|
| 109 |
+
<a class="btn" href="javascript:void(0)" onclick="prev()">← Previous</a>
|
| 110 |
+
<a class="btn" href="javascript:void(0)" onclick="next()">Next →</a>
|
| 111 |
+
</div>
|
| 112 |
+
|
| 113 |
+
<div class="cap" id="cap"><strong>AntiDown</strong> — Reward over Training (Corrupted Valley)</div>
|
| 114 |
+
</div>
|
| 115 |
+
|
| 116 |
+
<hr class="rule"/>
|
| 117 |
+
|
| 118 |
+
<div class="interp" id="interp">Interpretation will appear here.</div>
|
| 119 |
+
</div>
|
| 120 |
+
|
| 121 |
+
<!-- STARFIELD -->
|
| 122 |
+
<script>
|
| 123 |
+
const canvas = document.getElementById('quantumField');
|
| 124 |
+
const ctx = canvas.getContext('2d');
|
| 125 |
+
function resize(){ canvas.width = innerWidth; canvas.height = innerHeight; }
|
| 126 |
+
resize(); addEventListener('resize', resize);
|
| 127 |
+
|
| 128 |
+
const stars = Array.from({length: 650}, () => ({
|
| 129 |
+
x: (Math.random()-0.5) * canvas.width,
|
| 130 |
+
y: (Math.random()-0.5) * canvas.height,
|
| 131 |
+
z: Math.random() * canvas.width
|
| 132 |
+
}));
|
| 133 |
+
|
| 134 |
+
function animate(){
|
| 135 |
+
ctx.clearRect(0,0,canvas.width,canvas.height);
|
| 136 |
+
for(const s of stars){
|
| 137 |
+
s.z -= 2.2;
|
| 138 |
+
if (s.z < 1){
|
| 139 |
+
s.x = (Math.random()-0.7) * canvas.width;
|
| 140 |
+
s.y = (Math.random()-0.7) * canvas.height;
|
| 141 |
+
s.z = canvas.width;
|
| 142 |
+
}
|
| 143 |
+
const k = 128 / s.z;
|
| 144 |
+
const x = s.x * k + canvas.width/2;
|
| 145 |
+
const y = s.y * k + canvas.height/2;
|
| 146 |
+
const r = (1 - s.z/canvas.width) * 1.2;
|
| 147 |
+
ctx.beginPath();
|
| 148 |
+
ctx.fillStyle = "rgba(140,180,255,0.85)";
|
| 149 |
+
ctx.arc(x,y,r,0,Math.PI*2);
|
| 150 |
+
ctx.fill();
|
| 151 |
+
}
|
| 152 |
+
requestAnimationFrame(animate);
|
| 153 |
+
}
|
| 154 |
+
animate();
|
| 155 |
+
</script>
|
| 156 |
+
|
| 157 |
+
<!-- MENU + VIEWER -->
|
| 158 |
+
<script>
|
| 159 |
+
const menuBtn = document.getElementById('menuBtn');
|
| 160 |
+
const siteMenu = document.getElementById('siteMenu');
|
| 161 |
+
if(menuBtn && siteMenu){
|
| 162 |
+
menuBtn.addEventListener('click', (e)=>{ e.stopPropagation(); siteMenu.classList.toggle('open'); });
|
| 163 |
+
document.addEventListener('click', ()=> siteMenu.classList.remove('open'));
|
| 164 |
+
siteMenu.addEventListener('click', (e)=> e.stopPropagation());
|
| 165 |
+
}
|
| 166 |
+
|
| 167 |
+
/*
|
| 168 |
+
Folder layout:
|
| 169 |
+
index.html in model folder; PNGs in ./graphics/
|
| 170 |
+
*/
|
| 171 |
+
|
| 172 |
+
const figures = [
|
| 173 |
+
{
|
| 174 |
+
src: "graphics/antidown_corrupted_valley_reward.png",
|
| 175 |
+
title: "AntiDown — Reward over Training (Corrupted Valley)",
|
| 176 |
+
interpretation:
|
| 177 |
+
"Reward as a function of training episode for multiple methods. Early plateaus, sharp drops, and increased variance typically indicate a regime change or reward corruption effects rather than smooth convergence."
|
| 178 |
+
},
|
| 179 |
+
{
|
| 180 |
+
src: "graphics/antidown_corrupted_valley_valley_visits.png",
|
| 181 |
+
title: "AntiDown — Valley Visits over Training",
|
| 182 |
+
interpretation:
|
| 183 |
+
"State visitation (valley visits) across episodes. High visits indicate repeated occupancy of a specific region; abrupt changes suggest shifts in exploration strategy or a change in the learned policy’s preferred states."
|
| 184 |
+
},
|
| 185 |
+
{
|
| 186 |
+
src: "graphics/down_paradox_tabular_reward.png",
|
| 187 |
+
title: "Down — Reward over Training (Tabular Paradox)",
|
| 188 |
+
interpretation:
|
| 189 |
+
"Episode-level reward in a tabular setting. A stable band suggests bounded dynamics; frequent spikes or heavy tails suggest sensitivity to stochasticity, reward noise, or termination conditions."
|
| 190 |
+
},
|
| 191 |
+
{
|
| 192 |
+
src: "graphics/down_paradox_tabular_rho.png",
|
| 193 |
+
title: "Down — ρ over Training (Tabular Paradox)",
|
| 194 |
+
interpretation:
|
| 195 |
+
"ρ plotted across episodes as a consistency/stability proxy. Sustained mid/high values indicate more consistent behavior; large oscillations or abrupt dips indicate instability or switching between behavioral modes."
|
| 196 |
+
},
|
| 197 |
+
{
|
| 198 |
+
src: "graphics/dual_down_antidown_episode_return.png",
|
| 199 |
+
title: "Down vs AntiDown — Tabular Returns (Same Budget)",
|
| 200 |
+
interpretation:
|
| 201 |
+
"Overlay comparison of episode returns under the same training budget. A persistent separation implies asymmetric performance; repeated crossings imply similar behavior under noise or comparable robustness limits."
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
src: "graphics/figure_reward.png",
|
| 205 |
+
title: "Summary Table — Reward & Valley Visits (by Phase)",
|
| 206 |
+
interpretation:
|
| 207 |
+
"Text summary of mean and standard deviation for reward and valley visits across phases. Means capture central tendency; standard deviations capture volatility. Phase-wise changes indicate non-stationary regimes or experimental phase transitions."
|
| 208 |
+
},
|
| 209 |
+
{
|
| 210 |
+
src: "graphics/figure_failures.png",
|
| 211 |
+
title: "Failure Modes — Counts by Agent and Phase",
|
| 212 |
+
interpretation:
|
| 213 |
+
"A categorical failure-mode table showing counts per agent and phase. This highlights which behaviors dominate and whether failure types shift across phases, useful for diagnosing where instability concentrates."
|
| 214 |
+
}
|
| 215 |
+
];
|
| 216 |
+
|
| 217 |
+
let idx = 0;
|
| 218 |
+
|
| 219 |
+
function renderFigure(){
|
| 220 |
+
const f = figures[idx];
|
| 221 |
+
document.getElementById("img").src = f.src;
|
| 222 |
+
document.getElementById("cap").innerHTML = `<strong>${f.title}</strong>`;
|
| 223 |
+
document.getElementById("interp").innerHTML =
|
| 224 |
+
`<strong>Interpretation</strong><br/>${f.interpretation}`;
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
function next(){ idx = (idx + 1) % figures.length; renderFigure(); }
|
| 228 |
+
function prev(){ idx = (idx - 1 + figures.length) % figures.length; renderFigure(); }
|
| 229 |
+
|
| 230 |
+
document.addEventListener("keydown", e => {
|
| 231 |
+
if (e.key === "ArrowRight") next();
|
| 232 |
+
if (e.key === "ArrowLeft") prev();
|
| 233 |
+
});
|
| 234 |
+
|
| 235 |
+
renderFigure();
|
| 236 |
+
</script>
|
| 237 |
+
|
| 238 |
+
</body>
|
| 239 |
+
</html>
|
| 240 |
+
|
Down/plot_dual_down_antidown.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Overlay plot: Down vs AntiDown (tabular experiments).
|
| 3 |
+
|
| 4 |
+
Reads CSVs from TWOQUARKS_RESULTS_DIR (or ./results) and writes PNG into
|
| 5 |
+
TWOQUARKS_GRAPHICS_DIR (or ./graphics).
|
| 6 |
+
|
| 7 |
+
This is intentionally simple and dependency-light (pandas optional).
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
from __future__ import annotations
|
| 11 |
+
|
| 12 |
+
import csv
|
| 13 |
+
import os
|
| 14 |
+
from collections import defaultdict
|
| 15 |
+
from pathlib import Path
|
| 16 |
+
from typing import Dict, List, Tuple
|
| 17 |
+
|
| 18 |
+
import matplotlib.pyplot as plt
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _read_csv(path: Path) -> List[Dict[str, str]]:
|
| 22 |
+
with path.open("r", newline="") as f:
|
| 23 |
+
return list(csv.DictReader(f))
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
def _mean(xs: List[float]) -> float:
|
| 27 |
+
if not xs:
|
| 28 |
+
return float("nan")
|
| 29 |
+
return sum(xs) / len(xs)
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def _down_series(rows: List[Dict[str, str]]) -> Tuple[List[int], List[float]]:
|
| 33 |
+
"""
|
| 34 |
+
Down CSV fields (expected):
|
| 35 |
+
phase, episode, agent, episode_reward, [global_episode], ...
|
| 36 |
+
We aggregate by (phase, episode) averaging across agents.
|
| 37 |
+
"""
|
| 38 |
+
bucket: Dict[Tuple[int, int], List[float]] = defaultdict(list)
|
| 39 |
+
for r in rows:
|
| 40 |
+
try:
|
| 41 |
+
phase = int(r.get("phase", "0"))
|
| 42 |
+
ep = int(r.get("episode", "0"))
|
| 43 |
+
rew = float(r.get("episode_reward", "nan"))
|
| 44 |
+
except Exception:
|
| 45 |
+
continue
|
| 46 |
+
bucket[(phase, ep)].append(rew)
|
| 47 |
+
|
| 48 |
+
# Sort by phase then episode, make a single x-axis that is "global episode"
|
| 49 |
+
keys = sorted(bucket.keys())
|
| 50 |
+
xs, ys = [], []
|
| 51 |
+
g = 0
|
| 52 |
+
last_phase = None
|
| 53 |
+
for (phase, ep) in keys:
|
| 54 |
+
if last_phase is None:
|
| 55 |
+
last_phase = phase
|
| 56 |
+
if phase != last_phase:
|
| 57 |
+
last_phase = phase
|
| 58 |
+
xs.append(g)
|
| 59 |
+
ys.append(_mean(bucket[(phase, ep)]))
|
| 60 |
+
g += 1
|
| 61 |
+
return xs, ys
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
def _antidown_series(rows: List[Dict[str, str]]) -> Tuple[List[int], List[float]]:
|
| 65 |
+
"""
|
| 66 |
+
AntiDown CSV fields (expected):
|
| 67 |
+
phase, episode, agent, total_reward, ...
|
| 68 |
+
We aggregate by (phase, episode) averaging across agents.
|
| 69 |
+
"""
|
| 70 |
+
bucket: Dict[Tuple[int, int], List[float]] = defaultdict(list)
|
| 71 |
+
for r in rows:
|
| 72 |
+
try:
|
| 73 |
+
phase = int(r.get("phase", "0"))
|
| 74 |
+
ep = int(r.get("episode", "0"))
|
| 75 |
+
rew = float(r.get("total_reward", "nan"))
|
| 76 |
+
except Exception:
|
| 77 |
+
continue
|
| 78 |
+
bucket[(phase, ep)].append(rew)
|
| 79 |
+
|
| 80 |
+
keys = sorted(bucket.keys())
|
| 81 |
+
xs, ys = [], []
|
| 82 |
+
g = 0
|
| 83 |
+
last_phase = None
|
| 84 |
+
for (phase, ep) in keys:
|
| 85 |
+
if last_phase is None:
|
| 86 |
+
last_phase = phase
|
| 87 |
+
if phase != last_phase:
|
| 88 |
+
last_phase = phase
|
| 89 |
+
xs.append(g)
|
| 90 |
+
ys.append(_mean(bucket[(phase, ep)]))
|
| 91 |
+
g += 1
|
| 92 |
+
return xs, ys
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
def main() -> None:
|
| 96 |
+
root = Path(__file__).resolve().parent
|
| 97 |
+
results_dir = Path(os.environ.get("TWOQUARKS_RESULTS_DIR", (root / "results").as_posix()))
|
| 98 |
+
graphics_dir = Path(os.environ.get("TWOQUARKS_GRAPHICS_DIR", (root / "graphics").as_posix()))
|
| 99 |
+
graphics_dir.mkdir(parents=True, exist_ok=True)
|
| 100 |
+
|
| 101 |
+
down_csv = results_dir / "down_paradox_tabular_results.csv"
|
| 102 |
+
anti_csv = results_dir / "antidown_corrupted_valley_tabular.csv"
|
| 103 |
+
|
| 104 |
+
if not down_csv.exists() or not anti_csv.exists():
|
| 105 |
+
print(f"[dual] missing CSVs. down={down_csv.exists()} anti={anti_csv.exists()}. Skipping.")
|
| 106 |
+
return
|
| 107 |
+
|
| 108 |
+
down_rows = _read_csv(down_csv)
|
| 109 |
+
anti_rows = _read_csv(anti_csv)
|
| 110 |
+
if not down_rows or not anti_rows:
|
| 111 |
+
print("[dual] one CSV is empty. Skipping.")
|
| 112 |
+
return
|
| 113 |
+
|
| 114 |
+
x1, y1 = _down_series(down_rows)
|
| 115 |
+
x2, y2 = _antidown_series(anti_rows)
|
| 116 |
+
|
| 117 |
+
plt.figure(figsize=(10, 5))
|
| 118 |
+
plt.plot(x1, y1, label="Down (mean across agents)")
|
| 119 |
+
plt.plot(x2, y2, label="AntiDown (mean across agents)")
|
| 120 |
+
plt.xlabel("Global episode (phase-concatenated)")
|
| 121 |
+
plt.ylabel("Episode return")
|
| 122 |
+
plt.title("Down vs AntiDown — Tabular returns (mean across agents)")
|
| 123 |
+
plt.legend()
|
| 124 |
+
out = graphics_dir / "dual_down_antidown_episode_return.png"
|
| 125 |
+
plt.tight_layout()
|
| 126 |
+
plt.savefig(out, dpi=160)
|
| 127 |
+
print(f"[dual] saved {out}")
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
if __name__ == "__main__":
|
| 131 |
+
main()
|
Down/results/antidown_corrupted_valley_tabular.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Down/results/down_paradox_tabular_results.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Down/run_all.bat
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo off
|
| 2 |
+
REM Run both DOWN and AntiDown experiments using current Python (Anaconda).
|
| 3 |
+
python run_all.py
|
Down/run_all.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Run both DOWN and AntiDown tabular experiments.
|
| 2 |
+
|
| 3 |
+
Usage:
|
| 4 |
+
python run_all.py --episodes 400
|
| 5 |
+
|
| 6 |
+
This will:
|
| 7 |
+
- run down tabular paradox experiment
|
| 8 |
+
- run AntiDown corrupted valley tabular experiment
|
| 9 |
+
- generate plots for each into their graphics/ folders
|
| 10 |
+
"""
|
| 11 |
+
|
| 12 |
+
from __future__ import annotations
|
| 13 |
+
|
| 14 |
+
import argparse
|
| 15 |
+
import os
|
| 16 |
+
import subprocess
|
| 17 |
+
from pathlib import Path
|
| 18 |
+
import sys
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _run(cmd: list[str], cwd: Path, env: dict[str, str] | None = None) -> None:
|
| 22 |
+
print(f"[run] ({cwd}) $ {' '.join(cmd)}")
|
| 23 |
+
merged = os.environ.copy()
|
| 24 |
+
if env:
|
| 25 |
+
merged.update(env)
|
| 26 |
+
subprocess.run(cmd, cwd=str(cwd), check=True, env=merged)
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def main() -> None:
|
| 30 |
+
ap = argparse.ArgumentParser()
|
| 31 |
+
ap.add_argument("--episodes", type=int, default=400, help="Episodes per phase (or main loop) where applicable")
|
| 32 |
+
args = ap.parse_args()
|
| 33 |
+
|
| 34 |
+
root = Path(__file__).resolve().parent
|
| 35 |
+
results_dir = root / "results"
|
| 36 |
+
graphics_dir = root / "graphics"
|
| 37 |
+
results_dir.mkdir(parents=True, exist_ok=True)
|
| 38 |
+
graphics_dir.mkdir(parents=True, exist_ok=True)
|
| 39 |
+
common_env = {
|
| 40 |
+
"TWOQUARKS_RESULTS_DIR": results_dir.as_posix(),
|
| 41 |
+
"TWOQUARKS_GRAPHICS_DIR": graphics_dir.as_posix(),
|
| 42 |
+
}
|
| 43 |
+
down_dir = root / "down"
|
| 44 |
+
AntiDown_dir = root / "AntiDown"
|
| 45 |
+
|
| 46 |
+
# DOWN
|
| 47 |
+
down_script = down_dir / "exp" / "run_paradox_tabular.py"
|
| 48 |
+
_run([sys.executable, str(down_script)], cwd=down_dir, env=common_env)
|
| 49 |
+
plot_script = down_dir / "exp" / "plot_paradox_results.py"
|
| 50 |
+
_run([sys.executable, str(plot_script)], cwd=down_dir, env=common_env)
|
| 51 |
+
# AntiDown
|
| 52 |
+
AntiDown_script = AntiDown_dir / "exp" / "run_corrupted_valley_tabular.py"
|
| 53 |
+
_run([sys.executable, str(AntiDown_script)], cwd=AntiDown_dir, env=common_env)
|
| 54 |
+
AntiDown_plot = AntiDown_dir / "exp" / "plot_corrupted_valley_results.py"
|
| 55 |
+
_run([sys.executable, str(AntiDown_plot)], cwd=AntiDown_dir, env=common_env)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
# Dual overlay plot (Down vs AntiDown)
|
| 59 |
+
dual_plot = root / "plot_dual_down_antidown.py"
|
| 60 |
+
if dual_plot.exists():
|
| 61 |
+
_run([sys.executable, str(dual_plot)], cwd=root, env=common_env)
|
| 62 |
+
|
| 63 |
+
print("\nDone. Results and plots saved into root/results and root/graphics.")
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
if __name__ == "__main__":
|
| 67 |
+
main()
|
Down/run_all.sh
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
python3 run_all.py
|
README.md
CHANGED
|
@@ -1,22 +1,19 @@
|
|
| 1 |
-
|
| 2 |
-
title: QuarksLab
|
| 3 |
-
emoji: 🧪
|
| 4 |
-
colorFrom: indigo
|
| 5 |
-
colorTo: blue
|
| 6 |
-
sdk: gradio
|
| 7 |
-
sdk_version: 6.3.0
|
| 8 |
-
python_version: 3.1
|
| 9 |
-
app_file: app.py
|
| 10 |
-
pinned: false
|
| 11 |
-
license: mit
|
| 12 |
-
short_description: Lab
|
| 13 |
-
---
|
| 14 |
|
| 15 |
-
|
| 16 |
|
| 17 |
-
|
|
|
|
|
|
|
| 18 |
|
|
|
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
+
# TwoQuarks — QuarksLab (Interactive)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
+
This is a Hugging Face Space intended to **run real, bounded experiments** from Three Quarks:
|
| 4 |
|
| 5 |
+
- **DOWN / AntiDown** (tabular experiments)
|
| 6 |
+
- **STRANGE / AntiStrange** (HypothesisLab swarm)
|
| 7 |
+
- **CHARM** (Enchanted Valley + CharmField)
|
| 8 |
|
| 9 |
+
## Run locally
|
| 10 |
|
| 11 |
+
```bash
|
| 12 |
+
pip install -r requirements.txt
|
| 13 |
+
python app.py
|
| 14 |
+
```
|
| 15 |
+
|
| 16 |
+
## Deploy to Hugging Face Spaces
|
| 17 |
+
|
| 18 |
+
Create a new Space (Gradio) and push this repository.
|
| 19 |
|
|
|
Strange/AntiStrange/envs/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
# Package init
|
Strange/AntiStrange/envs/antihypothesis_lab_env.py
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ======================================================================
|
| 2 |
+
# ANTI-HYPOTHESIS LAB ENV
|
| 3 |
+
# Entorno diseñado para forzar exploración disruptiva (ANTI-STRANGE)
|
| 4 |
+
# ======================================================================
|
| 5 |
+
|
| 6 |
+
from dataclasses import dataclass
|
| 7 |
+
import numpy as np
|
| 8 |
+
|
| 9 |
+
@dataclass
|
| 10 |
+
class AntiHypothesisState:
|
| 11 |
+
phase: int
|
| 12 |
+
progress: float
|
| 13 |
+
stability: float
|
| 14 |
+
latent_potential: float
|
| 15 |
+
last_action: int
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
class AntiHypothesisLabEnv:
|
| 19 |
+
"""
|
| 20 |
+
Variante del laboratorio diseñada para exponer el comportamiento del
|
| 21 |
+
agente ANTI-STRANGE: romper attractores y desbloquear recompensas
|
| 22 |
+
profundas mediante exploración insistente.
|
| 23 |
+
"""
|
| 24 |
+
|
| 25 |
+
def __init__(
|
| 26 |
+
self,
|
| 27 |
+
max_steps: int = 50,
|
| 28 |
+
phase_drift_prob: float = 0.03,
|
| 29 |
+
seed: int = 0,
|
| 30 |
+
potential_threshold: float = 0.6,
|
| 31 |
+
):
|
| 32 |
+
self.max_steps = max_steps
|
| 33 |
+
self.rng = np.random.default_rng(seed)
|
| 34 |
+
self.phase_drift_prob = phase_drift_prob
|
| 35 |
+
self.potential_threshold = potential_threshold
|
| 36 |
+
self.step_count = 0
|
| 37 |
+
self.state = None
|
| 38 |
+
|
| 39 |
+
@property
|
| 40 |
+
def n_actions(self):
|
| 41 |
+
return 4 # respeta el mismo espacio de acción
|
| 42 |
+
|
| 43 |
+
def reset(self):
|
| 44 |
+
self.step_count = 0
|
| 45 |
+
self.state = AntiHypothesisState(
|
| 46 |
+
phase=1,
|
| 47 |
+
progress=0.1,
|
| 48 |
+
stability=0.2,
|
| 49 |
+
latent_potential=0.0,
|
| 50 |
+
last_action=-1,
|
| 51 |
+
)
|
| 52 |
+
return self._encode_state(self.state)
|
| 53 |
+
|
| 54 |
+
def _encode_state(self, s):
|
| 55 |
+
p_bin = int(np.clip(s.progress * 5, 0, 4))
|
| 56 |
+
s_bin = int(np.clip(s.stability * 5, 0, 4))
|
| 57 |
+
pot_bin = int(np.clip(s.latent_potential * 3, 0, 2))
|
| 58 |
+
return s.phase * 75 + p_bin * 15 + s_bin * 3 + pot_bin
|
| 59 |
+
|
| 60 |
+
def _sample_next_phase(self, phase, potential):
|
| 61 |
+
if potential >= self.potential_threshold and phase < 2:
|
| 62 |
+
return 2
|
| 63 |
+
if self.rng.random() > self.phase_drift_prob:
|
| 64 |
+
return phase
|
| 65 |
+
delta = self.rng.integers(-1, 2)
|
| 66 |
+
return int(np.clip(phase + delta, 0, 2))
|
| 67 |
+
|
| 68 |
+
def step(self, action: int):
|
| 69 |
+
self.step_count += 1
|
| 70 |
+
s = self.state
|
| 71 |
+
|
| 72 |
+
phase = s.phase
|
| 73 |
+
|
| 74 |
+
dP = dS = dPot = 0.0
|
| 75 |
+
|
| 76 |
+
if phase == 0:
|
| 77 |
+
if action == 0:
|
| 78 |
+
dP, dS, r = 0.10, -0.03, 0.02
|
| 79 |
+
dPot = 0.08
|
| 80 |
+
elif action == 1:
|
| 81 |
+
dP, dS, r = 0.03, 0.02, 0.03
|
| 82 |
+
dPot = 0.01
|
| 83 |
+
elif action == 2:
|
| 84 |
+
dP, dS, r = 0.08, 0.00, 0.03
|
| 85 |
+
dPot = 0.06
|
| 86 |
+
else:
|
| 87 |
+
dP, dS, r = 0.02, 0.02, 0.02
|
| 88 |
+
|
| 89 |
+
elif phase == 1:
|
| 90 |
+
if action == 0:
|
| 91 |
+
dP, dS, r = 0.03, -0.04, 0.00
|
| 92 |
+
dPot = 0.06
|
| 93 |
+
elif action == 1:
|
| 94 |
+
dP, dS, r = 0.05, 0.06, 0.06
|
| 95 |
+
dPot = 0.01
|
| 96 |
+
elif action == 2:
|
| 97 |
+
dP, dS, r = 0.04, 0.03, 0.05
|
| 98 |
+
dPot = 0.05
|
| 99 |
+
else:
|
| 100 |
+
dP, dS, r = 0.06, 0.06, 0.08
|
| 101 |
+
|
| 102 |
+
else:
|
| 103 |
+
if action == 0:
|
| 104 |
+
dP, dS, r = 0.02, -0.05, 0.0
|
| 105 |
+
dPot = -0.02
|
| 106 |
+
elif action == 1:
|
| 107 |
+
dP, dS, r = 0.05, 0.05, 0.07
|
| 108 |
+
dPot = -0.01
|
| 109 |
+
elif action == 2:
|
| 110 |
+
dP, dS, r = 0.05, 0.03, 0.06
|
| 111 |
+
dPot = -0.005
|
| 112 |
+
else:
|
| 113 |
+
dP, dS, r = 0.08, 0.05, 0.12
|
| 114 |
+
dPot = -0.03
|
| 115 |
+
|
| 116 |
+
dP += self.rng.normal(0, 0.01)
|
| 117 |
+
dS += self.rng.normal(0, 0.01)
|
| 118 |
+
|
| 119 |
+
new_p = np.clip(s.progress + dP, 0, 1)
|
| 120 |
+
new_s = np.clip(s.stability + dS, 0, 1)
|
| 121 |
+
new_pot = np.clip(s.latent_potential + dPot, 0, 1)
|
| 122 |
+
|
| 123 |
+
reward = r + 0.35 * new_p + 0.30 * new_s
|
| 124 |
+
|
| 125 |
+
if action == s.last_action:
|
| 126 |
+
reward -= 0.02
|
| 127 |
+
|
| 128 |
+
if new_p < 0.15 and new_s < 0.15:
|
| 129 |
+
reward -= 0.08
|
| 130 |
+
|
| 131 |
+
next_phase = self._sample_next_phase(phase, new_pot)
|
| 132 |
+
|
| 133 |
+
self.state = AntiHypothesisState(
|
| 134 |
+
phase=next_phase,
|
| 135 |
+
progress=new_p,
|
| 136 |
+
stability=new_s,
|
| 137 |
+
latent_potential=new_pot,
|
| 138 |
+
last_action=action,
|
| 139 |
+
)
|
| 140 |
+
|
| 141 |
+
done = self.step_count >= self.max_steps
|
| 142 |
+
|
| 143 |
+
info = {
|
| 144 |
+
"phase": next_phase,
|
| 145 |
+
"progress": float(new_p),
|
| 146 |
+
"stability": float(new_s),
|
| 147 |
+
"latent_potential": float(new_pot),
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
return self._encode_state(self.state), float(reward), bool(done), info
|
Strange/AntiStrange/exp/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
# Package init
|
Strange/AntiStrange/exp/plot_results.py
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import os
|
| 3 |
+
import sys
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
THIS_DIR = Path(__file__).resolve().parent
|
| 7 |
+
PROJECT_ROOT = THIS_DIR.parent
|
| 8 |
+
sys.path.append(str(PROJECT_ROOT))
|
| 9 |
+
|
| 10 |
+
import pandas as pd
|
| 11 |
+
import matplotlib.pyplot as plt
|
| 12 |
+
|
| 13 |
+
def plot_from_csv(csv_path: Path, out_dir: Path, prefix: str) -> None:
|
| 14 |
+
df = pd.read_csv(csv_path)
|
| 15 |
+
out_dir.mkdir(parents=True, exist_ok=True)
|
| 16 |
+
|
| 17 |
+
# Episode return
|
| 18 |
+
if {"episode","reward"}.issubset(df.columns):
|
| 19 |
+
ep_ret = df.groupby("episode")["reward"].sum().reset_index()
|
| 20 |
+
plt.figure()
|
| 21 |
+
plt.plot(ep_ret["episode"], ep_ret["reward"])
|
| 22 |
+
plt.xlabel("episode")
|
| 23 |
+
plt.ylabel("episode_return")
|
| 24 |
+
plt.title(f"{prefix} episode return")
|
| 25 |
+
plt.tight_layout()
|
| 26 |
+
plt.savefig(out_dir / f"{prefix.lower()}_episode_return.png", dpi=160)
|
| 27 |
+
plt.close()
|
| 28 |
+
|
| 29 |
+
# Stability / diversity if present
|
| 30 |
+
for col in ["stability","diversity","phase","progress","w_t","H_swarm","S_t","T"]:
|
| 31 |
+
if col in df.columns:
|
| 32 |
+
series = df.groupby("episode")[col].mean().reset_index()
|
| 33 |
+
plt.figure()
|
| 34 |
+
plt.plot(series["episode"], series[col])
|
| 35 |
+
plt.xlabel("episode")
|
| 36 |
+
plt.ylabel(col)
|
| 37 |
+
plt.title(f"{prefix} mean {col}")
|
| 38 |
+
plt.tight_layout()
|
| 39 |
+
plt.savefig(out_dir / f"{prefix.lower()}_{col}.png", dpi=160)
|
| 40 |
+
plt.close()
|
| 41 |
+
|
| 42 |
+
def main():
|
| 43 |
+
import argparse
|
| 44 |
+
ap = argparse.ArgumentParser()
|
| 45 |
+
ap.add_argument("--csv", required=True, help="Path to results CSV (relative to project root is ok).")
|
| 46 |
+
ap.add_argument("--out", default="graphics", help="Output directory for plots (relative ok).")
|
| 47 |
+
ap.add_argument("--prefix", default="Strange", help="Plot filename prefix.")
|
| 48 |
+
args = ap.parse_args()
|
| 49 |
+
|
| 50 |
+
csv_path = Path(args.csv)
|
| 51 |
+
if not csv_path.is_absolute():
|
| 52 |
+
csv_path = (PROJECT_ROOT / csv_path).resolve()
|
| 53 |
+
out_dir = Path(args.out)
|
| 54 |
+
if not out_dir.is_absolute():
|
| 55 |
+
out_dir = (PROJECT_ROOT / out_dir).resolve()
|
| 56 |
+
|
| 57 |
+
if not csv_path.exists():
|
| 58 |
+
raise FileNotFoundError(f"CSV not found: {csv_path}")
|
| 59 |
+
|
| 60 |
+
plot_from_csv(csv_path, out_dir, args.prefix)
|
| 61 |
+
print(f"[ok] plots saved to: {out_dir}")
|
| 62 |
+
|
| 63 |
+
if __name__ == "__main__":
|
| 64 |
+
main()
|
Strange/AntiStrange/exp/run_antistrange_hypothesis_lab.py
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
import csv
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 7 |
+
PROJECT_ROOT = os.path.abspath(os.path.join(THIS_DIR, ".."))
|
| 8 |
+
sys.path.append(PROJECT_ROOT)
|
| 9 |
+
|
| 10 |
+
def _resolve_path(p: str) -> str:
|
| 11 |
+
"""Resolve relative paths against PROJECT_ROOT for reproducible runs."""
|
| 12 |
+
if os.path.isabs(p):
|
| 13 |
+
return p
|
| 14 |
+
return os.path.abspath(os.path.join(PROJECT_ROOT, p))
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
from envs.antihypothesis_lab_env import AntiHypothesisLabEnv
|
| 18 |
+
from levo.antistrange_swarm import AntiStrangeConfig, AntiStrangeSwarm
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def run_antistrange(
|
| 22 |
+
n_episodes: int = 200,
|
| 23 |
+
max_steps: int = 50,
|
| 24 |
+
seed: int = 0,
|
| 25 |
+
out_path: str = "results/antistrange_hypothesis_lab.csv",
|
| 26 |
+
):
|
| 27 |
+
# Entorno "territorio anti" 🤘
|
| 28 |
+
env = AntiHypothesisLabEnv(max_steps=max_steps, seed=seed)
|
| 29 |
+
out_path = _resolve_path(out_path)
|
| 30 |
+
os.makedirs(os.path.dirname(out_path), exist_ok=True)
|
| 31 |
+
|
| 32 |
+
cfg = AntiStrangeConfig(n_actions=env.n_actions, seed=seed)
|
| 33 |
+
agent = AntiStrangeSwarm(cfg)
|
| 34 |
+
|
| 35 |
+
os.makedirs(os.path.dirname(out_path), exist_ok=True)
|
| 36 |
+
|
| 37 |
+
fieldnames = [
|
| 38 |
+
"episode", "step", "reward",
|
| 39 |
+
"T", "H_swarm", "S_t", "diversity", "w_t",
|
| 40 |
+
"phase", "progress", "stability",
|
| 41 |
+
"latent_potential", # NUEVO: clave para ver cuándo despierta el anti
|
| 42 |
+
]
|
| 43 |
+
|
| 44 |
+
with open(out_path, "w", newline="", encoding="utf-8") as f:
|
| 45 |
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
| 46 |
+
writer.writeheader()
|
| 47 |
+
|
| 48 |
+
for ep in range(n_episodes):
|
| 49 |
+
s = env.reset()
|
| 50 |
+
done = False
|
| 51 |
+
step = 0
|
| 52 |
+
|
| 53 |
+
while not done:
|
| 54 |
+
a, info = agent.act(s, step)
|
| 55 |
+
s_next, r, done, env_info = env.step(a)
|
| 56 |
+
agent.update(s, a, r, s_next, done)
|
| 57 |
+
|
| 58 |
+
row = {
|
| 59 |
+
"episode": ep,
|
| 60 |
+
"step": step,
|
| 61 |
+
"reward": r,
|
| 62 |
+
"T": info["T"],
|
| 63 |
+
"H_swarm": info["H_swarm"],
|
| 64 |
+
"S_t": info["S_t"],
|
| 65 |
+
"diversity": info["diversity"],
|
| 66 |
+
"w_t": info["w_t"],
|
| 67 |
+
"phase": env_info["phase"],
|
| 68 |
+
"progress": env_info["progress"],
|
| 69 |
+
"stability": env_info["stability"],
|
| 70 |
+
"latent_potential": env_info.get("latent_potential", 0.0),
|
| 71 |
+
}
|
| 72 |
+
writer.writerow(row)
|
| 73 |
+
|
| 74 |
+
s = s_next
|
| 75 |
+
step += 1
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
if __name__ == "__main__":
|
| 79 |
+
run_antistrange()
|
Strange/AntiStrange/graphics/antistrange_H_swarm.png
ADDED
|
Strange/AntiStrange/graphics/antistrange_S_t.png
ADDED
|
Strange/AntiStrange/graphics/antistrange_T.png
ADDED
|
Strange/AntiStrange/graphics/antistrange_diversity.png
ADDED
|
Git LFS Details
|
Strange/AntiStrange/graphics/antistrange_episode_return.png
ADDED
|
Git LFS Details
|
Strange/AntiStrange/graphics/antistrange_phase.png
ADDED
|
Git LFS Details
|
Strange/AntiStrange/graphics/antistrange_progress.png
ADDED
|
Git LFS Details
|
Strange/AntiStrange/graphics/antistrange_stability.png
ADDED
|
Git LFS Details
|
Strange/AntiStrange/graphics/antistrange_w_t.png
ADDED
|
Strange/AntiStrange/graphics/index.html
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
<!DOCTYPE html>
|
| 3 |
+
<html lang="en">
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8"/>
|
| 6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
| 7 |
+
<title>CHARM • Graphics</title>
|
| 8 |
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml"/>
|
| 9 |
+
<style>
|
| 10 |
+
*{margin:0;padding:0;box-sizing:border-box}
|
| 11 |
+
:root{
|
| 12 |
+
--bg:#000; --fg:#fff; --muted:rgba(255,255,255,.62);
|
| 13 |
+
--card:rgba(255,255,255,.04); --stroke:rgba(255,255,255,.10); --glass:rgba(0,0,0,.38);
|
| 14 |
+
}
|
| 15 |
+
body{font-family:Inter,system-ui,Segoe UI,Roboto,Arial;background:var(--bg);color:var(--fg);overflow-x:hidden}
|
| 16 |
+
#quantumField{position:fixed;inset:0;width:100vw;height:100vh;z-index:-10;background:#000}
|
| 17 |
+
nav{position:fixed;top:0;left:0;right:0;z-index:1000;padding:14px 24px;background:var(--glass);backdrop-filter:blur(12px);border-bottom:1px solid rgba(255,255,255,.06)}
|
| 18 |
+
.nav-inner{max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:16px}
|
| 19 |
+
.brand{font-weight:700;font-size:1.1rem}
|
| 20 |
+
.nav-links{display:flex;gap:10px;margin-left:18px}
|
| 21 |
+
.nav-links a{text-decoration:none;color:var(--fg);padding:8px 12px;border:1px solid rgba(255,255,255,.12);border-radius:999px;font-size:.9rem;opacity:.86;transition:.15s ease;white-space:nowrap}
|
| 22 |
+
.nav-links a:hover{opacity:1;background:rgba(255,255,255,.06)}
|
| 23 |
+
.spacer{flex:1}
|
| 24 |
+
.menu-btn{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.18);border-radius:12px;cursor:pointer;background:rgba(255,255,255,.02)}
|
| 25 |
+
.menu-btn span{display:block;width:18px;height:2px;background:#fff;position:relative}
|
| 26 |
+
.menu-btn span::before,.menu-btn span::after{content:"";position:absolute;left:0;width:18px;height:2px;background:#fff}
|
| 27 |
+
.menu-btn span::before{top:-6px} .menu-btn span::after{top:6px}
|
| 28 |
+
.menu{position:absolute;top:60px;right:24px;min-width:220px;padding:10px;border-radius:14px;background:var(--glass);backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.10);box-shadow:0 0 30px rgba(0,0,0,.6);display:none}
|
| 29 |
+
.menu.open{display:block}
|
| 30 |
+
.menu a{display:block;padding:10px 10px;border-radius:10px;text-decoration:none;color:var(--fg);opacity:.9}
|
| 31 |
+
.menu a:hover{background:rgba(255,255,255,.06);opacity:1}
|
| 32 |
+
.menu .sep{height:1px;background:rgba(255,255,255,.10);margin:8px 2px}
|
| 33 |
+
.wrap{max-width:1100px;margin:0 auto;padding:110px 6vw 70px}
|
| 34 |
+
.h{font-size:1.35rem;font-weight:650}
|
| 35 |
+
.sub{color:var(--muted);margin-top:10px;line-height:1.6;max-width:980px}
|
| 36 |
+
.viewer{margin-top:20px;display:grid;gap:14px;justify-items:center}
|
| 37 |
+
img{width:100%;max-width:1000px;max-height:70vh;object-fit:contain;border-radius:14px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.10)}
|
| 38 |
+
.controls{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}
|
| 39 |
+
.btn{text-decoration:none;color:var(--fg);padding:10px 14px;border-radius:999px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.03);opacity:.92;transition:.15s ease}
|
| 40 |
+
.btn:hover{opacity:1;background:rgba(255,255,255,.07)}
|
| 41 |
+
.kbd{font-family:ui-monospace,Menlo,Consolas,monospace;background:#15151b;border:1px solid #2a2a33;border-radius:6px;padding:2px 6px;font-size:.85em;color:var(--muted)}
|
| 42 |
+
.cap{color:var(--muted);max-width:980px;line-height:1.6;text-align:center}
|
| 43 |
+
.rule{border:0;border-top:1px solid rgba(255,255,255,.10);margin:22px 0}
|
| 44 |
+
</style>
|
| 45 |
+
</head>
|
| 46 |
+
<body>
|
| 47 |
+
<canvas id="quantumField"></canvas>
|
| 48 |
+
|
| 49 |
+
<nav>
|
| 50 |
+
<div class="nav-inner">
|
| 51 |
+
<div class="brand">TwoQuarks</div>
|
| 52 |
+
<div class="nav-links">
|
| 53 |
+
<a href="../../../index.html#down">DOWN</a>
|
| 54 |
+
<a href="../../../index.html#strange">STRANGE</a>
|
| 55 |
+
<a href="../../../index.html#top">TOP</a>
|
| 56 |
+
<a href="../../../index.html#charm">CHARM</a>
|
| 57 |
+
<a href="../../../index.html#up">UP</a>
|
| 58 |
+
<a href="../../../index.html#bottom">BOTTOM</a>
|
| 59 |
+
</div>
|
| 60 |
+
<div class="spacer"></div>
|
| 61 |
+
<div class="menu-btn" id="menuBtn"><span></span></div>
|
| 62 |
+
<div class="menu" id="siteMenu">
|
| 63 |
+
<a href="../../../index.html#about">ABOUT</a>
|
| 64 |
+
<a href="../../../quarkslab.html">QuarksLab</a>
|
| 65 |
+
<div class="sep"></div>
|
| 66 |
+
<a href="../../../quarks/bottom/resume.pdf">Resume</a>
|
| 67 |
+
<a href="../../../summary.pdf">Summary</a>
|
| 68 |
+
</div>
|
| 69 |
+
</div>
|
| 70 |
+
</nav>
|
| 71 |
+
|
| 72 |
+
<div class="wrap">
|
| 73 |
+
<div class="h">CHARM · Visual Diagnostics</div>
|
| 74 |
+
<div class="sub">These figures show robustness to heavy noise, keeping exploration controlled and policies coherent.</div>
|
| 75 |
+
|
| 76 |
+
<div class="viewer">
|
| 77 |
+
<img id="img" src="../anticharm/graphics/figure_01.png" alt="figure"/>
|
| 78 |
+
<div class="controls">
|
| 79 |
+
<a class="btn" href="javascript:void(0)" onclick="prev()">← Previous</a>
|
| 80 |
+
<a class="btn" href="javascript:void(0)" onclick="next()">Next →</a>
|
| 81 |
+
<span class="kbd">←</span><span class="kbd">→</span>
|
| 82 |
+
</div>
|
| 83 |
+
<div class="cap" id="cap">Figure 01</div>
|
| 84 |
+
</div>
|
| 85 |
+
|
| 86 |
+
<hr class="rule"/>
|
| 87 |
+
<div class="sub"><strong>Interpretation</strong><br/>These figures show robustness to heavy noise, keeping exploration controlled and policies coherent.</div>
|
| 88 |
+
</div>
|
| 89 |
+
|
| 90 |
+
<script>
|
| 91 |
+
|
| 92 |
+
const canvas = document.getElementById('quantumField');
|
| 93 |
+
const ctx = canvas.getContext('2d');
|
| 94 |
+
function resize(){
|
| 95 |
+
canvas.width = innerWidth;
|
| 96 |
+
canvas.height = innerHeight;
|
| 97 |
+
}
|
| 98 |
+
resize();
|
| 99 |
+
addEventListener('resize', resize);
|
| 100 |
+
|
| 101 |
+
const stars = Array.from({length: 650}, () => ({
|
| 102 |
+
x: (Math.random()-0.5) * canvas.width,
|
| 103 |
+
y: (Math.random()-0.5) * canvas.height,
|
| 104 |
+
z: Math.random() * canvas.width
|
| 105 |
+
}));
|
| 106 |
+
|
| 107 |
+
function animate(){
|
| 108 |
+
ctx.clearRect(0,0,canvas.width,canvas.height);
|
| 109 |
+
for(const s of stars){
|
| 110 |
+
s.z -= 2.2;
|
| 111 |
+
if (s.z < 1){
|
| 112 |
+
s.x = (Math.random()-0.7) * canvas.width;
|
| 113 |
+
s.y = (Math.random()-0.7) * canvas.height;
|
| 114 |
+
s.z = canvas.width;
|
| 115 |
+
}
|
| 116 |
+
const k = 128 / s.z;
|
| 117 |
+
const x = s.x * k + canvas.width/2;
|
| 118 |
+
const y = s.y * k + canvas.height/2;
|
| 119 |
+
const r = (1 - s.z/canvas.width) * 1.2;
|
| 120 |
+
ctx.beginPath();
|
| 121 |
+
ctx.fillStyle = "rgba(140,180,255,0.85)";
|
| 122 |
+
ctx.arc(x,y,r,0,Math.PI*2);
|
| 123 |
+
ctx.fill();
|
| 124 |
+
}
|
| 125 |
+
requestAnimationFrame(animate);
|
| 126 |
+
}
|
| 127 |
+
animate();
|
| 128 |
+
|
| 129 |
+
</script>
|
| 130 |
+
<script>
|
| 131 |
+
const menuBtn = document.getElementById('menuBtn');
|
| 132 |
+
const siteMenu = document.getElementById('siteMenu');
|
| 133 |
+
menuBtn.addEventListener('click', (e)=>{
|
| 134 |
+
e.stopPropagation(); siteMenu.classList.toggle('open');
|
| 135 |
+
});
|
| 136 |
+
document.addEventListener('click', ()=> siteMenu.classList.remove('open'));
|
| 137 |
+
siteMenu.addEventListener('click', (e)=> e.stopPropagation());
|
| 138 |
+
|
| 139 |
+
const images = [{"src": "anticharm/graphics/figure_01.png", "text": "Figure 01"}, {"src": "anticharm/graphics/figure_02.png", "text": "Figure 02"}, {"src": "anticharm/graphics/figure_03.png", "text": "Figure 03"}, {"src": "charm/graphics/figure_01.png", "text": "Figure 04"}, {"src": "charm/graphics/figure_02.png", "text": "Figure 05"}, {"src": "charm/graphics/figure_03.png", "text": "Figure 06"}, {"src": "freq_policies/graphics/figure_01.png", "text": "Figure 07"}, {"src": "freq_policies/graphics/figure_02.png", "text": "Figure 08"}, {"src": "freq_policies/graphics/figure_03.png", "text": "Figure 09"}, {"src": "z_olo/graphics/figure_01.png", "text": "Figure 10"}, {"src": "z_olo/graphics/figure_02.png", "text": "Figure 11"}, {"src": "z_olo/graphics/figure_03.png", "text": "Figure 12"}];
|
| 140 |
+
let i = 0;
|
| 141 |
+
function show(){ document.getElementById("img").src = images[i].src; document.getElementById("cap").textContent = images[i].text; }
|
| 142 |
+
function next(){ i=(i+1)%images.length; show(); }
|
| 143 |
+
function prev(){ i=(i-1+images.length)%images.length; show(); }
|
| 144 |
+
document.addEventListener("keydown",(e)=>{ if(e.key==="ArrowRight") next(); if(e.key==="ArrowLeft") prev(); });
|
| 145 |
+
</script>
|
| 146 |
+
</body>
|
| 147 |
+
</html>
|
Strange/AntiStrange/levo/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
# Package init
|
Strange/AntiStrange/levo/antistrange_swarm.py
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
ANTI-STRANGE Swarm
|
| 3 |
+
------------------
|
| 4 |
+
Contraparte "antiquark" del hadrón STRANGE.
|
| 5 |
+
|
| 6 |
+
Diferencias conceptuales con StrangeSwarm:
|
| 7 |
+
|
| 8 |
+
- Misma base HF-Levo tabular, pero:
|
| 9 |
+
* Termodinámica responde distinto a ΔR (premia mejoras fuertes).
|
| 10 |
+
* Gate w_t se activa cuando el sistema está demasiado ordenado.
|
| 11 |
+
* Usa una memoria *repulsora*: anti-proto, que empuja a acciones
|
| 12 |
+
históricamente poco visitadas (huecos del mapa de políticas).
|
| 13 |
+
|
| 14 |
+
- Interfaz compatible con StrangeSwarm:
|
| 15 |
+
AntiStrangeConfig, AntiStrangeSwarm.act(), AntiStrangeSwarm.update().
|
| 16 |
+
"""
|
| 17 |
+
|
| 18 |
+
from dataclasses import dataclass
|
| 19 |
+
from typing import Dict, List, Hashable
|
| 20 |
+
import numpy as np
|
| 21 |
+
import math
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
# ===================== HF-Levo agent (copiado para independencia) =====================
|
| 25 |
+
|
| 26 |
+
@dataclass
|
| 27 |
+
class HFLevoAgent:
|
| 28 |
+
n_actions: int
|
| 29 |
+
alpha: float = 0.1
|
| 30 |
+
gamma: float = 0.99
|
| 31 |
+
tau_base: float = 1.0
|
| 32 |
+
|
| 33 |
+
def __post_init__(self):
|
| 34 |
+
# Q: dict[state][action] -> value
|
| 35 |
+
self.Q: Dict[Hashable, np.ndarray] = {}
|
| 36 |
+
# Fase fija por acción para inducir diversidad real entre acciones
|
| 37 |
+
self.action_phases = np.linspace(
|
| 38 |
+
0.0, 2 * math.pi, self.n_actions, endpoint=False
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
def _ensure_state(self, s: Hashable):
|
| 42 |
+
if s not in self.Q:
|
| 43 |
+
self.Q[s] = np.zeros(self.n_actions, dtype=float)
|
| 44 |
+
|
| 45 |
+
def policy(
|
| 46 |
+
self,
|
| 47 |
+
s: Hashable,
|
| 48 |
+
t: int,
|
| 49 |
+
T: float,
|
| 50 |
+
hf_amp: float,
|
| 51 |
+
hf_omega: float,
|
| 52 |
+
phase_offset: float,
|
| 53 |
+
rng: np.random.Generator,
|
| 54 |
+
) -> np.ndarray:
|
| 55 |
+
"""
|
| 56 |
+
HF-Levo:
|
| 57 |
+
scores = Q + A(T) * cos(w(T)*t + phi_h,a)
|
| 58 |
+
p ~ softmax(scores / tau(T))
|
| 59 |
+
"""
|
| 60 |
+
self._ensure_state(s)
|
| 61 |
+
q = self.Q[s]
|
| 62 |
+
|
| 63 |
+
# temperatura de softmax: tau sube con T (más exploración)
|
| 64 |
+
tau = self.tau_base * (1.0 + 0.5 * T)
|
| 65 |
+
|
| 66 |
+
# oscilación por acción: desfase del agente + desfase propio por acción
|
| 67 |
+
osc_vec = hf_amp * np.cos(
|
| 68 |
+
hf_omega * t + phase_offset + self.action_phases
|
| 69 |
+
)
|
| 70 |
+
scores = q + osc_vec
|
| 71 |
+
|
| 72 |
+
# softmax numéricamente estable
|
| 73 |
+
z = scores - scores.max()
|
| 74 |
+
exp_z = np.exp(z / max(1e-8, tau))
|
| 75 |
+
p = exp_z / exp_z.sum()
|
| 76 |
+
return p
|
| 77 |
+
|
| 78 |
+
def update(
|
| 79 |
+
self,
|
| 80 |
+
s: Hashable,
|
| 81 |
+
a: int,
|
| 82 |
+
r: float,
|
| 83 |
+
s_next: Hashable,
|
| 84 |
+
done: bool,
|
| 85 |
+
):
|
| 86 |
+
self._ensure_state(s)
|
| 87 |
+
self._ensure_state(s_next)
|
| 88 |
+
q = self.Q[s]
|
| 89 |
+
q_next = self.Q[s_next]
|
| 90 |
+
target = r if done else (r + self.gamma * float(q_next.max()))
|
| 91 |
+
td = target - q[a]
|
| 92 |
+
q[a] += self.alpha * td
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
# ===================== Config ANTI-STRANGE =====================
|
| 96 |
+
|
| 97 |
+
@dataclass
|
| 98 |
+
class AntiStrangeConfig:
|
| 99 |
+
n_agents: int = 5
|
| 100 |
+
n_actions: int = 4
|
| 101 |
+
hf_amp_base: float = 0.15
|
| 102 |
+
hf_omega_base: float = 0.35
|
| 103 |
+
|
| 104 |
+
T_init: float = 0.7
|
| 105 |
+
T_min: float = 0.0
|
| 106 |
+
T_max: float = 2.0
|
| 107 |
+
eta_T: float = 0.05 # pasos de T
|
| 108 |
+
|
| 109 |
+
# --- Excitación (sube T) ---
|
| 110 |
+
# Queremos subir T cuando:
|
| 111 |
+
# - Hay mejoras fuertes (|ΔR| grande positiva).
|
| 112 |
+
# - El sistema está demasiado ordenado (baja entropía y baja diversidad).
|
| 113 |
+
eps_R_pos: float = 0.03 # mejora significativa de recompensa
|
| 114 |
+
H_low: float = 0.7 # entropía baja
|
| 115 |
+
D_low: float = 0.08 # diversidad baja
|
| 116 |
+
|
| 117 |
+
# --- Regulación (baja T) ---
|
| 118 |
+
# Queremos bajar T cuando:
|
| 119 |
+
# - El sistema se vuelve caótico (H o diversidad altas).
|
| 120 |
+
# - Hay caídas fuertes de recompensa.
|
| 121 |
+
H_high: float = 1.25 # entropía muy alta (~max)
|
| 122 |
+
D_high: float = 0.20 # diversidad muy alta
|
| 123 |
+
eps_crash: float = 0.03 # caída fuerte de reward
|
| 124 |
+
|
| 125 |
+
# --- Gate memoria repulsora ---
|
| 126 |
+
# Gate alto cuando el sistema está demasiado "congelado":
|
| 127 |
+
# T baja, S_t baja, H_swarm baja.
|
| 128 |
+
T_mid: float = 0.9
|
| 129 |
+
S_mid: float = 0.06
|
| 130 |
+
H_mid: float = 0.8
|
| 131 |
+
|
| 132 |
+
kT: float = 1.5
|
| 133 |
+
kS: float = 2.0
|
| 134 |
+
kH: float = 1.0
|
| 135 |
+
|
| 136 |
+
proto_alpha: float = 0.1
|
| 137 |
+
|
| 138 |
+
seed: int = 1 # distinto de Strange por defecto
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
# ===================== ANTI-STRANGE Swarm =====================
|
| 142 |
+
|
| 143 |
+
class AntiStrangeSwarm:
|
| 144 |
+
"""
|
| 145 |
+
Hadron ANTI-STRANGE.
|
| 146 |
+
|
| 147 |
+
Diferencias clave vs StrangeSwarm:
|
| 148 |
+
- T sube cuando hay mejoras fuertes y orden excesivo.
|
| 149 |
+
- Gate w_t empuja a memoria REPULSORA (anti-proto).
|
| 150 |
+
- Diseñado para explorar huecos de la política del enjambre.
|
| 151 |
+
|
| 152 |
+
Interfaz:
|
| 153 |
+
anti = AntiStrangeSwarm(cfg)
|
| 154 |
+
s = env.reset()
|
| 155 |
+
for t in ...:
|
| 156 |
+
a, info = anti.act(s, t)
|
| 157 |
+
s_next, r, done, env_info = env.step(a)
|
| 158 |
+
anti.update(s, a, r, s_next, done)
|
| 159 |
+
"""
|
| 160 |
+
|
| 161 |
+
def __init__(self, config: AntiStrangeConfig):
|
| 162 |
+
self.cfg = config
|
| 163 |
+
self.n_actions = config.n_actions
|
| 164 |
+
self.agents: List[HFLevoAgent] = [
|
| 165 |
+
HFLevoAgent(n_actions=config.n_actions)
|
| 166 |
+
for _ in range(config.n_agents)
|
| 167 |
+
]
|
| 168 |
+
self.rng = np.random.default_rng(config.seed)
|
| 169 |
+
|
| 170 |
+
# estado interno
|
| 171 |
+
self.T = config.T_init
|
| 172 |
+
self.proto: Dict[Hashable, np.ndarray] = {}
|
| 173 |
+
|
| 174 |
+
self.last_reward = 0.0
|
| 175 |
+
self.last_delta_R = 0.0
|
| 176 |
+
|
| 177 |
+
# fases diferentes para cada agente
|
| 178 |
+
self.agent_phases = np.linspace(
|
| 179 |
+
0.0, 2 * math.pi, config.n_agents, endpoint=False
|
| 180 |
+
)
|
| 181 |
+
|
| 182 |
+
# --------- Métricas internas ---------
|
| 183 |
+
@staticmethod
|
| 184 |
+
def _entropy(p: np.ndarray) -> float:
|
| 185 |
+
p_safe = np.clip(p, 1e-8, 1.0)
|
| 186 |
+
return float(-(p_safe * np.log(p_safe)).sum())
|
| 187 |
+
|
| 188 |
+
@staticmethod
|
| 189 |
+
def _diversity(ps: np.ndarray) -> float:
|
| 190 |
+
H, A = ps.shape
|
| 191 |
+
if H <= 1:
|
| 192 |
+
return 0.0
|
| 193 |
+
d = 0.0
|
| 194 |
+
cnt = 0
|
| 195 |
+
for i in range(H):
|
| 196 |
+
for j in range(i + 1, H):
|
| 197 |
+
d += float(np.abs(ps[i] - ps[j]).mean())
|
| 198 |
+
cnt += 1
|
| 199 |
+
return d / max(1, cnt)
|
| 200 |
+
|
| 201 |
+
# --------- Core swarm policy ---------
|
| 202 |
+
def _compute_swarm_policy(self, s: Hashable, t: int):
|
| 203 |
+
cfg = self.cfg
|
| 204 |
+
ps = []
|
| 205 |
+
for h, agent in enumerate(self.agents):
|
| 206 |
+
phase = self.agent_phases[h]
|
| 207 |
+
p_h = agent.policy(
|
| 208 |
+
s,
|
| 209 |
+
t,
|
| 210 |
+
self.T,
|
| 211 |
+
hf_amp=cfg.hf_amp_base * (1.0 + 0.5 * self.T),
|
| 212 |
+
hf_omega=cfg.hf_omega_base * (1.0 + 0.25 * self.T),
|
| 213 |
+
phase_offset=phase,
|
| 214 |
+
rng=self.rng,
|
| 215 |
+
)
|
| 216 |
+
ps.append(p_h)
|
| 217 |
+
ps = np.stack(ps) # [H, A]
|
| 218 |
+
p_swarm = ps.mean(axis=0)
|
| 219 |
+
var = ps.var(axis=0)
|
| 220 |
+
S_t = float(var.mean())
|
| 221 |
+
H_swarm = self._entropy(p_swarm)
|
| 222 |
+
diversity = self._diversity(ps)
|
| 223 |
+
return p_swarm, S_t, H_swarm, diversity
|
| 224 |
+
|
| 225 |
+
def _update_proto(self, s: Hashable, p_swarm: np.ndarray):
|
| 226 |
+
cfg = self.cfg
|
| 227 |
+
if s not in self.proto:
|
| 228 |
+
self.proto[s] = p_swarm.copy()
|
| 229 |
+
else:
|
| 230 |
+
self.proto[s] = (
|
| 231 |
+
(1.0 - cfg.proto_alpha) * self.proto[s]
|
| 232 |
+
+ cfg.proto_alpha * p_swarm
|
| 233 |
+
)
|
| 234 |
+
|
| 235 |
+
def _anti_proto(self, s: Hashable) -> np.ndarray:
|
| 236 |
+
"""
|
| 237 |
+
Construye memoria repulsora:
|
| 238 |
+
anti_proto ∝ 1 - proto
|
| 239 |
+
Es decir, favorece acciones históricamente poco usadas.
|
| 240 |
+
"""
|
| 241 |
+
proto_s = self.proto[s]
|
| 242 |
+
raw = 1.0 - proto_s
|
| 243 |
+
raw = np.clip(raw, 1e-8, None)
|
| 244 |
+
return raw / raw.sum()
|
| 245 |
+
|
| 246 |
+
def _thermo_step(
|
| 247 |
+
self,
|
| 248 |
+
delta_R: float,
|
| 249 |
+
H_swarm: float,
|
| 250 |
+
S_t: float,
|
| 251 |
+
diversity: float,
|
| 252 |
+
):
|
| 253 |
+
"""
|
| 254 |
+
Control térmico "anti":
|
| 255 |
+
|
| 256 |
+
- E_t (excitación, sube T):
|
| 257 |
+
* |ΔR| grande positiva (mejora fuerte de recompensa).
|
| 258 |
+
* Orden excesivo: H_swarm baja y diversidad baja.
|
| 259 |
+
|
| 260 |
+
- R_t (regulación, baja T):
|
| 261 |
+
* Caos fuerte: H_swarm muy alta o diversidad muy alta.
|
| 262 |
+
* Crash de recompensa: ΔR muy negativa.
|
| 263 |
+
"""
|
| 264 |
+
cfg = self.cfg
|
| 265 |
+
|
| 266 |
+
improving = delta_R > cfg.eps_R_pos
|
| 267 |
+
too_ordered = (H_swarm < cfg.H_low) and (diversity < cfg.D_low)
|
| 268 |
+
|
| 269 |
+
E_t = (
|
| 270 |
+
(1.0 if improving else 0.0) +
|
| 271 |
+
(1.0 if too_ordered else 0.0)
|
| 272 |
+
)
|
| 273 |
+
|
| 274 |
+
too_chaotic = (H_swarm > cfg.H_high) or (diversity > cfg.D_high)
|
| 275 |
+
crashing = delta_R < -cfg.eps_crash
|
| 276 |
+
|
| 277 |
+
R_t = (
|
| 278 |
+
(1.0 if too_chaotic else 0.0) +
|
| 279 |
+
(1.0 if crashing else 0.0)
|
| 280 |
+
)
|
| 281 |
+
|
| 282 |
+
self.T += cfg.eta_T * (E_t - R_t)
|
| 283 |
+
self.T = float(np.clip(self.T, cfg.T_min, cfg.T_max))
|
| 284 |
+
return float(E_t), float(R_t)
|
| 285 |
+
|
| 286 |
+
def _gate(self, H_swarm: float, S_t: float) -> float:
|
| 287 |
+
"""
|
| 288 |
+
Gate invertido:
|
| 289 |
+
|
| 290 |
+
- Queremos w_t alto cuando el sistema está demasiado
|
| 291 |
+
ordenado y frío (baja entropía / baja varianza / T baja),
|
| 292 |
+
para empujar hacia acciones en los "huecos" (anti-proto).
|
| 293 |
+
|
| 294 |
+
- Cuando T, S_t y H_swarm son altos, w_t tiende a 0
|
| 295 |
+
y se deja actuar más a p_swarm.
|
| 296 |
+
"""
|
| 297 |
+
cfg = self.cfg
|
| 298 |
+
x = (
|
| 299 |
+
cfg.kT * (cfg.T_mid - self.T) +
|
| 300 |
+
cfg.kS * (cfg.S_mid - S_t) +
|
| 301 |
+
cfg.kH * (cfg.H_mid - H_swarm)
|
| 302 |
+
)
|
| 303 |
+
w = 1.0 / (1.0 + math.exp(-x))
|
| 304 |
+
return float(w)
|
| 305 |
+
|
| 306 |
+
# --------- Interfaz pública ---------
|
| 307 |
+
def act(self, s: Hashable, t: int):
|
| 308 |
+
"""
|
| 309 |
+
Calcula la política ANTI-STRANGE y samplea una acción.
|
| 310 |
+
Devuelve:
|
| 311 |
+
action, info_dict
|
| 312 |
+
"""
|
| 313 |
+
p_swarm, S_t, H_swarm, diversity = self._compute_swarm_policy(s, t)
|
| 314 |
+
self._update_proto(s, p_swarm)
|
| 315 |
+
|
| 316 |
+
# feedback térmico con ΔR real del paso previo
|
| 317 |
+
delta_R = self.last_delta_R
|
| 318 |
+
E_t, R_t = self._thermo_step(delta_R, H_swarm, S_t, diversity)
|
| 319 |
+
|
| 320 |
+
# memoria repulsora
|
| 321 |
+
anti_proto_s = self._anti_proto(s)
|
| 322 |
+
w_t = self._gate(H_swarm, S_t)
|
| 323 |
+
|
| 324 |
+
p_final = (1.0 - w_t) * p_swarm + w_t * anti_proto_s
|
| 325 |
+
p_final = p_final / p_final.sum()
|
| 326 |
+
|
| 327 |
+
a = int(self.rng.choice(len(p_final), p=p_final))
|
| 328 |
+
|
| 329 |
+
info = {
|
| 330 |
+
"T": self.T,
|
| 331 |
+
"S_t": S_t,
|
| 332 |
+
"H_swarm": H_swarm,
|
| 333 |
+
"diversity": diversity,
|
| 334 |
+
"E_t": E_t,
|
| 335 |
+
"R_t": R_t,
|
| 336 |
+
"w_t": w_t,
|
| 337 |
+
"p_swarm": p_swarm,
|
| 338 |
+
"p_final": p_final,
|
| 339 |
+
}
|
| 340 |
+
return a, info
|
| 341 |
+
|
| 342 |
+
def update(
|
| 343 |
+
self,
|
| 344 |
+
s: Hashable,
|
| 345 |
+
a: int,
|
| 346 |
+
r: float,
|
| 347 |
+
s_next: Hashable,
|
| 348 |
+
done: bool,
|
| 349 |
+
):
|
| 350 |
+
# Actualizamos Q de todos los agentes
|
| 351 |
+
for agent in self.agents:
|
| 352 |
+
agent.update(s, a, r, s_next, done)
|
| 353 |
+
|
| 354 |
+
# ΔR real
|
| 355 |
+
delta_R = r - self.last_reward
|
| 356 |
+
self.last_reward = r
|
| 357 |
+
self.last_delta_R = delta_R
|
| 358 |
+
|
| 359 |
+
return delta_R
|
Strange/AntiStrange/results/antistrange_hypothesis_lab.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|