compile method

void compile()

Compiles the static training tapes for forward execution, backpropagation, and optimization. It allocates all layer parameters in VRAM, chains their forward passes, and records the gradient memory lifecycle.

Implementation

void compile() {
  trainForward = CommandBuffer();
  trainBackward = CommandBuffer();
  trainOptimize = CommandBuffer();

  GPUTensor<dynamic> current = input;
  for (int i = 0; i < layers.length; i = i + 1) {
    layers[i].build(current);
    current = layers[i].forward(current, trainForward, <GPUTensor>[]);
  }

  if (lossFunction != null && target != null) {
    if (current is! GPUTensor<OutputType>) {
      throw StateError('[SeqModel Compile Error] Architecture Mismatch:\n'
          'The Sequential Model expects an output of type GPUTensor<$OutputType> to calculate the loss, '
          'but the final layer returned a ${current.runtimeType}.\n'
          'Please ensure the last TapeLayer matches your SeqModel definition.');
    }
    loss = lossFunction!(current, target!, trainForward);
  }

  if (loss != null) {
    loss!.backward(trainBackward);
  }

  if (optimizerBuilder != null) {
    List<GPUTensor> allParams = <GPUTensor>[];
    for (int i = 0; i < layers.length; i = i + 1) {
      List<GPUTensor> layerParams = layers[i].parameters;
      for (int j = 0; j < layerParams.length; j = j + 1) {
        allParams.add(layerParams[j]);
      }
    }
    optimizer = optimizerBuilder!(allParams);
  }

  if (optimizer != null) {
    optimizer!.step(trainOptimize);
    optimizer!.zeroGrad(trainOptimize);
  }

  for (int i = 0; i < layers.length; i = i + 1) {
    layers[i].zeroStates(trainOptimize);
  }

  input.zeroGrad(trainOptimize);
  if (loss != null) {
    loss!.zeroGrad(trainOptimize);
  }
}