class_docstr: Processes the output of both `SparseArch` (sparse_features) and `DenseArch`
  (dense_features). Returns the output of a Deep Cross Net v2
  https://arxiv.org/pdf/2008.13535.pdf with a low rank approximation for the
  weight matrix. The input and output sizes are the same for this
  interaction layer (F*D + D).
  
  .. note::
      The dimensionality of the `dense_features` (D) is expected to match the
      dimensionality of the `sparse_features` so that the dot products between them
      can be computed.
  
  
  Args:
      num_sparse_features (int): F.
  
  Example::
  
      D = 3
      B = 10
      keys = ["f1", "f2"]
      F = len(keys)
      DCN = LowRankCrossNet(
          in_features = F*D+D,
          dcn_num_layers = 2,
          dnc_low_rank_dim = 4,
      )
      inter_arch = InteractionDCNArch(
          num_sparse_features=len(keys),
          crossnet=DCN,
      )
  
      dense_features = torch.rand((B, D))
      sparse_features = torch.rand((B, F, D))
  
      #  B X (F*D + D)
      concat_dense = inter_arch(dense_features, sparse_features)
class_docstr_tok: ["Processes","the","output","of","both","`","SparseArch","`","(","sparse_features",")","and","`","DenseArch","`","(","dense_features",")",".","Returns","the","output","of","a","Deep","Cross","Net","v2","https",":","\/\/arxiv.org\/pdf\/2008.13535.pdf","with","a","low","rank","approximation","for","the","weight","matrix",".","The","input","and","output","sizes","are","the","same","for","this","interaction","layer","(","F","*","D","+","D",")",".","..","note",":",":","The","dimensionality","of","the","`","dense_features","`","(","D",")","is","expected","to","match","the","dimensionality","of","the","`","sparse_features","`","so","that","the","dot","products","between","them","can","be","computed",".","Args",":","num_sparse_features","(","int",")",":","F.","Example",":",":","D","=","3","B","=","10","keys","=","[","``","f1","''",",","``","f2","''","]","F","=","len","(","keys",")","DCN","=","LowRankCrossNet","(","in_features","=","F","*","D+D",",","dcn_num_layers","=","2",",","dnc_low_rank_dim","=","4",",",")","inter_arch","=","InteractionDCNArch","(","num_sparse_features=len","(","keys",")",",","crossnet=DCN",",",")","dense_features","=","torch.rand","(","(","B",",","D",")",")","sparse_features","=","torch.rand","(","(","B",",","F",",","D",")",")","#","B","X","(","F","*","D","+","D",")","concat_dense","=","inter_arch","(","dense_features",",","sparse_features",")"]
code: def __init__(
      self, num_sparse_features: int, crossnet: nn.Module
  ) -> None:
      super().__init__()
      self.F: int = num_sparse_features
      self.crossnet = crossnet
  
imports: from typing import Dict, List, Optional, Tuple
  import torch
  from torch import nn
  from torchrec.datasets.utils import Batch
  from torchrec.modules.crossnet import LowRankCrossNet
  from torchrec.modules.embedding_modules import EmbeddingBagCollection
  from torchrec.modules.mlp import MLP
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor, KeyedTensor
label_desc: Use image node_id 1 to create a new InteractionDCNArch object from inherited base classes: nn with example: obj = InteractionDCNArch(num_sparse_features, crossnet)