Source code for protomotions.agents.peft.prior_amp_model
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Discrete-prior PEFT RLFT model with AMP discriminator outputs."""
from __future__ import annotations
from tensordict import TensorDict
from protomotions.agents.amp.model import AMPModelComponentsMixin
from protomotions.agents.peft.model import DiscretePriorPEFTModel
[docs]
class DiscretePriorPEFTRLFTAMPModel(AMPModelComponentsMixin, DiscretePriorPEFTModel):
"""Discrete-prior PEFT actor/critic with AMP discriminator outputs."""
[docs]
def __init__(
self,
config,
pretrained_prior_model,
mimic_target_poses_dim: int = 0,
):
super().__init__(
config=config,
pretrained_prior_model=pretrained_prior_model,
mimic_target_poses_dim=mimic_target_poses_dim,
)
self._build_amp_model_components(config)
[docs]
def optional_full_checkpoint_state_prefixes(self) -> tuple[str, ...]:
"""AMP discriminator state is optional for PEFT full-checkpoint loads."""
return super().optional_full_checkpoint_state_prefixes() + (
"_discriminator.",
"_disc_critic.",
)
[docs]
def experience_buffer_keys(self) -> list:
base_keys = super().experience_buffer_keys()
amp_keys = self._discriminator.out_keys + self._disc_critic.out_keys
duplicate_keys = sorted(set(base_keys).intersection(amp_keys))
if duplicate_keys:
raise ValueError(
"PEFT+AMP discriminator outputs must not reuse actor/critic "
f"buffer keys: {duplicate_keys}"
)
return base_keys + amp_keys
[docs]
def forward_rollout(self, tensordict: TensorDict) -> TensorDict:
tensordict = super().forward_rollout(tensordict)
return self._forward_amp_model_components(tensordict)