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 |
*,
|