anhtld commited on
Commit
3fd10a8
·
verified ·
1 Parent(s): b03e8a4

Auto-sync: 2026-06-27 10:45:23

Browse files
Files changed (1) hide show
  1. dovla_cil/training/trainer.py +28 -2
dovla_cil/training/trainer.py CHANGED
@@ -65,6 +65,7 @@ class TrainerConfig:
65
  backbone_local_files_only: bool = True
66
  backbone_feature_cache: str | Path | None = None
67
  backbone_feature_batch_size: int = 64
 
68
 
69
  def __post_init__(self) -> None:
70
  if self.lr is not None:
@@ -98,6 +99,12 @@ class TrainerConfig:
98
  raise ValueError("CLIP backbone requires backbone_model")
99
  if self.backbone_feature_batch_size <= 0:
100
  raise ValueError("backbone_feature_batch_size must be positive")
 
 
 
 
 
 
101
 
102
 
103
  class DoVLATrainer:
@@ -268,7 +275,10 @@ class DoVLATrainer:
268
  pred_reward, [record.group_id for record in records]
269
  )
270
 
271
- best_records = _best_records_by_group(records)
 
 
 
272
  best_obs = self._obs_tensor(best_records)
273
  best_actions = self._action_tensor(best_records)
274
  best_instructions = [record.instruction for record in best_records]
@@ -655,12 +665,28 @@ def _group_regret_from_potential(potential, group_ids: list[str]):
655
  return output
656
 
657
 
658
- def _best_records_by_group(records: list[CILRecord]) -> list[CILRecord]:
 
 
 
659
  best: dict[str, CILRecord] = {}
660
  for record in records:
 
 
661
  current = best.get(record.group_id)
662
  if current is None or _record_score(record) > _record_score(current):
663
  best[record.group_id] = record
 
 
 
 
 
 
 
 
 
 
 
664
  return list(best.values())
665
 
666
 
 
65
  backbone_local_files_only: bool = True
66
  backbone_feature_cache: str | Path | None = None
67
  backbone_feature_batch_size: int = 64
68
+ policy_target_types: tuple[str, ...] = ()
69
 
70
  def __post_init__(self) -> None:
71
  if self.lr is not None:
 
99
  raise ValueError("CLIP backbone requires backbone_model")
100
  if self.backbone_feature_batch_size <= 0:
101
  raise ValueError("backbone_feature_batch_size must be positive")
102
+ if isinstance(self.policy_target_types, str):
103
+ self.policy_target_types = tuple(
104
+ item.strip()
105
+ for item in self.policy_target_types.split(",")
106
+ if item.strip()
107
+ )
108
 
109
 
110
  class DoVLATrainer:
 
275
  pred_reward, [record.group_id for record in records]
276
  )
277
 
278
+ best_records = _best_records_by_group(
279
+ records,
280
+ candidate_types=self.config.policy_target_types,
281
+ )
282
  best_obs = self._obs_tensor(best_records)
283
  best_actions = self._action_tensor(best_records)
284
  best_instructions = [record.instruction for record in best_records]
 
665
  return output
666
 
667
 
668
+ def _best_records_by_group(
669
+ records: list[CILRecord], *, candidate_types: tuple[str, ...] = ()
670
+ ) -> list[CILRecord]:
671
+ allowed = set(candidate_types)
672
  best: dict[str, CILRecord] = {}
673
  for record in records:
674
+ if allowed and record.candidate_type not in allowed:
675
+ continue
676
  current = best.get(record.group_id)
677
  if current is None or _record_score(record) > _record_score(current):
678
  best[record.group_id] = record
679
+ if allowed:
680
+ missing_group_ids = {record.group_id for record in records} - set(best)
681
+ if missing_group_ids:
682
+ fallback = _best_records_by_group(records)
683
+ best.update(
684
+ {
685
+ record.group_id: record
686
+ for record in fallback
687
+ if record.group_id in missing_group_ids
688
+ }
689
+ )
690
  return list(best.values())
691
 
692