Add brains/sovereign-v3/data_adapters.py
Browse files
brains/sovereign-v3/data_adapters.py
CHANGED
|
@@ -268,6 +268,8 @@ def build_sequences(lens: Sequence[int], T: int = 8,
|
|
| 268 |
@dataclass
|
| 269 |
class PreppedShard:
|
| 270 |
rgb: np.ndarray # (N,3,256,256) float32 in [0,1]
|
|
|
|
|
|
|
| 271 |
nums: np.ndarray # (N,8)
|
| 272 |
rtg: np.ndarray # (N,1) z-scored return conditioning
|
| 273 |
rtg_next: np.ndarray # (N,1)
|
|
@@ -349,8 +351,17 @@ class ShardPrepper:
|
|
| 349 |
if not keep.any():
|
| 350 |
return None
|
| 351 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 352 |
return PreppedShard(
|
| 353 |
-
rgb=rgb_f[keep],
|
|
|
|
| 354 |
rtg_next=rtg_next[keep], nums_next=nums_next[keep],
|
| 355 |
kind=kind[keep], cell=cell[keep], pct=pct[keep], ret=ret[keep],
|
| 356 |
w=w[keep], win_lab=win_lab[keep], lab64=lab64[keep],
|
|
@@ -366,6 +377,8 @@ class StageADataset(Dataset):
|
|
| 366 |
def cat(key):
|
| 367 |
return np.concatenate([getattr(p, key) for p in prepped])
|
| 368 |
self.rgb = cat("rgb")
|
|
|
|
|
|
|
| 369 |
self.nums = cat("nums")
|
| 370 |
self.rtg = cat("rtg")
|
| 371 |
self.rtg_next = cat("rtg_next")
|
|
@@ -389,7 +402,9 @@ class StageADataset(Dataset):
|
|
| 389 |
def __getitem__(self, i: int) -> dict:
|
| 390 |
t = torch.from_numpy
|
| 391 |
return dict(
|
| 392 |
-
rgb=t(self.rgb[i]),
|
|
|
|
|
|
|
| 393 |
rtg_next=t(self.rtg_next[i]), nums_next=t(self.nums_next[i]),
|
| 394 |
kind=torch.tensor(self.kind[i]), cell=torch.tensor(self.cell[i]),
|
| 395 |
pct=torch.tensor(self.pct[i]), ret=torch.tensor(self.ret[i]),
|
|
|
|
| 268 |
@dataclass
|
| 269 |
class PreppedShard:
|
| 270 |
rgb: np.ndarray # (N,3,256,256) float32 in [0,1]
|
| 271 |
+
rgb_next: np.ndarray # (N,3,256,256) consecutive frame — dynamics
|
| 272 |
+
reward: np.ndarray # (N,) farmer reward — dynamics reward target
|
| 273 |
nums: np.ndarray # (N,8)
|
| 274 |
rtg: np.ndarray # (N,1) z-scored return conditioning
|
| 275 |
rtg_next: np.ndarray # (N,1)
|
|
|
|
| 351 |
if not keep.any():
|
| 352 |
return None
|
| 353 |
|
| 354 |
+
# consecutive-frame dynamics targets (last frame of each episode
|
| 355 |
+
# repeats itself — no cross-episode leakage)
|
| 356 |
+
rgb_next = rgb_f.copy()
|
| 357 |
+
for e in range(len(lens)):
|
| 358 |
+
s, t = bounds[e], bounds[e + 1]
|
| 359 |
+
if t > s:
|
| 360 |
+
rgb_next[s:t - 1] = rgb_f[s + 1:t]
|
| 361 |
+
|
| 362 |
return PreppedShard(
|
| 363 |
+
rgb=rgb_f[keep], rgb_next=rgb_next[keep], reward=reward[keep],
|
| 364 |
+
nums=nums[keep], rtg=rtg[keep],
|
| 365 |
rtg_next=rtg_next[keep], nums_next=nums_next[keep],
|
| 366 |
kind=kind[keep], cell=cell[keep], pct=pct[keep], ret=ret[keep],
|
| 367 |
w=w[keep], win_lab=win_lab[keep], lab64=lab64[keep],
|
|
|
|
| 377 |
def cat(key):
|
| 378 |
return np.concatenate([getattr(p, key) for p in prepped])
|
| 379 |
self.rgb = cat("rgb")
|
| 380 |
+
self.rgb_next = cat("rgb_next")
|
| 381 |
+
self.reward = cat("reward")
|
| 382 |
self.nums = cat("nums")
|
| 383 |
self.rtg = cat("rtg")
|
| 384 |
self.rtg_next = cat("rtg_next")
|
|
|
|
| 402 |
def __getitem__(self, i: int) -> dict:
|
| 403 |
t = torch.from_numpy
|
| 404 |
return dict(
|
| 405 |
+
rgb=t(self.rgb[i]), rgb_next=t(self.rgb_next[i]),
|
| 406 |
+
reward=t(self.reward[i]), nums=t(self.nums[i]),
|
| 407 |
+
rtg=t(self.rtg[i]),
|
| 408 |
rtg_next=t(self.rtg_next[i]), nums_next=t(self.nums_next[i]),
|
| 409 |
kind=torch.tensor(self.kind[i]), cell=torch.tensor(self.cell[i]),
|
| 410 |
pct=torch.tensor(self.pct[i]), ret=torch.tensor(self.ret[i]),
|