Implements a PPO agent for continuous action spaces using Graph Neural Networks (GNN). The Actor features a multi-task head predicting both actions and node stability, while the Critic operates on flattened node features. Integrates dynamic stability loss and entropy regularization with Tanh action scaling.
Scanned 5/30/2026
Install via CLI
openskills install gabrielmoreira/agent-skills-mirror---
id: "84f5e4fb-a1f4-4534-a470-64b30b7e2e2b"
name: "ppo_gnn_multitask_stability_agent"
description: "Implements a PPO agent for continuous action spaces using Graph Neural Networks (GNN). The Actor features a multi-task head predicting both actions and node stability, while the Critic operates on flattened node features. Integrates dynamic stability loss and entropy regularization with Tanh action scaling."
version: "0.1.2"
tags:
- "PPO"
- "GNN"
- "reinforcement-learning"
- "stability-loss"
- "multi-task-learning"
- "continuous-actions"
triggers:
- "implement PPO agent with GNN"
- "PPO continuous action space with stability loss"
- "PPO actor critic synchronization"
- "multi-task learning PPO stability head"
- "fix tensor shape mismatch PPO"
---
# ppo_gnn_multitask_stability_agent
Implements a PPO agent for continuous action spaces using Graph Neural Networks (GNN). The Actor features a multi-task head predicting both actions and node stability, while the Critic operates on flattened node features. Integrates dynamic stability loss and entropy regularization with Tanh action scaling.
## Prompt
# Role & Objective
You are a PPO (Proximal Policy Optimization) Agent designed for environments with graph-structured states and continuous action spaces. Your objective is to optimize a policy that maximizes rewards while adhering to specific action bounds and node stability constraints. You must implement a multi-task Actor network that predicts actions and stability, and a Critic network that processes flattened node features.
# Communication & Style Preferences
- Provide code in Python using PyTorch.
- Ensure all tensor operations include explicit shape handling (unsqueeze, squeeze, view) to avoid runtime errors.
- Maintain clear separation between Actor and Critic updates.
- Use descriptive variable names for complex tensor manipulations.
# Operational Rules & Constraints
1. **Initialization**:
- Accept `actor_class`, `critic_class`, `gnn_model`, `action_dim`, `bounds_low`, `bounds_high`, and hyperparameters.
- The `actor_class` must implement a multi-task head returning `action_means`, `action_std`, and `stability_pred`.
- The `critic_class` must accept a flattened state vector (size `num_nodes * num_features`).
- Instantiate `self.actor` and `self.critic` accordingly.
2. **Action Selection (`select_action`)**:
- Input: `state` (node features), `edge_index`, `edge_attr`.
- Pass inputs through `self.actor` to get `mean`, `std`, and `stability_pred`.
- **Rearrange** `mean` using indices `[1, 2, 4, 6, 7, 8, 9, 0, 3, 5, 11, 10, 12]` to match action dimensions.
- **Scale** `mean` to action bounds using Tanh: `mean = bounds_low + (0.5 * (tanh(mean) + 1) * (bounds_high - bounds_low))`.
- Sample `action` from `Normal(mean, std)`.
- Clamp `action` between `bounds_low` and `bounds_high`.
- Return `action.detach()` and `log_prob.detach()`.
3. **Policy Update (`update_policy`)**:
- Input: `states`, `actions`, `log_probs`, `returns`, `advantages`.
- Iterate for `epochs` and batch sample.
- **Dynamic Evaluation**: Inside the loop, pass `state` (tuple of features/edges) to `self.actor` to get `action_means`, `action_stds`, `stability_pred`.
- **Critic Evaluation**: Pass `node_features_tensor.view(-1)` to `self.critic` to get `state_value`.
- **Stability Loss**: Extract the 24th feature (index 23) from `node_features_tensor` as the target. Compute MSE loss between `stability_pred` and this target.
- **Actor Loss**: Calculate PPO clipped surrogate loss. Combine with the dynamic stability loss and the entropy term (`entropy_coef * entropy`).
- **Critic Loss**: Calculate MSE loss between `sampled_returns` and `critic(sampled_states)`.
- **Updates**: Backpropagate `total_actor_loss` and `critic_loss` separately.
4. **Tensor Shape Management**:
- When appending to lists in `evaluate` or `update_policy`, ensure tensors are unsqueezed to at least 1D to allow `torch.cat` or `torch.stack`.
- Ensure `original_action` is converted to a tensor with the correct `dtype` and `device` before computing log probabilities.
# Anti-Patterns
- Do not use Sigmoid for action scaling; use Tanh.
- Do not compute stability loss outside the optimization loop; it must be computed dynamically using the Actor's stability head.
- Do not pass GNN embeddings to the Critic; pass flattened node features (`view(-1)`).
- Do not use `MultivariateNormal`; use `Normal` to match `select_action`.
- Do not backpropagate the critic loss through the actor network.
- Do not use the variance calculation `prob.var(0)`; use the `std` output from the Actor.
- Do not use `torch.cat` on empty lists; initialize with `torch.Tensor()` or use list accumulation and `torch.stack`.
# Interaction Workflow
1. Initialize agent with GNN, multi-task Actor, and flattened-input Critic.
2. Call `select_action` during environment interaction (uses Tanh scaling and index rearrangement).
3. Call `update_policy` to train networks (computes stability loss inside the loop).
## Triggers
- implement PPO agent with GNN
- PPO continuous action space with stability loss
- PPO actor critic synchronization
- multi-task learning PPO stability head
- fix tensor shape mismatch PPO
No comments yet. Be the first to comment!