Spaces:
Sleeping
Sleeping
Kyle
commited on
Commit
·
cf76c85
1
Parent(s):
469e9cf
updates
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +1 -0
- app.py +338 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:0.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:10.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:13.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:15.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:16.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:18.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:19.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:2.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:20.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:22.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:23.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:24.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:25.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:27.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:28.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:29.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:3.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:30.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:32.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:34.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:35.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:36.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:37.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:39.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:4.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:40.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:42.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:46.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:5.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:6.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:7.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:80.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:9.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:12.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:126.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:2.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:32.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:4.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:5.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:63.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:71.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:84.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-3:34.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-4:26.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-4:29.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-5:12.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-5:2.json +3 -0
- data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-5:6.json +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ 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 |
+
*.json filter=lfs diff=lfs merge=lfs -text
|
app.py
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import html
|
| 2 |
+
import json
|
| 3 |
+
import os
|
| 4 |
+
import re
|
| 5 |
+
from glob import glob
|
| 6 |
+
from typing import Any, Dict, List
|
| 7 |
+
|
| 8 |
+
import gradio as gr
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
# Regex to capture common LaTeX math delimiters
|
| 12 |
+
MATH_PATTERN = re.compile(
|
| 13 |
+
r"(\$\$(.*?)\$\$)" # $$block$$
|
| 14 |
+
r"|(\$([^\$\n]+?)\$)" # $inline$
|
| 15 |
+
r"|(\\\[(.*?)\\\])" # \[block\]
|
| 16 |
+
r"|(\\\(([^\n]+?)\\\))", # \(inline\)
|
| 17 |
+
re.DOTALL,
|
| 18 |
+
)
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def format_step_content(content: str) -> str:
|
| 22 |
+
"""Render content to simple HTML with basic LaTeX handling.
|
| 23 |
+
|
| 24 |
+
This keeps things lightweight: escape non-math parts and preserve
|
| 25 |
+
math segments literally so the viewer can copy/read the LaTeX.
|
| 26 |
+
|
| 27 |
+
Args:
|
| 28 |
+
content: Raw text content possibly containing LaTeX snippets.
|
| 29 |
+
|
| 30 |
+
Returns:
|
| 31 |
+
Safe HTML string for display.
|
| 32 |
+
"""
|
| 33 |
+
if not content:
|
| 34 |
+
return ""
|
| 35 |
+
|
| 36 |
+
text = content
|
| 37 |
+
rendered_parts: list[str] = []
|
| 38 |
+
last_idx = 0
|
| 39 |
+
|
| 40 |
+
for m in MATH_PATTERN.finditer(text):
|
| 41 |
+
# Non-math prefix
|
| 42 |
+
prefix = text[last_idx : m.start()]
|
| 43 |
+
if prefix:
|
| 44 |
+
rendered_parts.append(html.escape(prefix).replace("\n", "<br>"))
|
| 45 |
+
|
| 46 |
+
# Math segment (kept as-is, escaped for HTML visibility)
|
| 47 |
+
rendered_parts.append(html.escape(m.group(0)).replace("\n", "<br>"))
|
| 48 |
+
last_idx = m.end()
|
| 49 |
+
|
| 50 |
+
# Trailing non-math
|
| 51 |
+
tail = text[last_idx:]
|
| 52 |
+
if tail:
|
| 53 |
+
rendered_parts.append(html.escape(tail).replace("\n", "<br>"))
|
| 54 |
+
|
| 55 |
+
return "".join(rendered_parts)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def create_step_html(step: Dict[str, Any], step_num: int, border_color: str) -> str:
|
| 59 |
+
"""Create HTML for a single step (no token counting).
|
| 60 |
+
|
| 61 |
+
Args:
|
| 62 |
+
step: The step dictionary to render.
|
| 63 |
+
step_num: 1-based step index.
|
| 64 |
+
border_color: CSS color for the step border.
|
| 65 |
+
|
| 66 |
+
Returns:
|
| 67 |
+
HTML string for the step.
|
| 68 |
+
"""
|
| 69 |
+
html_out = f"""
|
| 70 |
+
<details style="margin: 8px 0;">
|
| 71 |
+
<summary style="cursor: pointer; color: {border_color}; font-weight: bold;">
|
| 72 |
+
Step {step_num}
|
| 73 |
+
</summary>
|
| 74 |
+
<div style="
|
| 75 |
+
background-color: white;
|
| 76 |
+
border-radius: 6px;
|
| 77 |
+
padding: 12px;
|
| 78 |
+
margin: 8px 0;
|
| 79 |
+
border-left: 4px solid {border_color};
|
| 80 |
+
">
|
| 81 |
+
"""
|
| 82 |
+
|
| 83 |
+
observation_text = str(step.get("observation", "")) if step.get("observation") else "None"
|
| 84 |
+
html_out += f"""
|
| 85 |
+
<details style="margin: 8px 0;">
|
| 86 |
+
<summary style="cursor: pointer; color: #666; font-size: 0.9em;">Observation</summary>
|
| 87 |
+
<div style="background-color: #f8f9fa; padding: 8px; border-radius: 4px; margin-top: 4px; color: #333;">
|
| 88 |
+
{format_step_content(observation_text)}
|
| 89 |
+
</div>
|
| 90 |
+
</details>
|
| 91 |
+
"""
|
| 92 |
+
|
| 93 |
+
thought_text = step.get("thought", "") if step.get("thought") else "None"
|
| 94 |
+
html_out += f"""
|
| 95 |
+
<details style="margin: 8px 0;">
|
| 96 |
+
<summary style="cursor: pointer; color: #666; font-size: 0.9em;">Thought</summary>
|
| 97 |
+
<div style="background-color: #f8f9fa; padding: 8px; border-radius: 4px; margin-top: 4px; color: #333;">
|
| 98 |
+
{format_step_content(thought_text)}
|
| 99 |
+
</div>
|
| 100 |
+
</details>
|
| 101 |
+
"""
|
| 102 |
+
|
| 103 |
+
action_text = ""
|
| 104 |
+
action = step.get("action")
|
| 105 |
+
if action:
|
| 106 |
+
if isinstance(action, dict) and "action" in action:
|
| 107 |
+
action_text = action["action"]
|
| 108 |
+
else:
|
| 109 |
+
action_text = str(action)
|
| 110 |
+
|
| 111 |
+
html_out += f"""
|
| 112 |
+
<div style="margin: 8px 0;">
|
| 113 |
+
<strong style="color: #333;">Action:</strong>
|
| 114 |
+
<div style="background-color: #f8f9fa; padding: 8px; border-radius: 4px; margin-top: 4px; color: #333;">
|
| 115 |
+
{format_step_content(action_text)}
|
| 116 |
+
</div>
|
| 117 |
+
</div>
|
| 118 |
+
"""
|
| 119 |
+
|
| 120 |
+
reward = step.get("reward", 0.0)
|
| 121 |
+
html_out += f"""
|
| 122 |
+
<div style="margin: 8px 0;">
|
| 123 |
+
<strong style="color: #333;">Reward:</strong> <span style="color: #333;">{reward}</span>
|
| 124 |
+
</div>
|
| 125 |
+
"""
|
| 126 |
+
|
| 127 |
+
html_out += "</div></details>"
|
| 128 |
+
return html_out
|
| 129 |
+
|
| 130 |
+
|
| 131 |
+
def get_agent_color(agent_name: str) -> tuple[str, str]:
|
| 132 |
+
"""Assign a stable color pair to an agent name.
|
| 133 |
+
|
| 134 |
+
Args:
|
| 135 |
+
agent_name: Agent identifier string.
|
| 136 |
+
|
| 137 |
+
Returns:
|
| 138 |
+
Tuple of (background_color, border_color).
|
| 139 |
+
"""
|
| 140 |
+
# Simple stable hash -> hue
|
| 141 |
+
hue = (abs(hash(agent_name)) % 360)
|
| 142 |
+
bg_color = f"hsl({hue}, 40%, 92%)"
|
| 143 |
+
border_color = f"hsl({hue}, 60%, 40%)"
|
| 144 |
+
return bg_color, border_color
|
| 145 |
+
|
| 146 |
+
|
| 147 |
+
def create_trajectory_html(agent_name: str, trajectory: Dict[str, Any]) -> str:
|
| 148 |
+
"""Create HTML for a trajectory (no tokenization or chat rendering)."""
|
| 149 |
+
bg_color, border_color = get_agent_color(agent_name)
|
| 150 |
+
|
| 151 |
+
agent_display = agent_name
|
| 152 |
+
|
| 153 |
+
html_out = f"""
|
| 154 |
+
<div style="
|
| 155 |
+
background-color: {bg_color};
|
| 156 |
+
border-radius: 8px;
|
| 157 |
+
padding: 16px;
|
| 158 |
+
margin: 10px 0;
|
| 159 |
+
border-left: 4px solid {border_color};
|
| 160 |
+
">
|
| 161 |
+
<div style="font-weight: bold; color: {border_color}; margin-bottom: 10px;">{agent_display}</div>
|
| 162 |
+
"""
|
| 163 |
+
|
| 164 |
+
steps = trajectory.get("steps", [])
|
| 165 |
+
for i, step in enumerate(steps):
|
| 166 |
+
html_out += create_step_html(step, i + 1, border_color)
|
| 167 |
+
|
| 168 |
+
html_out += "</div>"
|
| 169 |
+
return html_out
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
def create_episode_view(episode: Dict[str, Any]) -> str:
|
| 173 |
+
"""Create HTML view for an episode (lightweight).
|
| 174 |
+
|
| 175 |
+
Args:
|
| 176 |
+
episode: Episode dictionary to render.
|
| 177 |
+
|
| 178 |
+
Returns:
|
| 179 |
+
HTML string.
|
| 180 |
+
"""
|
| 181 |
+
episode_id = episode.get("id", "")
|
| 182 |
+
termination_reason = episode.get("termination_reason", "")
|
| 183 |
+
|
| 184 |
+
html_out = f"""
|
| 185 |
+
<div style="max-width: 1200px; margin: 0 auto; font-family: Arial, sans-serif;">
|
| 186 |
+
<div style="
|
| 187 |
+
background-color: #f8f9fa;
|
| 188 |
+
border-radius: 8px;
|
| 189 |
+
padding: 20px;
|
| 190 |
+
margin-bottom: 20px;
|
| 191 |
+
border-left: 4px solid #007bff;
|
| 192 |
+
">
|
| 193 |
+
<h2 style="margin: 0 0 12px 0; color: #333;">
|
| 194 |
+
Episode: {episode_id}
|
| 195 |
+
</h2>
|
| 196 |
+
<div style="color:#333; margin-bottom: 16px;">
|
| 197 |
+
<strong>Termination:</strong> <span>{termination_reason}</span>
|
| 198 |
+
</div>
|
| 199 |
+
</div>
|
| 200 |
+
"""
|
| 201 |
+
|
| 202 |
+
task = episode.get("task", {})
|
| 203 |
+
if task and "question" in task:
|
| 204 |
+
html_out += f"""
|
| 205 |
+
<div style="
|
| 206 |
+
background-color: #e3f2fd;
|
| 207 |
+
border-radius: 8px;
|
| 208 |
+
padding: 16px;
|
| 209 |
+
margin-bottom: 20px;
|
| 210 |
+
border-left: 4px solid #1976d2;
|
| 211 |
+
">
|
| 212 |
+
<h3 style="margin: 0 0 12px 0; color: #1976d2;">Problem Statement</h3>
|
| 213 |
+
<div style="background-color: white; padding: 12px; border-radius: 4px; color: #333;">
|
| 214 |
+
{format_step_content(task["question"])}
|
| 215 |
+
</div>
|
| 216 |
+
</div>
|
| 217 |
+
"""
|
| 218 |
+
|
| 219 |
+
html_out += """
|
| 220 |
+
<div style="
|
| 221 |
+
border: 2px solid #ddd;
|
| 222 |
+
border-radius: 8px;
|
| 223 |
+
padding: 20px;
|
| 224 |
+
background-color: white;
|
| 225 |
+
">
|
| 226 |
+
<h3 style="margin: 0 0 16px 0; color: #333;">Trajectories</h3>
|
| 227 |
+
"""
|
| 228 |
+
|
| 229 |
+
trajectories = episode.get("trajectories", [])
|
| 230 |
+
for agent_name, trajectory in trajectories:
|
| 231 |
+
html_out += create_trajectory_html(agent_name, trajectory)
|
| 232 |
+
|
| 233 |
+
html_out += "</div></div>"
|
| 234 |
+
return html_out
|
| 235 |
+
|
| 236 |
+
|
| 237 |
+
def list_runs(data_dir: str) -> list[str]:
|
| 238 |
+
"""List subdirectories inside the data directory.
|
| 239 |
+
|
| 240 |
+
Args:
|
| 241 |
+
data_dir: Path to the parent data directory.
|
| 242 |
+
|
| 243 |
+
Returns:
|
| 244 |
+
Sorted list of subdirectory names (runs).
|
| 245 |
+
"""
|
| 246 |
+
if not data_dir or not os.path.isdir(data_dir):
|
| 247 |
+
return []
|
| 248 |
+
entries = [name for name in os.listdir(data_dir) if os.path.isdir(os.path.join(data_dir, name))]
|
| 249 |
+
return sorted(entries)
|
| 250 |
+
|
| 251 |
+
|
| 252 |
+
def list_episode_files(run_dir: str) -> list[str]:
|
| 253 |
+
"""List episode JSON files inside a run directory.
|
| 254 |
+
|
| 255 |
+
Args:
|
| 256 |
+
run_dir: Absolute path to a run directory.
|
| 257 |
+
|
| 258 |
+
Returns:
|
| 259 |
+
Sorted list of file basenames.
|
| 260 |
+
"""
|
| 261 |
+
if not run_dir or not os.path.isdir(run_dir):
|
| 262 |
+
return []
|
| 263 |
+
files = sorted(glob(os.path.join(run_dir, "*.json")))
|
| 264 |
+
return [os.path.basename(p) for p in files]
|
| 265 |
+
|
| 266 |
+
|
| 267 |
+
def load_episode_from_file(file_path: str) -> Dict[str, Any]:
|
| 268 |
+
"""Load a single-episode JSON file into a dictionary.
|
| 269 |
+
|
| 270 |
+
Args:
|
| 271 |
+
file_path: Absolute path to JSON file containing one episode dict.
|
| 272 |
+
|
| 273 |
+
Returns:
|
| 274 |
+
Episode dictionary.
|
| 275 |
+
"""
|
| 276 |
+
with open(file_path) as f:
|
| 277 |
+
data = json.load(f)
|
| 278 |
+
# If file accidentally contains a list, take first element
|
| 279 |
+
if isinstance(data, list):
|
| 280 |
+
data = data[0] if data else {}
|
| 281 |
+
return data
|
| 282 |
+
|
| 283 |
+
|
| 284 |
+
def create_gradio_interface(data_dir: str):
|
| 285 |
+
"""Create the lightweight viewer with two dropdowns.
|
| 286 |
+
|
| 287 |
+
Args:
|
| 288 |
+
data_dir: Parent directory that contains run subdirectories.
|
| 289 |
+
|
| 290 |
+
Returns:
|
| 291 |
+
Gradio Blocks app.
|
| 292 |
+
"""
|
| 293 |
+
runs = list_runs(data_dir)
|
| 294 |
+
|
| 295 |
+
with gr.Blocks(title="Simple Episode Viewer") as demo:
|
| 296 |
+
with gr.Group():
|
| 297 |
+
with gr.Row():
|
| 298 |
+
run_dropdown = gr.Dropdown(choices=runs, value=None, label="Run (subdirectory)")
|
| 299 |
+
episode_dropdown = gr.Dropdown(choices=[], value=None, label="Episode (file)")
|
| 300 |
+
|
| 301 |
+
display_area = gr.HTML(label="Episode View", value="<p>Select a run and episode.</p>")
|
| 302 |
+
|
| 303 |
+
def update_runs(dir_value: str):
|
| 304 |
+
available_runs = list_runs(dir_value)
|
| 305 |
+
# Start with no run selected by default
|
| 306 |
+
return (
|
| 307 |
+
gr.Dropdown(choices=available_runs, value=None),
|
| 308 |
+
gr.Dropdown(choices=[], value=None),
|
| 309 |
+
"<p>Select a run and episode.</p>",
|
| 310 |
+
)
|
| 311 |
+
|
| 312 |
+
def on_run_change(selected_run: str):
|
| 313 |
+
run_path = os.path.join(data_dir, selected_run) if selected_run else None
|
| 314 |
+
episodes = list_episode_files(run_path) if run_path else []
|
| 315 |
+
return gr.Dropdown(choices=episodes, value=(episodes[0] if episodes else None)), "<p>Select an episode.</p>"
|
| 316 |
+
|
| 317 |
+
def on_episode_change(selected_episode: str, selected_run: str):
|
| 318 |
+
if not selected_episode or not selected_run:
|
| 319 |
+
return "<p>Select a run and episode.</p>"
|
| 320 |
+
file_path = os.path.join(data_dir, selected_run, selected_episode)
|
| 321 |
+
try:
|
| 322 |
+
episode = load_episode_from_file(file_path)
|
| 323 |
+
return create_episode_view(episode)
|
| 324 |
+
except Exception as e:
|
| 325 |
+
return f"<p>Error loading episode: {html.escape(str(e))}</p>"
|
| 326 |
+
|
| 327 |
+
# Wire events
|
| 328 |
+
run_dropdown.change(on_run_change, inputs=[run_dropdown], outputs=[episode_dropdown, display_area])
|
| 329 |
+
episode_dropdown.change(on_episode_change, inputs=[episode_dropdown, run_dropdown], outputs=[display_area])
|
| 330 |
+
|
| 331 |
+
return demo
|
| 332 |
+
|
| 333 |
+
|
| 334 |
+
if __name__ == "__main__":
|
| 335 |
+
demo = create_gradio_interface("./data")
|
| 336 |
+
demo.launch()
|
| 337 |
+
|
| 338 |
+
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:0.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bf9b4b294750fa8b3c92e04983f90d89ba57b4eb9f37a0a908611a4326ba9384
|
| 3 |
+
size 10486367
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:10.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:94befd39e1a2569f9d586711ea1ca9831d0e0adb9a8537774a47a9b3cc4bd8ac
|
| 3 |
+
size 10421562
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:13.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fe6718d2f94f88ff114c4e2a77c7220b5205cbf1150216f68141d53830211419
|
| 3 |
+
size 9943046
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:15.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:68531341de4e4d860a1b792fb7cb79ad42779a1dd2763f87e1042f5710331294
|
| 3 |
+
size 10344811
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:16.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b445137e1fcc9f0a87335964d9b5b3c0b8969d49e2102d62d8e3ffbff14b9848
|
| 3 |
+
size 10687113
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:18.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1b0d85c90f45a258a9350b7529771028162bb80f21274f7e81c9003d703fcf2e
|
| 3 |
+
size 9452477
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:19.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cf0aa08f665d0df87e74ed773bc53174160b7c917e52cca8d88d39a058b0533a
|
| 3 |
+
size 11188617
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:2.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5838420427e9b02b6abeb5894269895cd27b616cdc6fdd3dcdbc0608800bdab2
|
| 3 |
+
size 10879355
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:20.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5a7fe58b0f4bcd6ccbe20bd3f2adf3f56c6e3ff6c44a632228d1cf6eb75ab6cb
|
| 3 |
+
size 9746168
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:22.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b1583aba82852ce258cd5dd38d04daab9ce99239ca0c5641240b2e8883b48a0d
|
| 3 |
+
size 10692119
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:23.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d9b3374f5dac1cc770d8ede3850b9a851d3b24f97f32bb7969689d1bffd818fa
|
| 3 |
+
size 11053855
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:24.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6987654a6662caf5ea0fa366ef835d0564eafe25d86a2c416841da2a165e6f73
|
| 3 |
+
size 8097252
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:25.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5fb0cd9bcee28d82e832c49619c5637eaaced370f564a8f34436388aac22bb47
|
| 3 |
+
size 9340956
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:27.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ed11d88773b3c6bd28d83bde7da5da01013cdfbce235aa7b60c701c0b39ebcba
|
| 3 |
+
size 10638893
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:28.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7f970e45878a78f6af3e162c09ec210d28c3a0344872ac68b8f7c86e742b0a5c
|
| 3 |
+
size 10918467
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:29.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c54c754f3e010b1f1d7bfd1529b2d07dbe73556aa126452b6cf3922c31ec1f90
|
| 3 |
+
size 10969519
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:3.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:64087d32674c0b0d937cd608f371ec4d2e53466513c535e6b8340b9dec97a285
|
| 3 |
+
size 10482133
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:30.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0b265205f8942103a49ab26e0f19f2a8604adf33119c61f37da96439c7b7b485
|
| 3 |
+
size 10044106
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:32.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e8d8d1f4b5640637db033a61aad8257bf1ab45496b06f285767589536d6b1a90
|
| 3 |
+
size 10330372
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:34.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1ab5181f248266b2ba160fb1fb539d5e71935e2126f5ab425951573f163c8a70
|
| 3 |
+
size 10835535
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:35.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7718447c57f7edda30cfed6e95b86ede6948aa805d002455356b3da8f86fba95
|
| 3 |
+
size 11024069
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:36.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1a53bb09c62acc9300cb6069fbf11ee52c9e549b518b90fc9f2469456bdd26ea
|
| 3 |
+
size 10103394
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:37.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:847edf4d677599b3deb6a234c3a8e62dc32aa067d2b06876f09b8f2bef3ac302
|
| 3 |
+
size 10504399
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:39.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f5e2ca66d9b700a02480552f19836452a0f53412e623eac707e5405e9f82b4c6
|
| 3 |
+
size 10813348
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:4.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:424c3d13a4d3a7e5f1d3f67f5800aaeb0a83a40a3201315b58c484320ba79fe9
|
| 3 |
+
size 11524209
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:40.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ef02c0af83e22c773843ae4219f07ba8436ab52a38a763e3c05bcb57addb32d0
|
| 3 |
+
size 9893212
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:42.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:12a5341f8ed0db6cb94b7b51b673894063a3af74b4fe9e2719b6493518d6b652
|
| 3 |
+
size 8225547
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:46.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:82706606ddc16a01d48948830a84feaee5e4eeb6a843d239610528b5c8092f27
|
| 3 |
+
size 6703011
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:5.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7ed8b875bdb54fe00d4cec0daf2fb80807f551cd7415b747cee301040f12290b
|
| 3 |
+
size 10353720
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:6.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:80785d4a856ce2ff33cd782a847a05141d9f2af4c1e95472c658904ca143c486
|
| 3 |
+
size 9599675
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:7.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9cd0271811f6bc3c3ad5652c16297188750810090a29300ab09a598e496e3d1c
|
| 3 |
+
size 10738487
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:80.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:68e1702db4f5377cd589722e8ab2b8525712d353237736ab8140c9fadd53399f
|
| 3 |
+
size 7950215
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-1:9.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:324d637e578ecdd96fd4365b575f701dc9e9c6ca04d33311662f47294e2ab08f
|
| 3 |
+
size 11333180
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:12.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:8ffc30ace3d8e5aa0b7fe4c2046712862f8647c1efe465fbe1ce51ef614ac253
|
| 3 |
+
size 5596267
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:126.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:330c0e7f070f7129d8f0c2ba3fce68a35e24ce2040b732abb4d31ac1863515eb
|
| 3 |
+
size 2643848
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:2.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:06448ccd9a6d9efd32a8ef5116e1af1ec239a58f36c8c6e126050db289df79c5
|
| 3 |
+
size 907208
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:32.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:651c2c5326c8594d9383274aaa6467201d6f167448c47d80dd7f7729ddb329c8
|
| 3 |
+
size 6750006
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:4.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ad96beeac8a15f4e955d1799297986a64cfa124027c4e3c272ac20323f8f3ac2
|
| 3 |
+
size 5805877
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:5.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b80d0692ffd893ee515a0ffb73ae22dc241aa83d9b875d7eb8f5e5b9f27fe527
|
| 3 |
+
size 6532641
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:63.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:89ffb9b635df50f27ccf4c07d8dde66854221cad2d35862402850d8a8468bc91
|
| 3 |
+
size 4510478
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:71.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e5b727dd8db717cd18385cfd7ba0d4c21cb08d37c698ad3c184ed32fb34be983
|
| 3 |
+
size 2630821
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-2:84.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4d23e6c01f7821f8adbe9ef774d3585b7a0fc8e7be4da217b330d28fd3a02a31
|
| 3 |
+
size 3647616
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-3:34.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:244b52efd7a6552876540e26dfb1971f2bb6c0aaa764b1d7a3eaa8286bcc7129
|
| 3 |
+
size 3779706
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-4:26.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b986dfcb32f5f2fb88179ce985511fa93a88e1c8e6755dee690f3ab8a2257833
|
| 3 |
+
size 3255900
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-4:29.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:85c09714cdb2225cc6158a73135fc7c24a34f12c863b40bc07e42589d1cb40a5
|
| 3 |
+
size 3596615
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-5:12.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a766eb7ed7146bd5ab1e783ba0450b601ce8eb0ddf3ef81bdc475eb1138631c3
|
| 3 |
+
size 1829229
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-5:2.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9243427b2285c6e2db53dc105ae6b88722376bc734a0e8825e779c97da61e012
|
| 3 |
+
size 1802961
|
data/imo-simple-gps-oss-120b-0908-lr-dynamic_20250914_141156/IMO-2025-5:6.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0395fe2d413f92e3b87d2cfbd87d6b79c600b190db467ad47b0a8ce3c294f4a7
|
| 3 |
+
size 2243962
|