# =============================================================================
# LTX-2 AV2AV IC-LoRA Training Configuration
# =============================================================================
#
# This configuration is for training In-Context LoRA (IC-LoRA) adapters that
# enable joint audio-video-to-audio-video transformations. IC-LoRA learns to
# apply transformations to both the video and audio modalities simultaneously
# by conditioning on paired reference video and audio.
#
# Both modalities use reference conditioning: pre-encoded reference latents
# are concatenated to each modality's target sequence. Reference tokens
# participate in bidirectional self-attention but receive no noise and are
# excluded from the loss.
#
# Key differences from video-only IC-LoRA (v2v_ic_lora.yaml):
#   - Both video AND audio have reference conditions
#   - Requires preprocessed reference latents for BOTH modalities
#   - LoRA targets all modules (video, audio, and cross-modal attention)
#   - Validation uses both video and audio reference conditions
#
# Dataset structure:
#   preprocessed_data_root/
#   ├── latents/                 # Target video latents
#   ├── audio_latents/           # Target audio latents
#   ├── conditions/              # Text embeddings
#   ├── reference_latents/       # Reference video latents (conditioning input)
#   └── reference_audio_latents/ # Reference audio latents (conditioning input)
#
# Dataset metadata columns: video, audio, reference_video, reference_audio, caption
#
# =============================================================================

# -----------------------------------------------------------------------------
# Model Configuration
# -----------------------------------------------------------------------------
# Specifies the base model to fine-tune and the training mode.
model:
  # Path to the LTX-2 model checkpoint (.safetensors file)
  # This should be a local path to your downloaded model
  model_path: "path/to/ltx-2-model.safetensors"

  # Path to the text encoder model directory
  # For LTX-2, this is typically the Gemma-based text encoder
  text_encoder_path: "path/to/gemma-text-encoder"

  # Training mode: "lora" for efficient adapter training, "full" for full fine-tuning
  # IC-LoRA reference conditioning is intended for LoRA adapter training.
  training_mode: "lora"

  # Optional: Path to resume training from a checkpoint
  # Can be a checkpoint file (.safetensors) or directory (uses latest checkpoint)
  load_checkpoint: null

# -----------------------------------------------------------------------------
# LoRA Configuration
# -----------------------------------------------------------------------------
# Controls the Low-Rank Adaptation parameters for efficient fine-tuning.
lora:
  # Rank of the LoRA matrices (higher = more capacity but more parameters)
  # Typical values: 8, 16, 32, 64. Start with 16-32 for IC-LoRA.
  rank: 32

  # Alpha scaling factor (usually set equal to rank)
  # The effective scaling is alpha/rank, so alpha=rank means scaling of 1.0
  alpha: 32

  # Dropout probability for LoRA layers (0.0 = no dropout)
  # Can help with regularization if overfitting occurs
  dropout: 0.0

  # For AV2AV IC-LoRA, we target ALL modules — video, audio, and cross-modal attention.
  # Using short patterns matches all branches simultaneously.
  target_modules:
    # Attention layers (matches video, audio, and cross-modal branches)
    - "to_k"
    - "to_q"
    - "to_v"
    - "to_out.0"

# -----------------------------------------------------------------------------
# Training Strategy Configuration
# -----------------------------------------------------------------------------
# Defines the AV2AV IC-LoRA training approach using the unified flexible
# strategy. Both video and audio modalities have reference conditioning,
# enabling joint audiovisual transformations.
training_strategy:
  name: "flexible"

  # Video modality configuration
  video:
    # Whether the model generates video (true) or uses it as frozen conditioning (false)
    is_generated: true
    # Directory name (within preprocessed_data_root) containing target video latents
    latents_dir: "latents"

    # Conditions applied to the video modality during training
    conditions:
      # Reference conditioning (IC-LoRA): concatenates pre-encoded reference video
      # latents to the target sequence
      - type: reference
        latents_dir: "reference_latents"
        probability: 1.0

  # Audio modality configuration
  audio:
    # Whether the model generates audio (true) or uses it as frozen conditioning (false)
    is_generated: true
    # Directory name (within preprocessed_data_root) containing target audio latents
    latents_dir: "audio_latents"

    # Conditions applied to the audio modality during training
    conditions:
      # Reference conditioning (IC-LoRA): concatenates pre-encoded reference audio
      # latents to the target sequence
      - type: reference
        latents_dir: "reference_audio_latents"
        probability: 1.0

# -----------------------------------------------------------------------------
# Optimization Configuration
# -----------------------------------------------------------------------------
# Controls the training optimization parameters.
optimization:
  # Learning rate for the optimizer
  # Typical range for LoRA: 1e-5 to 1e-4
  learning_rate: 2e-4

  # Total number of training steps
  steps: 3000

  # Batch size per GPU
  # Reduce if running out of memory
  batch_size: 1

  # Number of gradient accumulation steps
  # Effective batch size = batch_size * gradient_accumulation_steps * num_gpus
  gradient_accumulation_steps: 1

  # Maximum gradient norm for clipping (helps training stability)
  max_grad_norm: 1.0

  # Optimizer type: "adamw" (standard) or "adamw8bit" (memory-efficient)
  optimizer_type: "adamw"

  # Learning rate scheduler type
  # Options: "constant", "linear", "cosine", "cosine_with_restarts", "polynomial"
  scheduler_type: "linear"

  # Additional scheduler parameters (depends on scheduler_type)
  scheduler_params: { }

  # Enable gradient checkpointing to reduce memory usage
  # Recommended for training with limited GPU memory
  enable_gradient_checkpointing: true

# -----------------------------------------------------------------------------
# Acceleration Configuration
# -----------------------------------------------------------------------------
# Hardware acceleration and memory optimization settings.
acceleration:
  # Mixed precision training mode
  # Options: "no" (fp32), "fp16" (half precision), "bf16" (bfloat16, recommended)
  mixed_precision_mode: "bf16"

  # Model quantization for reduced memory usage
  # Options: null (none), "int8-quanto", "int4-quanto", "int2-quanto", "fp8-quanto", "fp8uz-quanto"
  quantization: null

  # Load text encoder in 8-bit precision to save memory
  # Useful when GPU memory is limited
  load_text_encoder_in_8bit: false

  # Offload optimizer state to CPU during validation video sampling and restore it after.
  # Frees VRAM for the VAE decoder when optimizer state is large (full fine-tune, high-rank
  # LoRA). No effect under FSDP (sharded state).
  offload_optimizer_during_validation: false


# -----------------------------------------------------------------------------
# Data Configuration
# -----------------------------------------------------------------------------
# Specifies the training data location and loading parameters.
data:
  # Root directory containing preprocessed training data
  # Should contain: latents/, audio_latents/, conditions/, reference_latents/, and reference_audio_latents/
  preprocessed_data_root: "/path/to/preprocessed/data"

  # Number of worker processes for data loading
  # Used for parallel data loading to speed up data loading
  num_dataloader_workers: 2

# -----------------------------------------------------------------------------
# Validation Configuration
# -----------------------------------------------------------------------------
# Controls validation sampling during training.
# NOTE: Validation sampling use simplified inference pipelines and prioritizes speed over
# maximum quality. For production-quality inference, use `packages/ltx-pipelines`.
validation:
  # Validation samples — each sample describes a self-contained generation request.
  # For AV2AV IC-LoRA, each sample includes reference video and reference audio conditions.
  samples:
    - prompt: >-
        A man in a casual blue jacket walks along a winding path through a lush green park on a
        bright sunny afternoon. Tall oak trees line the pathway, their leaves rustling gently in
        the breeze. Dappled sunlight creates shifting patterns on the ground as he strolls at a
        relaxed pace, occasionally looking up at the scenery around him. The audio captures
        footsteps on gravel, birds singing in the trees, distant children playing, and the soft
        whisper of wind through the foliage.
      conditions:
        - type: reference
          video: "/path/to/reference_video_1.mp4"
          downscale_factor: 1
          temporal_scale_factor: 1
          include_in_output: true
        - type: reference
          audio: "/path/to/reference_audio_1.wav"
    - prompt: >-
        A fluffy orange tabby cat sits perfectly still on a wooden windowsill, its green eyes
        intently tracking small birds hopping on a branch just outside the glass. The cat's ears
        twitch and rotate, following every movement. Warm afternoon light illuminates its fur,
        creating a soft golden glow. Behind the cat, a cozy living room with a bookshelf and
        houseplants is visible. The audio features gentle purring, occasional soft meows, muffled
        bird chirps through the window, and quiet ambient room sounds.
      conditions:
        - type: reference
          video: "/path/to/reference_video_2.mp4"
          downscale_factor: 1
          temporal_scale_factor: 1
          include_in_output: true
        - type: reference
          audio: "/path/to/reference_audio_2.wav"

  # Negative prompt to avoid unwanted artifacts
  negative_prompt: "worst quality, inconsistent motion, blurry, jittery, distorted"

  # Output video dimensions [width, height, frames]
  # Width and height must be divisible by 32
  # Frames must satisfy: frames % 8 == 1 (e.g., 1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, ...)
  video_dims: [ 512, 512, 81 ]

  # Frame rate for generated videos
  frame_rate: 25.0

  # Random seed for reproducible validation outputs
  seed: 42

  # Number of denoising steps for validation inference
  # Higher values = better quality but slower generation
  inference_steps: 30

  # Generate validation videos every N training steps
  # Set to null to disable validation during training
  interval: 100

  # Classifier-free guidance scale
  # Higher values = stronger adherence to prompt but may introduce artifacts
  guidance_scale: 4.0

  # STG (Spatio-Temporal Guidance) parameters for improved video quality
  # STG is combined with CFG for better temporal coherence
  stg_scale: 1.0  # Recommended: 1.0 (0.0 disables STG)
  stg_blocks: [29]  # Recommended: single block 29
  stg_mode: "stg_av"  # Both video and audio modalities are trained

  # Whether to generate audio in validation samples
  # Can be enabled even when not training the audio branch
  generate_audio: true

  # Skip validation at the beginning of training (step 0)
  skip_initial_validation: false

# -----------------------------------------------------------------------------
# Checkpoint Configuration
# -----------------------------------------------------------------------------
# Controls model checkpoint saving during training.
checkpoints:
  # Save a checkpoint every N steps
  # Set to null to disable intermediate checkpoints
  interval: 250

  # Number of most recent checkpoints to keep
  # Set to -1 to keep all checkpoints
  keep_last_n: 3

  # Precision to use when saving checkpoint weights
  # Options: "bfloat16" (default, smaller files) or "float32" (full precision)
  precision: "bfloat16"

# -----------------------------------------------------------------------------
# Flow Matching Configuration
# -----------------------------------------------------------------------------
# Parameters for the flow matching training objective.
flow_matching:
  # Timestep sampling mode
  # "shifted_logit_normal" is recommended for LTX-2 models
  timestep_sampling_mode: "shifted_logit_normal"

  # Additional parameters for timestep sampling
  timestep_sampling_params: { }

# -----------------------------------------------------------------------------
# Hugging Face Hub Configuration
# -----------------------------------------------------------------------------
# Settings for uploading trained models to the Hugging Face Hub.
hub:
  # Whether to push the trained model to the Hub
  push_to_hub: false

  # Repository ID on Hugging Face Hub (e.g., "username/my-ic-lora-model")
  # Required if push_to_hub is true
  hub_model_id: null

# -----------------------------------------------------------------------------
# Weights & Biases Configuration
# -----------------------------------------------------------------------------
# Settings for experiment tracking with W&B.
wandb:
  # Enable W&B logging
  enabled: false

  # W&B project name
  project: "ltx-2-trainer"

  # W&B username or team (null uses default account)
  entity: null

  # Tags to help organize runs
  tags: [ "ltx2", "ic-lora", "av2av" ]

  # Log validation media (video/audio) to W&B
  log_validation_videos: true

# -----------------------------------------------------------------------------
# General Configuration
# -----------------------------------------------------------------------------
# Global settings for the training run.

# Random seed for reproducibility
seed: 42

# Directory to save outputs (checkpoints, validation videos, logs)
output_dir: "outputs/av2av_ic_lora"
