Auto-sync: 2026-06-30 04:59:14
Browse files
dovla_cil/eval/maniskill_policy_rollout.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
from __future__ import annotations
|
| 2 |
|
|
|
|
| 3 |
import pickle
|
| 4 |
from collections import Counter, defaultdict
|
| 5 |
from dataclasses import dataclass, replace
|
|
@@ -101,6 +102,7 @@ def evaluate_maniskill_policy_rollout(
|
|
| 101 |
retrieval_residual_direction: str = "candidate_minus_anchor",
|
| 102 |
retrieval_residual_reduce: str = "none",
|
| 103 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
|
|
|
| 104 |
retrieval_residual_challenger_margin: float = 0.0,
|
| 105 |
lattice_exclude_types: tuple[str, ...] = (),
|
| 106 |
candidate_type_bonuses: dict[str, float] | None = None,
|
|
@@ -244,6 +246,9 @@ def evaluate_maniskill_policy_rollout(
|
|
| 244 |
for candidate_type in retrieval_residual_challenger_types
|
| 245 |
if candidate_type.strip()
|
| 246 |
)
|
|
|
|
|
|
|
|
|
|
| 247 |
candidate_type_bonuses = {
|
| 248 |
str(candidate_type): float(bonus)
|
| 249 |
for candidate_type, bonus in (candidate_type_bonuses or {}).items()
|
|
@@ -367,6 +372,9 @@ def evaluate_maniskill_policy_rollout(
|
|
| 367 |
retrieval_residual_challenger_types=(
|
| 368 |
retrieval_residual_challenger_types
|
| 369 |
),
|
|
|
|
|
|
|
|
|
|
| 370 |
retrieval_residual_challenger_margin=(
|
| 371 |
retrieval_residual_challenger_margin
|
| 372 |
),
|
|
@@ -490,6 +498,11 @@ def evaluate_maniskill_policy_rollout(
|
|
| 490 |
)
|
| 491 |
if selection_mode == "retrieval_residual"
|
| 492 |
else [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 493 |
"retrieval_residual_challenger_margin": (
|
| 494 |
retrieval_residual_challenger_margin
|
| 495 |
if selection_mode == "retrieval_residual"
|
|
@@ -1179,6 +1192,7 @@ def _evaluate_task_cases(
|
|
| 1179 |
retrieval_residual_reduce: str = "none",
|
| 1180 |
retrieval_residual_action_l2_penalty: float = 0.0,
|
| 1181 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
|
|
|
| 1182 |
retrieval_residual_challenger_margin: float = 0.0,
|
| 1183 |
lattice_exclude_types: tuple[str, ...] = (),
|
| 1184 |
candidate_type_bonuses: dict[str, float] | None = None,
|
|
@@ -1252,6 +1266,7 @@ def _evaluate_task_cases(
|
|
| 1252 |
retrieval_residual_scales=retrieval_residual_scales,
|
| 1253 |
retrieval_residual_reduce=retrieval_residual_reduce,
|
| 1254 |
retrieval_residual_action_l2_penalty=retrieval_residual_action_l2_penalty,
|
|
|
|
| 1255 |
action_low=action_low,
|
| 1256 |
action_high=action_high,
|
| 1257 |
action_candidates=(
|
|
@@ -1790,6 +1805,7 @@ def _select_action_chunk(
|
|
| 1790 |
retrieval_residual_scales: tuple[float, ...] = (),
|
| 1791 |
retrieval_residual_reduce: str = "none",
|
| 1792 |
retrieval_residual_action_l2_penalty: float = 0.0,
|
|
|
|
| 1793 |
action_low: Any | None = None,
|
| 1794 |
action_high: Any | None = None,
|
| 1795 |
action_candidates: Any | None = None,
|
|
@@ -1855,6 +1871,7 @@ def _select_action_chunk(
|
|
| 1855 |
selection_seed=selection_seed,
|
| 1856 |
selection_margin=selection_margin,
|
| 1857 |
residual_aggregate_mask=residual_aggregate_mask,
|
|
|
|
| 1858 |
challenger_mask=challenger_mask,
|
| 1859 |
challenger_margin=challenger_margin,
|
| 1860 |
)
|
|
@@ -2256,6 +2273,7 @@ def _select_residual_lattice_action_chunk(
|
|
| 2256 |
residual_reduce: str = "none",
|
| 2257 |
residual_aggregate_mask: Any | None = None,
|
| 2258 |
action_l2_penalty: float = 0.0,
|
|
|
|
| 2259 |
challenger_mask: Any | None = None,
|
| 2260 |
challenger_margin: float = 0.0,
|
| 2261 |
) -> tuple[Any, np.ndarray]:
|
|
@@ -2303,7 +2321,8 @@ def _select_residual_lattice_action_chunk(
|
|
| 2303 |
challenger_mask = _expand_residual_lattice_mask(
|
| 2304 |
challenger_mask,
|
| 2305 |
torch=torch,
|
| 2306 |
-
|
|
|
|
| 2307 |
num_gaussian_candidates=num_gaussian_candidates,
|
| 2308 |
candidate_sigma=candidate_sigma,
|
| 2309 |
)
|
|
@@ -2396,15 +2415,22 @@ def _expand_residual_lattice_mask(
|
|
| 2396 |
mask: Any | None,
|
| 2397 |
*,
|
| 2398 |
torch: Any,
|
| 2399 |
-
|
|
|
|
| 2400 |
num_gaussian_candidates: int,
|
| 2401 |
candidate_sigma: float,
|
| 2402 |
) -> Any | None:
|
| 2403 |
if mask is None:
|
| 2404 |
return None
|
| 2405 |
-
|
| 2406 |
-
if
|
| 2407 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2408 |
if num_gaussian_candidates > 1 and candidate_sigma > 0:
|
| 2409 |
extra = torch.zeros(
|
| 2410 |
expanded.shape[0],
|
|
@@ -2416,6 +2442,15 @@ def _expand_residual_lattice_mask(
|
|
| 2416 |
return expanded
|
| 2417 |
|
| 2418 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2419 |
def _align_residual_horizon_to_policy(policy_mean: Any, residuals: Any, *, torch: Any) -> Any:
|
| 2420 |
if residuals.ndim != 4:
|
| 2421 |
raise ValueError("residuals must have shape [B,K,H,D]")
|
|
|
|
| 1 |
from __future__ import annotations
|
| 2 |
|
| 3 |
+
import math
|
| 4 |
import pickle
|
| 5 |
from collections import Counter, defaultdict
|
| 6 |
from dataclasses import dataclass, replace
|
|
|
|
| 102 |
retrieval_residual_direction: str = "candidate_minus_anchor",
|
| 103 |
retrieval_residual_reduce: str = "none",
|
| 104 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
| 105 |
+
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 106 |
retrieval_residual_challenger_margin: float = 0.0,
|
| 107 |
lattice_exclude_types: tuple[str, ...] = (),
|
| 108 |
candidate_type_bonuses: dict[str, float] | None = None,
|
|
|
|
| 246 |
for candidate_type in retrieval_residual_challenger_types
|
| 247 |
if candidate_type.strip()
|
| 248 |
)
|
| 249 |
+
retrieval_residual_challenger_scales = tuple(
|
| 250 |
+
float(scale) for scale in retrieval_residual_challenger_scales
|
| 251 |
+
)
|
| 252 |
candidate_type_bonuses = {
|
| 253 |
str(candidate_type): float(bonus)
|
| 254 |
for candidate_type, bonus in (candidate_type_bonuses or {}).items()
|
|
|
|
| 372 |
retrieval_residual_challenger_types=(
|
| 373 |
retrieval_residual_challenger_types
|
| 374 |
),
|
| 375 |
+
retrieval_residual_challenger_scales=(
|
| 376 |
+
retrieval_residual_challenger_scales
|
| 377 |
+
),
|
| 378 |
retrieval_residual_challenger_margin=(
|
| 379 |
retrieval_residual_challenger_margin
|
| 380 |
),
|
|
|
|
| 498 |
)
|
| 499 |
if selection_mode == "retrieval_residual"
|
| 500 |
else [],
|
| 501 |
+
"retrieval_residual_challenger_scales": list(
|
| 502 |
+
retrieval_residual_challenger_scales
|
| 503 |
+
)
|
| 504 |
+
if selection_mode == "retrieval_residual"
|
| 505 |
+
else [],
|
| 506 |
"retrieval_residual_challenger_margin": (
|
| 507 |
retrieval_residual_challenger_margin
|
| 508 |
if selection_mode == "retrieval_residual"
|
|
|
|
| 1192 |
retrieval_residual_reduce: str = "none",
|
| 1193 |
retrieval_residual_action_l2_penalty: float = 0.0,
|
| 1194 |
retrieval_residual_challenger_types: tuple[str, ...] = (),
|
| 1195 |
+
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 1196 |
retrieval_residual_challenger_margin: float = 0.0,
|
| 1197 |
lattice_exclude_types: tuple[str, ...] = (),
|
| 1198 |
candidate_type_bonuses: dict[str, float] | None = None,
|
|
|
|
| 1266 |
retrieval_residual_scales=retrieval_residual_scales,
|
| 1267 |
retrieval_residual_reduce=retrieval_residual_reduce,
|
| 1268 |
retrieval_residual_action_l2_penalty=retrieval_residual_action_l2_penalty,
|
| 1269 |
+
retrieval_residual_challenger_scales=retrieval_residual_challenger_scales,
|
| 1270 |
action_low=action_low,
|
| 1271 |
action_high=action_high,
|
| 1272 |
action_candidates=(
|
|
|
|
| 1805 |
retrieval_residual_scales: tuple[float, ...] = (),
|
| 1806 |
retrieval_residual_reduce: str = "none",
|
| 1807 |
retrieval_residual_action_l2_penalty: float = 0.0,
|
| 1808 |
+
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 1809 |
action_low: Any | None = None,
|
| 1810 |
action_high: Any | None = None,
|
| 1811 |
action_candidates: Any | None = None,
|
|
|
|
| 1871 |
selection_seed=selection_seed,
|
| 1872 |
selection_margin=selection_margin,
|
| 1873 |
residual_aggregate_mask=residual_aggregate_mask,
|
| 1874 |
+
retrieval_residual_challenger_scales=retrieval_residual_challenger_scales,
|
| 1875 |
challenger_mask=challenger_mask,
|
| 1876 |
challenger_margin=challenger_margin,
|
| 1877 |
)
|
|
|
|
| 2273 |
residual_reduce: str = "none",
|
| 2274 |
residual_aggregate_mask: Any | None = None,
|
| 2275 |
action_l2_penalty: float = 0.0,
|
| 2276 |
+
retrieval_residual_challenger_scales: tuple[float, ...] = (),
|
| 2277 |
challenger_mask: Any | None = None,
|
| 2278 |
challenger_margin: float = 0.0,
|
| 2279 |
) -> tuple[Any, np.ndarray]:
|
|
|
|
| 2321 |
challenger_mask = _expand_residual_lattice_mask(
|
| 2322 |
challenger_mask,
|
| 2323 |
torch=torch,
|
| 2324 |
+
scales=scales,
|
| 2325 |
+
include_scales=retrieval_residual_challenger_scales,
|
| 2326 |
num_gaussian_candidates=num_gaussian_candidates,
|
| 2327 |
candidate_sigma=candidate_sigma,
|
| 2328 |
)
|
|
|
|
| 2415 |
mask: Any | None,
|
| 2416 |
*,
|
| 2417 |
torch: Any,
|
| 2418 |
+
scales: tuple[float, ...],
|
| 2419 |
+
include_scales: tuple[float, ...] = (),
|
| 2420 |
num_gaussian_candidates: int,
|
| 2421 |
candidate_sigma: float,
|
| 2422 |
) -> Any | None:
|
| 2423 |
if mask is None:
|
| 2424 |
return None
|
| 2425 |
+
scale_values = tuple(float(scale) for scale in scales)
|
| 2426 |
+
if not scale_values:
|
| 2427 |
+
raise ValueError("scales must not be empty")
|
| 2428 |
+
allowed_scales = tuple(float(scale) for scale in include_scales)
|
| 2429 |
+
blocks = [
|
| 2430 |
+
mask if _scale_is_allowed(scale, allowed_scales) else torch.zeros_like(mask)
|
| 2431 |
+
for scale in scale_values
|
| 2432 |
+
]
|
| 2433 |
+
expanded = torch.cat(blocks, dim=1) if len(blocks) > 1 else blocks[0]
|
| 2434 |
if num_gaussian_candidates > 1 and candidate_sigma > 0:
|
| 2435 |
extra = torch.zeros(
|
| 2436 |
expanded.shape[0],
|
|
|
|
| 2442 |
return expanded
|
| 2443 |
|
| 2444 |
|
| 2445 |
+
def _scale_is_allowed(scale: float, allowed_scales: tuple[float, ...]) -> bool:
|
| 2446 |
+
if not allowed_scales:
|
| 2447 |
+
return True
|
| 2448 |
+
return any(
|
| 2449 |
+
math.isclose(float(scale), float(allowed), rel_tol=1.0e-6, abs_tol=1.0e-6)
|
| 2450 |
+
for allowed in allowed_scales
|
| 2451 |
+
)
|
| 2452 |
+
|
| 2453 |
+
|
| 2454 |
def _align_residual_horizon_to_policy(policy_mean: Any, residuals: Any, *, torch: Any) -> Any:
|
| 2455 |
if residuals.ndim != 4:
|
| 2456 |
raise ValueError("residuals must have shape [B,K,H,D]")
|