anhtld commited on
Commit
284a549
·
verified ·
1 Parent(s): ce20b52

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 + float(challenger_margin)
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.