Auto-sync: 2026-06-30 20:06:30
Browse files
dovla_cil/eval/maniskill_policy_rollout.py
CHANGED
|
@@ -105,6 +105,7 @@ def evaluate_maniskill_policy_rollout(
|
|
| 105 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
| 106 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 107 |
retrieval_residual_challenger_margin: float = 0.0,
|
|
|
|
| 108 |
retrieval_residual_challenger_tasks: tuple[str, ...] = (),
|
| 109 |
retrieval_residual_challenger_type_tasks: dict[str, tuple[str, ...]] | None = None,
|
| 110 |
lattice_exclude_types: tuple[str, ...] = (),
|
|
@@ -272,6 +273,15 @@ def evaluate_maniskill_policy_rollout(
|
|
| 272 |
).items()
|
| 273 |
if candidate_type.strip()
|
| 274 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 275 |
retrieval_residual_challenger_scales = tuple(
|
| 276 |
float(scale) for scale in retrieval_residual_challenger_scales
|
| 277 |
)
|
|
@@ -428,6 +438,9 @@ def evaluate_maniskill_policy_rollout(
|
|
| 428 |
retrieval_residual_challenger_margin=(
|
| 429 |
retrieval_residual_challenger_margin
|
| 430 |
),
|
|
|
|
|
|
|
|
|
|
| 431 |
retrieval_residual_challenger_tasks=(
|
| 432 |
retrieval_residual_challenger_tasks
|
| 433 |
),
|
|
@@ -576,6 +589,11 @@ def evaluate_maniskill_policy_rollout(
|
|
| 576 |
if selection_mode == "retrieval_residual"
|
| 577 |
else 0.0
|
| 578 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 579 |
"retrieval_residual_challenger_tasks": list(
|
| 580 |
retrieval_residual_challenger_tasks
|
| 581 |
)
|
|
@@ -1278,6 +1296,7 @@ def _evaluate_task_cases(
|
|
| 1278 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
| 1279 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 1280 |
retrieval_residual_challenger_margin: float = 0.0,
|
|
|
|
| 1281 |
retrieval_residual_challenger_tasks: tuple[str, ...] = (),
|
| 1282 |
retrieval_residual_challenger_type_tasks: dict[str, tuple[str, ...]] | None = None,
|
| 1283 |
lattice_exclude_types: tuple[str, ...] = (),
|
|
@@ -1360,6 +1379,21 @@ def _evaluate_task_cases(
|
|
| 1360 |
retrieval_residual_reduce=retrieval_residual_reduce,
|
| 1361 |
retrieval_residual_action_l2_penalty=retrieval_residual_action_l2_penalty,
|
| 1362 |
retrieval_residual_challenger_scales=retrieval_residual_challenger_scales,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1363 |
action_low=action_low,
|
| 1364 |
action_high=action_high,
|
| 1365 |
action_candidates=(
|
|
@@ -1914,6 +1948,7 @@ def _select_action_chunk(
|
|
| 1914 |
retrieval_residual_reduce: str = "none",
|
| 1915 |
retrieval_residual_action_l2_penalty: float = 0.0,
|
| 1916 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
|
|
|
| 1917 |
action_low: Any | None = None,
|
| 1918 |
action_high: Any | None = None,
|
| 1919 |
action_candidates: Any | None = None,
|
|
@@ -2010,6 +2045,9 @@ def _select_action_chunk(
|
|
| 2010 |
retrieval_residual_challenger_scales=retrieval_residual_challenger_scales,
|
| 2011 |
challenger_mask=challenger_mask,
|
| 2012 |
challenger_margin=challenger_margin,
|
|
|
|
|
|
|
|
|
|
| 2013 |
)
|
| 2014 |
|
| 2015 |
if selection_mode == "policy" or num_candidates <= 1:
|
|
@@ -2256,6 +2294,7 @@ def _select_lattice_action_chunk(
|
|
| 2256 |
action_l2_penalty_base: Any | None = None,
|
| 2257 |
challenger_mask: Any | None = None,
|
| 2258 |
challenger_margin: float = 0.0,
|
|
|
|
| 2259 |
) -> tuple[Any, np.ndarray]:
|
| 2260 |
if action_candidates.ndim != 4:
|
| 2261 |
raise ValueError("action_candidates must have shape [B,K,H,D]")
|
|
@@ -2309,6 +2348,11 @@ def _select_lattice_action_chunk(
|
|
| 2309 |
raise ValueError("challenger_mask must have shape [B,K]")
|
| 2310 |
if challenger_margin < 0:
|
| 2311 |
raise ValueError("challenger_margin must be non-negative")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2312 |
challenger_potentials = potentials.masked_fill(~challenger_mask, float("-inf"))
|
| 2313 |
challenger_index = torch.argmax(challenger_potentials, dim=1)
|
| 2314 |
challenger_best = challenger_potentials.gather(
|
|
@@ -2319,8 +2363,18 @@ def _select_lattice_action_chunk(
|
|
| 2319 |
1,
|
| 2320 |
best_index.reshape(batch_size, 1),
|
| 2321 |
).reshape(batch_size)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2322 |
use_challenger = torch.isfinite(challenger_best) & (
|
| 2323 |
-
challenger_best > primary_potential +
|
| 2324 |
)
|
| 2325 |
best_index = torch.where(use_challenger, challenger_index, best_index)
|
| 2326 |
batch_index = torch.arange(batch_size, device=candidates.device)
|
|
@@ -2412,6 +2466,7 @@ def _select_residual_lattice_action_chunk(
|
|
| 2412 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 2413 |
challenger_mask: Any | None = None,
|
| 2414 |
challenger_margin: float = 0.0,
|
|
|
|
| 2415 |
) -> tuple[Any, np.ndarray]:
|
| 2416 |
if action_residuals.ndim != 4:
|
| 2417 |
raise ValueError("action_residuals must have shape [B,K,H,D]")
|
|
@@ -2462,6 +2517,14 @@ def _select_residual_lattice_action_chunk(
|
|
| 2462 |
num_gaussian_candidates=num_gaussian_candidates,
|
| 2463 |
candidate_sigma=candidate_sigma,
|
| 2464 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2465 |
return _select_lattice_action_chunk(
|
| 2466 |
model,
|
| 2467 |
observations,
|
|
@@ -2485,6 +2548,7 @@ def _select_residual_lattice_action_chunk(
|
|
| 2485 |
action_l2_penalty_base=policy_mean,
|
| 2486 |
challenger_mask=challenger_mask,
|
| 2487 |
challenger_margin=challenger_margin,
|
|
|
|
| 2488 |
)
|
| 2489 |
|
| 2490 |
|
|
@@ -2578,6 +2642,33 @@ def _expand_residual_lattice_mask(
|
|
| 2578 |
return expanded
|
| 2579 |
|
| 2580 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2581 |
def _scale_is_allowed(scale: float, allowed_scales: tuple[float, ...]) -> bool:
|
| 2582 |
if not allowed_scales:
|
| 2583 |
return True
|
|
@@ -2978,6 +3069,25 @@ def _lattice_candidate_type_bonus(
|
|
| 2978 |
return torch.tensor(rows, dtype=torch.float32, device=device)
|
| 2979 |
|
| 2980 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2981 |
def _candidate_type_bonus_for_type(
|
| 2982 |
candidate_type: str,
|
| 2983 |
candidate_type_bonuses: dict[str, float],
|
|
|
|
| 105 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
| 106 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 107 |
retrieval_residual_challenger_margin: float = 0.0,
|
| 108 |
+
retrieval_residual_challenger_type_margins: dict[str, float] | None = None,
|
| 109 |
retrieval_residual_challenger_tasks: tuple[str, ...] = (),
|
| 110 |
retrieval_residual_challenger_type_tasks: dict[str, tuple[str, ...]] | None = None,
|
| 111 |
lattice_exclude_types: tuple[str, ...] = (),
|
|
|
|
| 273 |
).items()
|
| 274 |
if candidate_type.strip()
|
| 275 |
}
|
| 276 |
+
retrieval_residual_challenger_type_margins = {
|
| 277 |
+
_normalize_residual_candidate_type_name(candidate_type): float(margin)
|
| 278 |
+
for candidate_type, margin in (
|
| 279 |
+
retrieval_residual_challenger_type_margins or {}
|
| 280 |
+
).items()
|
| 281 |
+
if candidate_type.strip()
|
| 282 |
+
}
|
| 283 |
+
if any(margin < 0 for margin in retrieval_residual_challenger_type_margins.values()):
|
| 284 |
+
raise ValueError("retrieval_residual_challenger_type_margins must be non-negative")
|
| 285 |
retrieval_residual_challenger_scales = tuple(
|
| 286 |
float(scale) for scale in retrieval_residual_challenger_scales
|
| 287 |
)
|
|
|
|
| 438 |
retrieval_residual_challenger_margin=(
|
| 439 |
retrieval_residual_challenger_margin
|
| 440 |
),
|
| 441 |
+
retrieval_residual_challenger_type_margins=(
|
| 442 |
+
retrieval_residual_challenger_type_margins
|
| 443 |
+
),
|
| 444 |
retrieval_residual_challenger_tasks=(
|
| 445 |
retrieval_residual_challenger_tasks
|
| 446 |
),
|
|
|
|
| 589 |
if selection_mode == "retrieval_residual"
|
| 590 |
else 0.0
|
| 591 |
),
|
| 592 |
+
"retrieval_residual_challenger_type_margins": (
|
| 593 |
+
retrieval_residual_challenger_type_margins
|
| 594 |
+
if selection_mode == "retrieval_residual"
|
| 595 |
+
else {}
|
| 596 |
+
),
|
| 597 |
"retrieval_residual_challenger_tasks": list(
|
| 598 |
retrieval_residual_challenger_tasks
|
| 599 |
)
|
|
|
|
| 1296 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
| 1297 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 1298 |
retrieval_residual_challenger_margin: float = 0.0,
|
| 1299 |
+
retrieval_residual_challenger_type_margins: dict[str, float] | None = None,
|
| 1300 |
retrieval_residual_challenger_tasks: tuple[str, ...] = (),
|
| 1301 |
retrieval_residual_challenger_type_tasks: dict[str, tuple[str, ...]] | None = None,
|
| 1302 |
lattice_exclude_types: tuple[str, ...] = (),
|
|
|
|
| 1379 |
retrieval_residual_reduce=retrieval_residual_reduce,
|
| 1380 |
retrieval_residual_action_l2_penalty=retrieval_residual_action_l2_penalty,
|
| 1381 |
retrieval_residual_challenger_scales=retrieval_residual_challenger_scales,
|
| 1382 |
+
retrieval_residual_challenger_margin_by_candidate=(
|
| 1383 |
+
_lattice_candidate_type_margin(
|
| 1384 |
+
batch,
|
| 1385 |
+
torch=torch,
|
| 1386 |
+
device=device,
|
| 1387 |
+
default_margin=retrieval_residual_challenger_margin,
|
| 1388 |
+
candidate_type_margins=(
|
| 1389 |
+
retrieval_residual_challenger_type_margins or {}
|
| 1390 |
+
),
|
| 1391 |
+
)
|
| 1392 |
+
if selection_mode == "retrieval_residual"
|
| 1393 |
+
and retrieval_residual_challenger_types
|
| 1394 |
+
and retrieval_residual_challenger_type_margins
|
| 1395 |
+
else None
|
| 1396 |
+
),
|
| 1397 |
action_low=action_low,
|
| 1398 |
action_high=action_high,
|
| 1399 |
action_candidates=(
|
|
|
|
| 1948 |
retrieval_residual_reduce: str = "none",
|
| 1949 |
retrieval_residual_action_l2_penalty: float = 0.0,
|
| 1950 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 1951 |
+
retrieval_residual_challenger_margin_by_candidate: Any | None = None,
|
| 1952 |
action_low: Any | None = None,
|
| 1953 |
action_high: Any | None = None,
|
| 1954 |
action_candidates: Any | None = None,
|
|
|
|
| 2045 |
retrieval_residual_challenger_scales=retrieval_residual_challenger_scales,
|
| 2046 |
challenger_mask=challenger_mask,
|
| 2047 |
challenger_margin=challenger_margin,
|
| 2048 |
+
challenger_margin_by_candidate=(
|
| 2049 |
+
retrieval_residual_challenger_margin_by_candidate
|
| 2050 |
+
),
|
| 2051 |
)
|
| 2052 |
|
| 2053 |
if selection_mode == "policy" or num_candidates <= 1:
|
|
|
|
| 2294 |
action_l2_penalty_base: Any | None = None,
|
| 2295 |
challenger_mask: Any | None = None,
|
| 2296 |
challenger_margin: float = 0.0,
|
| 2297 |
+
challenger_margin_by_candidate: Any | None = None,
|
| 2298 |
) -> tuple[Any, np.ndarray]:
|
| 2299 |
if action_candidates.ndim != 4:
|
| 2300 |
raise ValueError("action_candidates must have shape [B,K,H,D]")
|
|
|
|
| 2348 |
raise ValueError("challenger_mask must have shape [B,K]")
|
| 2349 |
if challenger_margin < 0:
|
| 2350 |
raise ValueError("challenger_margin must be non-negative")
|
| 2351 |
+
if challenger_margin_by_candidate is not None:
|
| 2352 |
+
if challenger_margin_by_candidate.shape != potentials.shape:
|
| 2353 |
+
raise ValueError("challenger_margin_by_candidate must have shape [B,K]")
|
| 2354 |
+
if torch.any(challenger_margin_by_candidate < 0):
|
| 2355 |
+
raise ValueError("challenger_margin_by_candidate must be non-negative")
|
| 2356 |
challenger_potentials = potentials.masked_fill(~challenger_mask, float("-inf"))
|
| 2357 |
challenger_index = torch.argmax(challenger_potentials, dim=1)
|
| 2358 |
challenger_best = challenger_potentials.gather(
|
|
|
|
| 2363 |
1,
|
| 2364 |
best_index.reshape(batch_size, 1),
|
| 2365 |
).reshape(batch_size)
|
| 2366 |
+
if challenger_margin_by_candidate is None:
|
| 2367 |
+
challenger_margin_threshold = torch.full_like(
|
| 2368 |
+
challenger_best,
|
| 2369 |
+
float(challenger_margin),
|
| 2370 |
+
)
|
| 2371 |
+
else:
|
| 2372 |
+
challenger_margin_threshold = challenger_margin_by_candidate.to(
|
| 2373 |
+
device=potentials.device,
|
| 2374 |
+
dtype=potentials.dtype,
|
| 2375 |
+
).gather(1, challenger_index.reshape(batch_size, 1)).reshape(batch_size)
|
| 2376 |
use_challenger = torch.isfinite(challenger_best) & (
|
| 2377 |
+
challenger_best > primary_potential + challenger_margin_threshold
|
| 2378 |
)
|
| 2379 |
best_index = torch.where(use_challenger, challenger_index, best_index)
|
| 2380 |
batch_index = torch.arange(batch_size, device=candidates.device)
|
|
|
|
| 2466 |
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 2467 |
challenger_mask: Any | None = None,
|
| 2468 |
challenger_margin: float = 0.0,
|
| 2469 |
+
challenger_margin_by_candidate: Any | None = None,
|
| 2470 |
) -> tuple[Any, np.ndarray]:
|
| 2471 |
if action_residuals.ndim != 4:
|
| 2472 |
raise ValueError("action_residuals must have shape [B,K,H,D]")
|
|
|
|
| 2517 |
num_gaussian_candidates=num_gaussian_candidates,
|
| 2518 |
candidate_sigma=candidate_sigma,
|
| 2519 |
)
|
| 2520 |
+
challenger_margin_by_candidate = _expand_residual_lattice_values(
|
| 2521 |
+
challenger_margin_by_candidate,
|
| 2522 |
+
torch=torch,
|
| 2523 |
+
scales=scales,
|
| 2524 |
+
fill_value=float(challenger_margin),
|
| 2525 |
+
num_gaussian_candidates=num_gaussian_candidates,
|
| 2526 |
+
candidate_sigma=candidate_sigma,
|
| 2527 |
+
)
|
| 2528 |
return _select_lattice_action_chunk(
|
| 2529 |
model,
|
| 2530 |
observations,
|
|
|
|
| 2548 |
action_l2_penalty_base=policy_mean,
|
| 2549 |
challenger_mask=challenger_mask,
|
| 2550 |
challenger_margin=challenger_margin,
|
| 2551 |
+
challenger_margin_by_candidate=challenger_margin_by_candidate,
|
| 2552 |
)
|
| 2553 |
|
| 2554 |
|
|
|
|
| 2642 |
return expanded
|
| 2643 |
|
| 2644 |
|
| 2645 |
+
def _expand_residual_lattice_values(
|
| 2646 |
+
values: Any | None,
|
| 2647 |
+
*,
|
| 2648 |
+
torch: Any,
|
| 2649 |
+
scales: tuple[float, ...],
|
| 2650 |
+
fill_value: float,
|
| 2651 |
+
num_gaussian_candidates: int,
|
| 2652 |
+
candidate_sigma: float,
|
| 2653 |
+
) -> Any | None:
|
| 2654 |
+
if values is None:
|
| 2655 |
+
return None
|
| 2656 |
+
scale_values = tuple(float(scale) for scale in scales)
|
| 2657 |
+
if not scale_values:
|
| 2658 |
+
raise ValueError("scales must not be empty")
|
| 2659 |
+
blocks = [values for _ in scale_values]
|
| 2660 |
+
expanded = torch.cat(blocks, dim=1) if len(blocks) > 1 else blocks[0]
|
| 2661 |
+
if num_gaussian_candidates > 1 and candidate_sigma > 0:
|
| 2662 |
+
extra = torch.full(
|
| 2663 |
+
(expanded.shape[0], num_gaussian_candidates - 1),
|
| 2664 |
+
float(fill_value),
|
| 2665 |
+
dtype=expanded.dtype,
|
| 2666 |
+
device=expanded.device,
|
| 2667 |
+
)
|
| 2668 |
+
expanded = torch.cat([expanded, extra], dim=1)
|
| 2669 |
+
return expanded
|
| 2670 |
+
|
| 2671 |
+
|
| 2672 |
def _scale_is_allowed(scale: float, allowed_scales: tuple[float, ...]) -> bool:
|
| 2673 |
if not allowed_scales:
|
| 2674 |
return True
|
|
|
|
| 3069 |
return torch.tensor(rows, dtype=torch.float32, device=device)
|
| 3070 |
|
| 3071 |
|
| 3072 |
+
def _lattice_candidate_type_margin(
|
| 3073 |
+
batch: list[_RolloutCase],
|
| 3074 |
+
*,
|
| 3075 |
+
torch: Any,
|
| 3076 |
+
device: str,
|
| 3077 |
+
default_margin: float,
|
| 3078 |
+
candidate_type_margins: dict[str, float],
|
| 3079 |
+
) -> Any:
|
| 3080 |
+
rows: list[list[float]] = []
|
| 3081 |
+
for case in batch:
|
| 3082 |
+
rows.append(
|
| 3083 |
+
[
|
| 3084 |
+
float(candidate_type_margins.get(candidate_type, default_margin))
|
| 3085 |
+
for candidate_type in case.candidate_types
|
| 3086 |
+
]
|
| 3087 |
+
)
|
| 3088 |
+
return torch.tensor(rows, dtype=torch.float32, device=device)
|
| 3089 |
+
|
| 3090 |
+
|
| 3091 |
def _candidate_type_bonus_for_type(
|
| 3092 |
candidate_type: str,
|
| 3093 |
candidate_type_bonuses: dict[str, float],
|
logs/auto_sync_hf.log
CHANGED
|
@@ -278,3 +278,4 @@ No files have been modified since last commit. Skipping to prevent empty commit.
|
|
| 278 |
No files have been modified since last commit. Skipping to prevent empty commit.
|
| 279 |
No files have been modified since last commit. Skipping to prevent empty commit.
|
| 280 |
No files have been modified since last commit. Skipping to prevent empty commit.
|
|
|
|
|
|
| 278 |
No files have been modified since last commit. Skipping to prevent empty commit.
|
| 279 |
No files have been modified since last commit. Skipping to prevent empty commit.
|
| 280 |
No files have been modified since last commit. Skipping to prevent empty commit.
|
| 281 |
+
No files have been modified since last commit. Skipping to prevent empty commit.
|