code: def execute(
      self,
      model: FCNetFFProgressive,
      train_data: DataLoader,
      test_data: DataLoader,
      epochs: int,
      theta: float,
      device: str,
      **kwargs,
  ):
      if self.fetch_model_op.get_model() is None:
          self.fetch_model_op.execute(model)
  
      if self.fetch_data_op.get_train_data() is None:
          self.fetch_data_op.execute(train_data, test_data)
  
      self.model = self.fetch_model_op.get_model()
      self.train_data = self.fetch_data_op.get_train_data()
      self.test_data = self.fetch_data_op.get_test_data()
  
      if (
          self.model is not None
          and self.train_data is not None
          and self.test_data is not None
      ):
          self._train(epochs, theta, device, **kwargs)
  
imports: from abc import ABC, abstractmethod
  import torch
  from nebullvm.operations.base import Operation
  from nebullvm.operations.fetch_operations.local import FetchModelFromLocal
  from torch.utils.data import DataLoader
  from torchvision import datasets
  from forward_forward.operations.data import VOCABULARY
  from forward_forward.operations.fetch_operations import FetchTrainingDataFromLocal
  from forward_forward.utils.labels import LabelsInjector
  from forward_forward.utils.modules import FCNetFFProgressive
  from forward_forward.utils.utils import ProgressiveTrainingDataset, compute_perplexity
label_desc: Use image node_id 3 for calling the BaseForwardForwardTrainer obj's underlying member method code with example usage: obj.execute(model, train_data, test_data, epochs, theta, device) without return types