Auto-sync: 2026-06-28 22:04:20 (part 4)
Browse files
scripts/export_retrieval_residual_policy_targets.py
CHANGED
|
@@ -42,7 +42,11 @@ def main(argv: list[str] | None = None) -> int:
|
|
| 42 |
parser.add_argument("--device", default="auto")
|
| 43 |
parser.add_argument("--split", choices=("train", "val", "all"), default="all")
|
| 44 |
parser.add_argument("--retrieval-neighbors", type=int, default=1)
|
| 45 |
-
parser.add_argument(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
parser.add_argument("--retrieval-residual-scale", type=float, default=0.35)
|
| 47 |
parser.add_argument(
|
| 48 |
"--exclude-types",
|
|
|
|
| 42 |
parser.add_argument("--device", default="auto")
|
| 43 |
parser.add_argument("--split", choices=("train", "val", "all"), default="all")
|
| 44 |
parser.add_argument("--retrieval-neighbors", type=int, default=1)
|
| 45 |
+
parser.add_argument(
|
| 46 |
+
"--retrieval-metric",
|
| 47 |
+
choices=("raw", "zscore", "task_relative"),
|
| 48 |
+
default="raw",
|
| 49 |
+
)
|
| 50 |
parser.add_argument("--retrieval-residual-scale", type=float, default=0.35)
|
| 51 |
parser.add_argument(
|
| 52 |
"--exclude-types",
|
scripts/slurm/smoke_retrieval_metric_unit.sbatch
CHANGED
|
@@ -119,5 +119,62 @@ assert zscore_attached.candidate_source_group_id == "train_b", zscore_attached
|
|
| 119 |
expected = np.asarray([[[0.0, 0.0]], [[0.2, 0.0]]], dtype=np.float32)
|
| 120 |
actual = np.asarray(zscore_attached.candidate_action_values, dtype=np.float32)
|
| 121 |
assert np.allclose(actual, expected), actual
|
| 122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
PY
|
|
|
|
| 119 |
expected = np.asarray([[[0.0, 0.0]], [[0.2, 0.0]]], dtype=np.float32)
|
| 120 |
actual = np.asarray(zscore_attached.candidate_action_values, dtype=np.float32)
|
| 121 |
assert np.allclose(actual, expected), actual
|
| 122 |
+
|
| 123 |
+
def actor_feature(target_x, robot_tail=0.0):
|
| 124 |
+
values = [0.0] * 70
|
| 125 |
+
values[0] = target_x
|
| 126 |
+
values[3] = 1.0
|
| 127 |
+
values[16] = 1.0
|
| 128 |
+
values[-1] = robot_tail
|
| 129 |
+
return values
|
| 130 |
+
|
| 131 |
+
groups_task_relative = {
|
| 132 |
+
"train_actor_far": [
|
| 133 |
+
record("train_actor_far", "expert", 1.0, actor_feature(0.6)),
|
| 134 |
+
record("train_actor_far", "near_miss", 1.1, actor_feature(0.6)),
|
| 135 |
+
],
|
| 136 |
+
"train_actor_match": [
|
| 137 |
+
record("train_actor_match", "expert", 2.0, actor_feature(0.0, robot_tail=5.0)),
|
| 138 |
+
record("train_actor_match", "near_miss", 2.2, actor_feature(0.0, robot_tail=5.0)),
|
| 139 |
+
],
|
| 140 |
+
"heldout": [
|
| 141 |
+
record("heldout", "expert", 9.0, actor_feature(0.0)),
|
| 142 |
+
record("heldout", "near_miss", 9.9, actor_feature(0.0)),
|
| 143 |
+
],
|
| 144 |
+
}
|
| 145 |
+
dataset_task_relative = SimpleNamespace(
|
| 146 |
+
group_ids=list(groups_task_relative),
|
| 147 |
+
get_group=lambda group_id: groups_task_relative[group_id],
|
| 148 |
+
)
|
| 149 |
+
case_task_relative = _RolloutCase(
|
| 150 |
+
group_id="heldout",
|
| 151 |
+
task_id="PickCube-v1",
|
| 152 |
+
source_dataset=Path("."),
|
| 153 |
+
state={},
|
| 154 |
+
observation={"features": actor_feature(0.0)},
|
| 155 |
+
instruction="pick",
|
| 156 |
+
oracle_score=1.0,
|
| 157 |
+
oracle_success=True,
|
| 158 |
+
expert_score=1.0,
|
| 159 |
+
expert_success=True,
|
| 160 |
+
best_action_values=[[9.9, 0.0]],
|
| 161 |
+
candidate_action_values=[],
|
| 162 |
+
candidate_types=[],
|
| 163 |
+
)
|
| 164 |
+
[task_relative_attached] = _attach_retrieved_residual_candidates(
|
| 165 |
+
dataset_task_relative,
|
| 166 |
+
[case_task_relative],
|
| 167 |
+
heldout_group_ids=["heldout"],
|
| 168 |
+
obs_dim=70,
|
| 169 |
+
observation_mode="state",
|
| 170 |
+
retrieval_neighbors=1,
|
| 171 |
+
retrieval_metric="task_relative",
|
| 172 |
+
)
|
| 173 |
+
assert task_relative_attached.candidate_source_group_id == "train_actor_match", task_relative_attached
|
| 174 |
+
print({
|
| 175 |
+
"status": "ok",
|
| 176 |
+
"raw": raw_attached.candidate_source_group_id,
|
| 177 |
+
"zscore": zscore_attached.candidate_source_group_id,
|
| 178 |
+
"task_relative": task_relative_attached.candidate_source_group_id,
|
| 179 |
+
})
|
| 180 |
PY
|
tests/test_maniskill_policy_rollout.py
CHANGED
|
@@ -919,6 +919,100 @@ def test_retrieval_residual_zscore_metric_standardizes_train_bank_features() ->
|
|
| 919 |
)
|
| 920 |
|
| 921 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 922 |
def test_retrieval_residual_type_success_threshold_filters_train_families() -> None:
|
| 923 |
def record(
|
| 924 |
group_id: str,
|
|
|
|
| 919 |
)
|
| 920 |
|
| 921 |
|
| 922 |
+
def test_retrieval_residual_task_relative_metric_ignores_robot_tail_noise() -> None:
|
| 923 |
+
def feature(*, target_x: float, robot_tail: float = 0.0) -> list[float]:
|
| 924 |
+
values = [0.0] * 70
|
| 925 |
+
values[0] = target_x
|
| 926 |
+
values[3] = 1.0
|
| 927 |
+
values[13 + 3] = 1.0
|
| 928 |
+
values[-1] = robot_tail
|
| 929 |
+
return values
|
| 930 |
+
|
| 931 |
+
def record(group_id: str, candidate_type: str, action_value: float, obs: list[float]):
|
| 932 |
+
return SimpleNamespace(
|
| 933 |
+
group_id=group_id,
|
| 934 |
+
task_id="PickCube-v1",
|
| 935 |
+
candidate_type=candidate_type,
|
| 936 |
+
record_id=f"{group_id}-{candidate_type}-{action_value}",
|
| 937 |
+
observation_inline={"features": obs},
|
| 938 |
+
action_chunk=ActionChunk(
|
| 939 |
+
representation="continuous",
|
| 940 |
+
horizon=1,
|
| 941 |
+
values=[[action_value, 0.0]],
|
| 942 |
+
),
|
| 943 |
+
)
|
| 944 |
+
|
| 945 |
+
groups = {
|
| 946 |
+
"train_actor_far": [
|
| 947 |
+
record("train_actor_far", "expert", 1.0, feature(target_x=0.6)),
|
| 948 |
+
record("train_actor_far", "near_miss", 1.1, feature(target_x=0.6)),
|
| 949 |
+
],
|
| 950 |
+
"train_actor_match": [
|
| 951 |
+
record(
|
| 952 |
+
"train_actor_match",
|
| 953 |
+
"expert",
|
| 954 |
+
2.0,
|
| 955 |
+
feature(target_x=0.0, robot_tail=5.0),
|
| 956 |
+
),
|
| 957 |
+
record(
|
| 958 |
+
"train_actor_match",
|
| 959 |
+
"near_miss",
|
| 960 |
+
2.2,
|
| 961 |
+
feature(target_x=0.0, robot_tail=5.0),
|
| 962 |
+
),
|
| 963 |
+
],
|
| 964 |
+
"heldout": [
|
| 965 |
+
record("heldout", "expert", 9.0, feature(target_x=0.0)),
|
| 966 |
+
record("heldout", "near_miss", 9.9, feature(target_x=0.0)),
|
| 967 |
+
],
|
| 968 |
+
}
|
| 969 |
+
dataset = SimpleNamespace(
|
| 970 |
+
group_ids=list(groups),
|
| 971 |
+
get_group=lambda group_id: groups[group_id],
|
| 972 |
+
)
|
| 973 |
+
case = _RolloutCase(
|
| 974 |
+
group_id="heldout",
|
| 975 |
+
task_id="PickCube-v1",
|
| 976 |
+
source_dataset=Path("."),
|
| 977 |
+
state={},
|
| 978 |
+
observation={"features": feature(target_x=0.0)},
|
| 979 |
+
instruction="pick",
|
| 980 |
+
oracle_score=1.0,
|
| 981 |
+
oracle_success=True,
|
| 982 |
+
expert_score=1.0,
|
| 983 |
+
expert_success=True,
|
| 984 |
+
best_action_values=[[9.9, 0.0]],
|
| 985 |
+
candidate_action_values=[],
|
| 986 |
+
candidate_types=[],
|
| 987 |
+
)
|
| 988 |
+
|
| 989 |
+
[raw_attached] = _attach_retrieved_residual_candidates(
|
| 990 |
+
dataset,
|
| 991 |
+
[case],
|
| 992 |
+
heldout_group_ids=["heldout"],
|
| 993 |
+
obs_dim=70,
|
| 994 |
+
observation_mode="state",
|
| 995 |
+
retrieval_neighbors=1,
|
| 996 |
+
retrieval_metric="raw",
|
| 997 |
+
)
|
| 998 |
+
[task_relative_attached] = _attach_retrieved_residual_candidates(
|
| 999 |
+
dataset,
|
| 1000 |
+
[case],
|
| 1001 |
+
heldout_group_ids=["heldout"],
|
| 1002 |
+
obs_dim=70,
|
| 1003 |
+
observation_mode="state",
|
| 1004 |
+
retrieval_neighbors=1,
|
| 1005 |
+
retrieval_metric="task_relative",
|
| 1006 |
+
)
|
| 1007 |
+
|
| 1008 |
+
assert raw_attached.candidate_source_group_id == "train_actor_far"
|
| 1009 |
+
assert task_relative_attached.candidate_source_group_id == "train_actor_match"
|
| 1010 |
+
assert np.allclose(
|
| 1011 |
+
np.asarray(task_relative_attached.candidate_action_values, dtype=np.float32),
|
| 1012 |
+
np.asarray([[[0.0, 0.0]], [[0.2, 0.0]]]),
|
| 1013 |
+
)
|
| 1014 |
+
|
| 1015 |
+
|
| 1016 |
def test_retrieval_residual_type_success_threshold_filters_train_families() -> None:
|
| 1017 |
def record(
|
| 1018 |
group_id: str,
|