defaults:
  # Inherit the full ZipSplat config under the `base` key so ZipSplatRefine can wrap it.
  - /model/zipsplat@base
  - _self_

name: networks.zipsplat_refine
compile_loss: false
weights: null

# Path to a pretrained ZipSplat checkpoint to initialize `base` from. Required
# for meaningful refinement training (otherwise base is random).
base_weights: null

# Freeze the inner ZipSplat. Defaults to fully frozen — only the refiner trains.
freeze_encoder: true
freeze_decoder: true

# Refinement loop
K: 2
gamma: 0.7
lambda_target_final: 1.0
detach_error: false

# Refiner architecture (kept as default-y as possible — uses
# splatfactory.models.modules.transformer_block on the existing CrossAttention
# from splatfactory/models/modules/attention.py).
refiner:
  hidden_dim: 256
  num_layers: 2
  num_heads: 8
  mlp_ratio: 4.0
  init_values: null   # standard residual; no LayerScale
