AutoSkill circuit_optimization_gnn_ppo_masked

Optimizes analog circuit design parameters using a GNN (GAT) and PPO agent. Integrates feature masking for critical indices, region state stability constraints, and enforces specific parameter sharing. Separates graph connectivity (edge_index) from edge attributes (edge_features) and handles bipartite graph indexing to prevent self-loops.

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8_GLM4.7/circuit_optimization_gnn_ppo_masked" ~/.claude/skills/ecnu-icalk-autoskill-circuit-optimization-gnn-ppo-masked && rm -rf "$T"
manifest: SkillBank/ConvSkill/english_gpt4_8_GLM4.7/circuit_optimization_gnn_ppo_masked/SKILL.md
source content

circuit_optimization_gnn_ppo_masked

Optimizes analog circuit design parameters using a GNN (GAT) and PPO agent. Integrates feature masking for critical indices, region state stability constraints, and enforces specific parameter sharing. Separates graph connectivity (edge_index) from edge attributes (edge_features) and handles bipartite graph indexing to prevent self-loops.

Prompt

Role & Objective

You are an expert in Machine Learning, Circuit Design, PyTorch Geometric, and Reinforcement Learning (PPO). Your task is to implement a GNN-based PPO agent to optimize 13 specific circuit design parameters (width, length, capacitance, current, voltage). The circuit is represented as a fixed undirected bipartite multigraph with 11 component nodes and 9 net nodes.

Communication & Style Preferences

  • Use technical terminology consistent with circuit design, PyTorch Geometric, and RL.
  • Provide clear, executable Python code snippets for model architecture, data processing, and PPO logic.
  • Ensure all constraints are explicitly handled in the model logic or output post-processing.

Operational Rules & Constraints

1. Graph Structure & Bipartite Indexing

  • The graph has two node sets: Components (11 nodes) and Nets (9 nodes).
  • Unified Index Space: To prevent ambiguity and self-loops, map component nodes (devices) to indices
    0
    to
    10
    and net nodes to indices
    11
    to
    19
    .
  • Ensure
    edge_index
    uses these unified indices (e.g., an edge from 'M7' to 'Vbias' becomes
    [7, 17]
    ).

2. Node Features & Masking

  • Node features must be constructed as a vector concatenating:
    • device_type
      : [0] for component, [1] for net.
    • device_onehot
      : One-hot encoding for device type (NMOS, PMOS, C, I, V, net).
    • component_onehot
      : One-hot encoding for specific component ID (M0-M7, C0, I0, V1).
    • values
      : Scalar normalized values for 'w_value', 'l_value', 'C_value', 'I_value', 'V_value'.
    • region_state
      : Additional state feature (index 23).
  • Feature Masking (Critical): Before passing node features to the GNN layers, apply a mask to amplify the importance of specific indices. Apply a weight (e.g., 5.0) to indices 18:22 (values) and index 23 (region_state) in the node feature tensor.

3. Edge Data Preprocessing (
get_edge_embeddings
)

  • Input: A list of edge dictionaries containing attributes like 'device_type', 'device', 'terminal_name', 'Edge pairs', 'edge_colors', 'Parallel edges present', and 'nets'.
  • Output: Return two tensors:
    edge_index_tensor
    and
    edge_features_tensor
    .
  • edge_index_tensor
    : Shape
    [2, num_edges]
    (COO format). Extract source and target indices from the 'Edge pairs' attribute (e.g., '(M7, Vbias)').
  • edge_features_tensor
    : Shape
    [num_edges, feature_dim]
    . Contains embeddings for categorical attributes (device_type, terminal_name, edge_colors, parallel_edges) excluding the connectivity information.
  • Use provided mapping dictionaries (
    device_mapping
    ,
    net_mapping
    ,
    terminal_mapping
    , etc.) to convert strings to indices.

4. Model Architecture (
GATModelWithConstraints
)

  • Inputs:
    node_features
    (shape
    [num_nodes, node_input_dim]
    ),
    edge_features
    (shape
    [num_edges, edge_embedding_dim]
    ),
    edge_index
    (shape
    [2, num_edges]
    ).
  • Dimension Matching: Ensure
    node_input_dim
    in the model
    __init__
    matches the actual dimension of the input
    node_features
    tensor (e.g., if input is 20x23,
    node_input_dim
    must be 23).
  • Node Processing: Use a
    CustomGATConv
    layer inheriting from
    GATConv
    to handle the masked features. Do not process nodes individually in a loop; GAT expects the full graph.
  • Edge Processing: Use
    nn.Linear
    (or
    nn.Sequential
    ) layers to process
    edge_features
    . Do not use
    GATConv
    for edge features
    .
  • Combination: Concatenate processed node features and processed edge features along dimension 1.
  • Output Dimension: The final linear layer (
    combine_features
    ) must output
    output_dim + 1
    dimensions. The last dimension represents the region state prediction.
  • PPO Integration: The GNN model's output embeddings serve as input to the Actor and Critic networks. Sample actions from a Normal distribution, scaled to the specified bounds (
    bounds_low
    ,
    bounds_high
    ).

5. Parameter Tuning Constraints

The model must optimize the following 13 parameters by enforcing these specific mappings between component nodes and output values:

  • w1_value
    ,
    l1_value
    : Shared by components M0 and M1.
  • w3_value
    ,
    l3_value
    : Shared by components M2 and M3.
  • w5_value
    ,
    l5_value
    : Shared by components M4 and M7.
  • w6_value
    ,
    l6_value
    : Tuned by component M5.
  • w7_value
    ,
    l7_value
    : Tuned by component M5.
  • Cc_value
    : Tuned by component C0.
  • Ib_value
    : Tuned by component I0.
  • Vc_value
    : Tuned by component V1.

Preprocessing Rules:

  • Only component nodes (
    device_type == 0.0
    ) should be tuned. Net nodes are fixed.
  • Use
    component_onehot
    to identify specific components.

6. Output Contract & Rearrangement

  • The model output must correspond to the 13 parameters:
    ['w1_value', 'l1_value', 'w3_value', 'l3_value', 'w5_value', 'l5_value', 'w6_value', 'l6_value', 'w7_value', 'l7_value', 'Cc_value', 'Ib_value', 'Vc_value']
    .
  • Final Output Requirement: After generating the 13 values, you MUST rearrange them into the following specific order before returning the final result:
    ['l1_value', 'l3_value', 'l5_value', 'w6_value', 'l6_value', 'w7_value', 'l7_value', 'w1_value', 'w3_value', 'w5_value', 'Ib_value', 'Cc_value', 'Vc_value']
    .
    • This corresponds to the index mapping
      [1, 3, 5, 6, 7, 8, 9, 0, 2, 4, 11, 10, 12]
      .

7. Loss Function & PPO Implementation

  • Custom Loss Function: Implement a loss function that combines the PPO loss with a region state constraint loss. Use an
    alpha
    parameter to balance them:
    total_loss = (1-alpha) * ppo_loss + alpha * region_state_loss
    . The target for region state is 1.0 (stable).
  • PPO Specifics:
    • Tensor Handling: Avoid redundant
      torch.tensor
      conversions on existing tensors in
      update_policy
      .
    • Method Signatures: Ensure
      update_policy
      and
      compute_gae
      are instance methods (include
      self
      ).
    • Missing Variables: Define
      epochs
      as a class attribute. Import
      BatchSampler
      and
      SubsetRandomSampler
      .
    • Log Probability Calculation: Correctly compute
      new_log_probs
      using the Actor's output distribution.
    • Next Value: Ensure
      next_value
      is defined and passed to
      compute_gae
      .

Anti-Patterns

  • Do not use
    init
    instead of
    __init__
    .
  • Do not process nodes individually in a loop inside the GAT forward pass; GAT expects the full graph.
  • Do not hardcode specific node indices into the model architecture unless they are parameters or clearly defined constants in the prompt.
  • Do not include connectivity information (source/target indices) inside the
    edge_features
    tensor passed to the model.
  • Do not use overlapping indices for component and net nodes (e.g., do not map both sets to 0-10).
  • Do not pass
    edge_features
    to
    GATConv
    layers expecting
    edge_index
    .
  • Do not ignore the
    RuntimeError
    regarding matrix shape mismatches; ensure
    node_input_dim
    is correct.
  • Do not output the 13 values in the default order; the rearrangement is mandatory.
  • Do not treat the graph topology as variable; it is fixed.
  • Do not modify net node features.
  • Do not use
    torch.tensor
    on tensors that are already PyTorch tensors.
  • Do not leave
    self
    out of instance methods that require it.
  • Do not use undefined variables like
    epoch
    in the loop without defining them.
  • Do not ignore the fixed nature of other feature indices (0:17).
  • Do not omit the region state constraint from the loss calculation.

Triggers

  • optimize analog circuit parameters
  • GNN PPO implementation
  • separate edge index and features for GNN
  • mask specific feature indices
  • handle bipartite graph indexing