class_docstr: A repeat-to-match block.
  This blocks takes two tensors and a dimension index as an input. Then when it's
  forward method is called, it matches the specified the dimension (with :param repeat_at_idx) of the first
  tensor with the specified dimension (:param repeat_at_idx)  of the second tensor. This is done by repeating the
  first tensor n times in dimension in dimension :param repeat_at_idx.
  Here n = tensor_1.shape[repeat_at_idx] - tensor_0.shape[repeat_at_idx]. As a constraint the first tensor has to
  satisfy the following condition: tensor_0[repeat_at_idx] == 1
  
  :param in_keys: The keys identifying the input tensors.
  :param out_keys: One key identifying the output tensors.
  :param in_shapes: List of input shapes.
  :param repeat_at_idx: Specify the dimension that should be matched between the tensors.
code: def __repr__(self):
      txt = f"{self.__class__.__name__}"
      txt += f"\n\trepeat_at_idx: {self.repeat_at_idx}"
      txt += f"\n\tOut Shapes: {self.out_shapes()}"
      return txt
  
file_path: maze/maze/perception/blocks/general/repeat_to_match.py
imports: from typing import Union, List, Sequence, Dict
  import torch
  from maze.core.annotations import override
  from maze.perception.blocks.base import PerceptionBlock
label_desc: Use image node_id 3 for calling the RepeatToMatchBlock obj's underlying member method code with example usage: obj.__repr__() and returns: txt