class_docstr: Simple version of a sequence tower embedding model.
  
  Args:
      tables: List[EmbeddingBagConfig],
      num_float_features: int,
      weighted_tables: Optional[List[EmbeddingConfig]],
      embedding_groups: Optional[Dict[str, List[str]]],
      dense_device: Optional[torch.device],
      sparse_device: Optional[torch.device],
  
  Call Args:
      input: ModelInput,
  
  Returns:
      torch.Tensor
  
  Example:
      >>> TestSequenceTowerInteraction()
class_docstr_tok: ["Simple","version","of","a","sequence","tower","embedding","model",".","Args",":","tables",":","List","[","EmbeddingBagConfig","]",",","num_float_features",":","int",",","weighted_tables",":","Optional","[","List","[","EmbeddingConfig","]","]",",","embedding_groups",":","Optional","[","Dict","[","str",",","List","[","str","]","]","]",",","dense_device",":","Optional","[","torch.device","]",",","sparse_device",":","Optional","[","torch.device","]",",","Call","Args",":","input",":","ModelInput",",","Returns",":","torch.Tensor","Example",":",">",">",">","TestSequenceTowerInteraction","(",")"]
code: def __init__(
      self,
      tables: List[EmbeddingConfig],
      num_float_features: int = 10,
      weighted_tables: Optional[List[EmbeddingConfig]] = None,
      embedding_groups: Optional[Dict[str, List[str]]] = None,
      dense_device: Optional[torch.device] = None,
      sparse_device: Optional[torch.device] = None,
      feature_processor_modules: Optional[
          Dict[str, torch.nn.Module]
      ] = None,
  ) -> None:
      super().__init__(
          tables=cast(List[BaseEmbeddingConfig], tables),
          weighted_tables=cast(
              Optional[List[BaseEmbeddingConfig]], weighted_tables
          ),
          embedding_groups=embedding_groups,
          dense_device=dense_device,
          sparse_device=sparse_device,
      )
  
      self.dense = TestDenseArch(num_float_features, dense_device)
      # current planner put table_0 and table_3 on the same node
      # while table_1 and table_2 are on the other node
      # TODO: after adding planner support for tower_module, we can random assign
      # tables to towers
      t0_tables = [tables[0], tables[2]]
      t0_emb_names = []
      for table in t0_tables:
          t0_emb_names += table.feature_names
      embedding_dim = tables[0].embedding_dim
  
      t1_tables = [tables[1], tables[3]]
      t1_emb_names = []
      for table in t1_tables:
          t1_emb_names += table.feature_names
  
      self.tower_0 = EmbeddingTower(
          embedding_module=EmbeddingCollection(tables=t0_tables),
          interaction_module=TestSequenceTowerInteraction(
              embedding_names=t0_emb_names,
              embedding_dim=embedding_dim,
          ),
      )
      self.tower_1 = EmbeddingTower(
          embedding_module=EmbeddingCollection(tables=t1_tables),
          interaction_module=TestSequenceTowerInteraction(
              embedding_names=t1_emb_names,
              embedding_dim=embedding_dim,
          ),
      )
      self.over = nn.Linear(
          in_features=8
          + self.tower_0.interaction.linear.out_features
          + self.tower_1.interaction.linear.out_features,
          out_features=16,
          device=dense_device,
      )
  
imports: from typing import cast, Dict, List, Optional, Tuple, Union
  import torch
  import torch.nn
  from torchrec.distributed.embedding import EmbeddingCollectionSharder
  from torchrec.distributed.fbgemm_qcomm_codec import get_qcomm_codecs_registry, QCommsConfig
  from torchrec.distributed.test_utils.test_model import ModelInput, TestDenseArch, TestSparseNNBase
  from torchrec.modules.embedding_configs import BaseEmbeddingConfig, EmbeddingConfig
  from torchrec.modules.embedding_modules import EmbeddingCollection
  from torchrec.modules.embedding_tower import EmbeddingTower
  from torchrec.sparse.jagged_tensor import JaggedTensor, KeyedJaggedTensor
label_desc: Use image node_id 1 to create a new TestSequenceTowerSparseNN object from inherited base classes: TestSparseNNBase with example: obj = TestSequenceTowerSparseNN(tables, num_float_features, weighted_tables, embedding_groups, dense_device, sparse_device, feature_processor_modules)