class_docstr: Apply transform-average-concatenate across channels.
  We're using a version from [2].
  
  Args:
      in_features: Number of input features
      out_features: Number of output features
  
  References:
      [1] Luo et al, End-to-end Microphone Permutation and Number Invariant Multi-channel Speech Separation, 2019
      [2] Yoshioka et al, VarArray: Array-Geometry-Agnostic Continuous Speech Separation, 2022
code: def __init__(
      self, in_features: int, out_features: Optional[int] = None
  ):
      super().__init__()
  
      if out_features is None:
          out_features = in_features
  
      # Parametrize with the total number of features (needs to be divisible by two due to stacking)
      if out_features % 2 != 0:
          raise ValueError(
              f"Number of output features should be divisible by two, currently set to {out_features}"
          )
  
      self.transform_channel = torch.nn.Sequential(
          torch.nn.Linear(in_features, out_features // 2, bias=False),
          torch.nn.ReLU(),
      )
      self.transform_average = torch.nn.Sequential(
          torch.nn.Linear(in_features, out_features // 2, bias=False),
          torch.nn.ReLU(),
      )
  
      logging.debug("Initialized %s with", self.__class__.__name__)
      logging.debug("\tin_features:  %d", in_features)
      logging.debug("\tout_features: %d", out_features)
  
imports: import random
  from typing import Callable, Optional
  import torch
  from nemo.collections.asr.parts.submodules.multi_head_attention import MultiHeadAttention
  from nemo.core.classes import NeuralModule, typecheck
  from nemo.core.neural_types import AudioSignal, FloatType, NeuralType, SpectrogramType
  from nemo.utils import logging
label_desc: Use image node_id 1 to create a new TransformAverageConcatenate object from inherited base classes: NeuralModule with example: obj = TransformAverageConcatenate(in_features, out_features)