anhtld commited on
Commit
7696225
·
verified ·
1 Parent(s): e849501

auto-sync 2026-07-02T15:44:03Z workspace

Browse files
workspace/dovla_cil/eval/maniskill_policy_rollout.py CHANGED
@@ -138,6 +138,7 @@ def evaluate_maniskill_policy_rollout(
138
  candidate_type_bonuses_by_task: dict[str, dict[str, float]] | None = None,
139
  candidate_type_bonus_components: bool = False,
140
  field_rank_biases_by_task: dict[str, list[float]] | None = None,
 
141
  candidate_oracle_rollouts: int = 0,
142
  candidate_oracle_unique_tolerance: float = 1.0e-6,
143
  ) -> dict[str, Any]:
@@ -338,6 +339,10 @@ def evaluate_maniskill_policy_rollout(
338
  str(task_id): [float(value) for value in values]
339
  for task_id, values in (field_rank_biases_by_task or {}).items()
340
  }
 
 
 
 
341
  if selection_mode == "policy":
342
  num_candidates = 1
343
  lattice_exclude_types = tuple(
@@ -461,6 +466,10 @@ def evaluate_maniskill_policy_rollout(
461
  candidate_type_bonuses_by_task,
462
  task_id=task_id,
463
  )
 
 
 
 
464
  task_rows = _evaluate_task_cases(
465
  task_id,
466
  task_cases,
@@ -509,6 +518,7 @@ def evaluate_maniskill_policy_rollout(
509
  lattice_exclude_type_tasks=lattice_exclude_type_tasks,
510
  candidate_type_bonuses=task_candidate_type_bonuses,
511
  candidate_type_bonus_components=candidate_type_bonus_components,
 
512
  field_rank_biases=(
513
  field_rank_biases_by_task.get(task_id)
514
  or field_rank_biases_by_task.get("*")
@@ -681,6 +691,7 @@ def evaluate_maniskill_policy_rollout(
681
  "candidate_type_bonuses_by_task": candidate_type_bonuses_by_task,
682
  "candidate_type_bonus_components": bool(candidate_type_bonus_components),
683
  "field_rank_biases_by_task": field_rank_biases_by_task,
 
684
  "candidate_oracle_rollouts": int(candidate_oracle_rollouts),
685
  "candidate_oracle_unique_tolerance": float(candidate_oracle_unique_tolerance),
686
  "policy_rollout_success_rate": _mean([row["success"] for row in rows]),
@@ -1403,6 +1414,7 @@ def _evaluate_task_cases(
1403
  lattice_exclude_type_tasks: dict[str, tuple[str, ...]] | None = None,
1404
  candidate_type_bonuses: dict[str, float] | None = None,
1405
  candidate_type_bonus_components: bool = False,
 
1406
  field_rank_biases: list[float] | None = None,
1407
  candidate_oracle_rollouts: int = 0,
1408
  candidate_oracle_unique_tolerance: float = 1.0e-6,
@@ -1534,6 +1546,7 @@ def _evaluate_task_cases(
1534
  )
1535
  else None
1536
  ),
 
1537
  field_rank_bias=(
1538
  torch.tensor(field_rank_biases, dtype=torch.float32, device=device)
1539
  if field_rank_biases
@@ -1613,6 +1626,7 @@ def _evaluate_task_cases(
1613
  lattice_exclude_types=task_lattice_exclude_types,
1614
  candidate_type_bonuses=candidate_type_bonuses or {},
1615
  candidate_type_bonus_components=candidate_type_bonus_components,
 
1616
  candidate_oracle_unique_tolerance=candidate_oracle_unique_tolerance,
1617
  )
1618
  for index, case in enumerate(batch):
@@ -2060,6 +2074,7 @@ def _select_action_chunk(
2060
  action_candidates: Any | None = None,
2061
  candidate_mask: Any | None = None,
2062
  candidate_type_bonus: Any | None = None,
 
2063
  field_rank_bias: Any | None = None,
2064
  residual_aggregate_mask: Any | None = None,
2065
  challenger_mask: Any | None = None,
@@ -2609,6 +2624,8 @@ def _select_residual_lattice_action_chunk(
2609
  )
2610
  scales = tuple(float(scale) for scale in residual_scales) or (float(residual_scale),)
2611
  if residual_reduce == "field_softmax":
 
 
2612
  if challenger_mask is not None:
2613
  raise ValueError("challenger_mask is not supported with field_softmax")
2614
  return _select_field_softmax_residual_action_chunk(
@@ -2639,6 +2656,7 @@ def _select_residual_lattice_action_chunk(
2639
  residual_scales=residual_scales,
2640
  candidate_mask=candidate_mask,
2641
  candidate_type_bonus=candidate_type_bonus,
 
2642
  num_gaussian_candidates=num_gaussian_candidates,
2643
  candidate_sigma=candidate_sigma,
2644
  selection_seed=selection_seed,
@@ -2696,6 +2714,7 @@ def _build_residual_lattice_candidates(
2696
  residual_scales: tuple[float, ...],
2697
  candidate_mask: Any | None,
2698
  candidate_type_bonus: Any | None,
 
2699
  num_gaussian_candidates: int,
2700
  candidate_sigma: float,
2701
  selection_seed: int,
@@ -2711,6 +2730,29 @@ def _build_residual_lattice_candidates(
2711
  candidate_mask = torch.cat([candidate_mask for _ in scales], dim=1)
2712
  if candidate_type_bonus is not None and len(scales) > 1:
2713
  candidate_type_bonus = torch.cat([candidate_type_bonus for _ in scales], dim=1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2714
  if num_gaussian_candidates > 1 and candidate_sigma > 0:
2715
  generator = torch.Generator(device=policy_mean.device)
2716
  generator.manual_seed(int(selection_seed))
@@ -3193,6 +3235,16 @@ def _task_candidate_type_bonuses(
3193
  return bonuses
3194
 
3195
 
 
 
 
 
 
 
 
 
 
 
3196
  def _lattice_candidate_type_bonus(
3197
  batch: list[_RolloutCase],
3198
  *,
 
138
  candidate_type_bonuses_by_task: dict[str, dict[str, float]] | None = None,
139
  candidate_type_bonus_components: bool = False,
140
  field_rank_biases_by_task: dict[str, list[float]] | None = None,
141
+ residual_scale_bonuses_by_task: dict[str, dict[str, float]] | None = None,
142
  candidate_oracle_rollouts: int = 0,
143
  candidate_oracle_unique_tolerance: float = 1.0e-6,
144
  ) -> dict[str, Any]:
 
339
  str(task_id): [float(value) for value in values]
340
  for task_id, values in (field_rank_biases_by_task or {}).items()
341
  }
342
+ residual_scale_bonuses_by_task = {
343
+ str(task_id): {str(scale): float(bonus) for scale, bonus in bonuses.items()}
344
+ for task_id, bonuses in (residual_scale_bonuses_by_task or {}).items()
345
+ }
346
  if selection_mode == "policy":
347
  num_candidates = 1
348
  lattice_exclude_types = tuple(
 
466
  candidate_type_bonuses_by_task,
467
  task_id=task_id,
468
  )
469
+ task_residual_scale_bonuses = _task_residual_scale_bonuses(
470
+ residual_scale_bonuses_by_task,
471
+ task_id=task_id,
472
+ )
473
  task_rows = _evaluate_task_cases(
474
  task_id,
475
  task_cases,
 
518
  lattice_exclude_type_tasks=lattice_exclude_type_tasks,
519
  candidate_type_bonuses=task_candidate_type_bonuses,
520
  candidate_type_bonus_components=candidate_type_bonus_components,
521
+ residual_scale_bonuses=task_residual_scale_bonuses,
522
  field_rank_biases=(
523
  field_rank_biases_by_task.get(task_id)
524
  or field_rank_biases_by_task.get("*")
 
691
  "candidate_type_bonuses_by_task": candidate_type_bonuses_by_task,
692
  "candidate_type_bonus_components": bool(candidate_type_bonus_components),
693
  "field_rank_biases_by_task": field_rank_biases_by_task,
694
+ "residual_scale_bonuses_by_task": residual_scale_bonuses_by_task,
695
  "candidate_oracle_rollouts": int(candidate_oracle_rollouts),
696
  "candidate_oracle_unique_tolerance": float(candidate_oracle_unique_tolerance),
697
  "policy_rollout_success_rate": _mean([row["success"] for row in rows]),
 
1414
  lattice_exclude_type_tasks: dict[str, tuple[str, ...]] | None = None,
1415
  candidate_type_bonuses: dict[str, float] | None = None,
1416
  candidate_type_bonus_components: bool = False,
1417
+ residual_scale_bonuses: dict[str, float] | None = None,
1418
  field_rank_biases: list[float] | None = None,
1419
  candidate_oracle_rollouts: int = 0,
1420
  candidate_oracle_unique_tolerance: float = 1.0e-6,
 
1546
  )
1547
  else None
1548
  ),
1549
+ residual_scale_bonuses=residual_scale_bonuses or {},
1550
  field_rank_bias=(
1551
  torch.tensor(field_rank_biases, dtype=torch.float32, device=device)
1552
  if field_rank_biases
 
1626
  lattice_exclude_types=task_lattice_exclude_types,
1627
  candidate_type_bonuses=candidate_type_bonuses or {},
1628
  candidate_type_bonus_components=candidate_type_bonus_components,
1629
+ residual_scale_bonuses=residual_scale_bonuses or {},
1630
  candidate_oracle_unique_tolerance=candidate_oracle_unique_tolerance,
1631
  )
1632
  for index, case in enumerate(batch):
 
2074
  action_candidates: Any | None = None,
2075
  candidate_mask: Any | None = None,
2076
  candidate_type_bonus: Any | None = None,
2077
+ residual_scale_bonuses: dict[str, float] | None = None,
2078
  field_rank_bias: Any | None = None,
2079
  residual_aggregate_mask: Any | None = None,
2080
  challenger_mask: Any | None = None,
 
2624
  )
2625
  scales = tuple(float(scale) for scale in residual_scales) or (float(residual_scale),)
2626
  if residual_reduce == "field_softmax":
2627
+ if residual_scale_bonuses:
2628
+ raise ValueError("residual_scale_bonuses are not supported with field_softmax")
2629
  if challenger_mask is not None:
2630
  raise ValueError("challenger_mask is not supported with field_softmax")
2631
  return _select_field_softmax_residual_action_chunk(
 
2656
  residual_scales=residual_scales,
2657
  candidate_mask=candidate_mask,
2658
  candidate_type_bonus=candidate_type_bonus,
2659
+ residual_scale_bonuses=residual_scale_bonuses or {},
2660
  num_gaussian_candidates=num_gaussian_candidates,
2661
  candidate_sigma=candidate_sigma,
2662
  selection_seed=selection_seed,
 
2714
  residual_scales: tuple[float, ...],
2715
  candidate_mask: Any | None,
2716
  candidate_type_bonus: Any | None,
2717
+ residual_scale_bonuses: dict[str, float],
2718
  num_gaussian_candidates: int,
2719
  candidate_sigma: float,
2720
  selection_seed: int,
 
2730
  candidate_mask = torch.cat([candidate_mask for _ in scales], dim=1)
2731
  if candidate_type_bonus is not None and len(scales) > 1:
2732
  candidate_type_bonus = torch.cat([candidate_type_bonus for _ in scales], dim=1)
2733
+ if residual_scale_bonuses:
2734
+ residual_count = int(residuals.shape[1])
2735
+ scale_blocks = []
2736
+ for scale in scales:
2737
+ bonus = float(
2738
+ residual_scale_bonuses.get(str(scale), residual_scale_bonuses.get(f"{scale:g}", 0.0))
2739
+ )
2740
+ scale_blocks.append(
2741
+ torch.full(
2742
+ (policy_mean.shape[0], residual_count),
2743
+ bonus,
2744
+ dtype=policy_mean.dtype,
2745
+ device=policy_mean.device,
2746
+ )
2747
+ )
2748
+ scale_bonus = torch.cat(scale_blocks, dim=1)
2749
+ if candidate_type_bonus is None:
2750
+ candidate_type_bonus = scale_bonus
2751
+ else:
2752
+ candidate_type_bonus = candidate_type_bonus + scale_bonus.to(
2753
+ device=candidate_type_bonus.device,
2754
+ dtype=candidate_type_bonus.dtype,
2755
+ )
2756
  if num_gaussian_candidates > 1 and candidate_sigma > 0:
2757
  generator = torch.Generator(device=policy_mean.device)
2758
  generator.manual_seed(int(selection_seed))
 
3235
  return bonuses
3236
 
3237
 
3238
+ def _task_residual_scale_bonuses(
3239
+ bonuses_by_task: dict[str, dict[str, float]],
3240
+ *,
3241
+ task_id: str,
3242
+ ) -> dict[str, float]:
3243
+ bonuses = dict(bonuses_by_task.get("*", {}))
3244
+ bonuses.update(bonuses_by_task.get(task_id, {}))
3245
+ return bonuses
3246
+
3247
+
3248
  def _lattice_candidate_type_bonus(
3249
  batch: list[_RolloutCase],
3250
  *,