text: """
  A2T (A2T: Attack for Adversarial Training Recipe)
  ==================================================
  
  """
  
  from textattack import Attack
  from textattack.constraints.grammaticality import PartOfSpeech
  from textattack.constraints.pre_transformation import (
      InputColumnModification,
      MaxModificationRate,
      RepeatModification,
      StopwordModification,
  )
  from textattack.constraints.semantics import WordEmbeddingDistance
  from textattack.constraints.semantics.sentence_encoders import BERT
  from textattack.goal_functions import UntargetedClassification
  from textattack.search_methods import GreedyWordSwapWIR
  from textattack.transformations import WordSwapEmbedding, WordSwapMaskedLM
  
  from .attack_recipe import AttackRecipe
  
  
  class A2TYoo2021(AttackRecipe):
      """Towards Improving Adversarial Training of NLP Models.
  
      (Yoo et al., 2021)
  
      https://arxiv.org/abs/2109.00544
      """
  
      @staticmethod
      def build(model_wrapper, mlm=False):
          """Build attack recipe.
  
          Args:
              model_wrapper (:class:`~textattack.models.wrappers.ModelWrapper`):
                  Model wrapper containing both the model and the tokenizer.
              mlm (:obj:`bool`, `optional`, defaults to :obj:`False`):
                  If :obj:`True`, load `A2T-MLM` attack. Otherwise, load regular `A2T` attack.
  
          Returns:
              :class:`~textattack.Attack`: A2T attack.
          """
          constraints = [RepeatModification(), StopwordModification()]
          input_column_modification = InputColumnModification(
              ["premise", "hypothesis"], {"premise"}
          )
          constraints.append(input_column_modification)
          constraints.append(PartOfSpeech(allow_verb_noun_swap=False))
          constraints.append(MaxModificationRate(max_rate=0.1, min_threshold=4))
          sent_encoder = BERT(
              model_name="stsb-distilbert-base", threshold=0.9, metric="cosine"
          )
          constraints.append(sent_encoder)
  
          if mlm:
              transformation = transformation = WordSwapMaskedLM(
                  method="bae", max_candidates=20, min_confidence=0.0, batch_size=16
              )
          else:
              transformation = WordSwapEmbedding(max_candidates=20)
              constraints.append(WordEmbeddingDistance(min_cos_sim=0.8))
  
          #
          # Goal is untargeted classification
          #
          goal_function = UntargetedClassification(model_wrapper, model_batch_size=32)
          #
          # Greedily swap words with "Word Importance Ranking".
          #
          search_method = GreedyWordSwapWIR(wir_method="gradient")
  
          return Attack(goal_function, constraints, transformation, search_method)
  