anhtld commited on
Commit
ffada60
·
verified ·
1 Parent(s): 1f397fd

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("--retrieval-metric", choices=("raw", "zscore"), default="raw")
 
 
 
 
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
- print({"status": "ok", "raw": raw_attached.candidate_source_group_id, "zscore": zscore_attached.candidate_source_group_id})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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,