





import warnings
from pathlib import Path
from typing import List, Tuple, Union

import fire
from torch import nn

from transformers import AutoModelForSeqaSeqLM, AutoTokenizer, PreTrainedModel
from transformers.utils import logging


UpperCAmelCase_           =	logging.get_logger(__name__)
def      A__       (    SCREAMING_SNAKE_CASE_   :      nn.ModuleList				,	SCREAMING_SNAKE_CASE_   :      nn.ModuleList				,	SCREAMING_SNAKE_CASE_   :      List[int]						)  ->  None:






   """simple docstring"""







   _UpperCAmelCase           =   nn.ModuleList([src_layers[i] for i in layers_to_copy]						)
   assert len(SCREAMING_SNAKE_CASE_						) == len(SCREAMING_SNAKE_CASE_						), F'''{len(SCREAMING_SNAKE_CASE_						)} != {len(SCREAMING_SNAKE_CASE_						)}'''
   dest_layers.load_state_dict(layers_to_copy.state_dict()						)


UpperCAmelCase_           =	{
    # maps  num layers in teacher -> num_layers in student -> which teacher layers to copy.
    # 12: bart, 16: pegasus, 6: marian/Helsinki-NLP
    12: {
        1: [0],  # This says that if the teacher has 12 layers and the student has 1, copy layer 0 of the teacher
        2: [0, 6],
        3: [0, 6, 11],
        4: [0, 4, 8, 11],
        6: [0, 2, 4, 7, 9, 11],
        9: [0, 1, 2, 4, 5, 7, 9, 10, 11],
        12: list(range(12)),
    },
    16: {  # maps  num layers in student -> which teacher layers to copy
        1: [0],
        2: [0, 15],
        3: [0, 8, 15],
        4: [0, 5, 10, 15],
        6: [0, 3, 6, 9, 12, 15],
        8: [0, 2, 4, 6, 8, 10, 12, 15],
        9: [0, 1, 3, 5, 7, 9, 11, 13, 15],
        12: [0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15],
        16: list(range(16)),
    },
    6: {1: [0], 2: [0, 5], 3: [0, 2, 5], 4: [0, 1, 3, 5], 6: list(range(6))},
}
UpperCAmelCase_           =	{
    # maps  num layers in student -> which teacher layers to copy.
    6: {1: [5], 2: [3, 5], 3: [1, 4, 5], 4: [1, 2, 4, 5]},
    12: {1: [11], 2: [5, 11], 3: [3, 7, 11], 6: [1, 3, 5, 8, 10, 11]},
    16: {1: [15], 4: [4, 9, 12, 15], 8: [1, 3, 5, 7, 9, 11, 13, 15]},
}
def      A__       (    SCREAMING_SNAKE_CASE_   :      Optional[Any]				,	SCREAMING_SNAKE_CASE_   :      Any						)  ->  str:






   """simple docstring"""







   try:
      _UpperCAmelCase           =   LAYERS_TO_COPY[n_teacher][n_student]
      return val
   except KeyError:
      if n_student != n_teacher:
         warnings.warn(
             F'''no hardcoded layers to copy for teacher {n_teacher} -> student {n_student}, defaulting to first'''
             F''' {n_student}'''						)
      return list(range(SCREAMING_SNAKE_CASE_						)						)
def      A__       (    SCREAMING_SNAKE_CASE_   :      List[Any]				,	SCREAMING_SNAKE_CASE_   :      Tuple						)  ->  List[int]:






   """simple docstring"""







   if n_student > n_teacher:
      raise ValueError(F'''Cannot perform intermediate supervision for student {n_student} > teacher {n_teacher}'''						)
   elif n_teacher == n_student:
      return list(range(SCREAMING_SNAKE_CASE_						)						)
   elif n_student == 1:
      return [n_teacher - 1]
   else:
      return LAYERS_TO_SUPERVISE[n_teacher][n_student]
def      A__       (    SCREAMING_SNAKE_CASE_   :      Union[str, PreTrainedModel]				,	SCREAMING_SNAKE_CASE_   :      Union[str, Path] = "student"				,	SCREAMING_SNAKE_CASE_   :      Union[int, None] = None				,	SCREAMING_SNAKE_CASE_   :      Union[int, None] = None				,	SCREAMING_SNAKE_CASE_   :      List[Any]=False				,	SCREAMING_SNAKE_CASE_   :      Dict=None				,	SCREAMING_SNAKE_CASE_   :      Union[str, Any]=None				,	**SCREAMING_SNAKE_CASE_   :      int				,	)  ->  Tuple[PreTrainedModel, List[int], List[int]]:






   """simple docstring"""







   _UpperCAmelCase           =   '''encoder_layers and decoder_layers cannot be both None-- you would just have an identical teacher.'''
   assert (e is not None) or (d is not None), _msg
   if isinstance(SCREAMING_SNAKE_CASE_				,	SCREAMING_SNAKE_CASE_						):
      AutoTokenizer.from_pretrained(SCREAMING_SNAKE_CASE_						).save_pretrained(SCREAMING_SNAKE_CASE_						)  # purely for convenience
      _UpperCAmelCase           =   AutoModelForSeqaSeqLM.from_pretrained(SCREAMING_SNAKE_CASE_						).eval()
   else:
      assert isinstance(SCREAMING_SNAKE_CASE_				,	SCREAMING_SNAKE_CASE_						), F'''teacher must be a model or string got type {type(SCREAMING_SNAKE_CASE_						)}'''
   _UpperCAmelCase           =   teacher.config.to_diff_dict()

   try:
      _UpperCAmelCase       ,      _UpperCAmelCase           =   teacher.config.encoder_layers, teacher.config.decoder_layers
      if e is None:
         _UpperCAmelCase           =   teacher_e
      if d is None:
         _UpperCAmelCase           =   teacher_d
      init_kwargs.update({'''encoder_layers''': e, '''decoder_layers''': d}						)
   except AttributeError:  # T5
      if hasattr(teacher.config				,	'''num_encoder_layers'''						):
         _UpperCAmelCase       ,      _UpperCAmelCase           =   teacher.config.num_encoder_layers, teacher.config.num_decoder_layers
      else:
         _UpperCAmelCase       ,      _UpperCAmelCase           =   teacher.config.num_layers, teacher.config.num_decoder_layers
      if e is None:
         _UpperCAmelCase           =   teacher_e
      if d is None:
         _UpperCAmelCase           =   teacher_d
      if hasattr(teacher.config				,	'''num_encoder_layers'''						):
         init_kwargs.update({'''num_encoder_layers''': e, '''num_decoder_layers''': d}						)
      else:
         init_kwargs.update({'''num_layers''': e, '''num_decoder_layers''': d}						)

    # Kwargs to instantiate student: teacher kwargs with updated layer numbers + **extra_config_kwargs
   init_kwargs.update(SCREAMING_SNAKE_CASE_						)

   # Copy weights
   _UpperCAmelCase           =   teacher.config_class(**SCREAMING_SNAKE_CASE_						)
   _UpperCAmelCase           =   AutoModelForSeqaSeqLM.from_config(SCREAMING_SNAKE_CASE_						)
   # Start by copying the full teacher state dict this will copy the first N teacher layers to the student.
   _UpperCAmelCase           =   student.load_state_dict(teacher.state_dict()				,	strict=SCREAMING_SNAKE_CASE_						)
   assert info.missing_keys == [], info.missing_keys  # every student key should have a teacher keys.

   if copy_first_teacher_layers:  # Our copying is done. We just log and save
      _UpperCAmelCase       ,      _UpperCAmelCase           =   list(range(SCREAMING_SNAKE_CASE_						)						), list(range(SCREAMING_SNAKE_CASE_						)						)
      logger.info(
          F'''Copied encoder layers {e_layers_to_copy} and decoder layers {d_layers_to_copy}. Saving them to'''
          F''' {save_path}'''						)
      student.save_pretrained(SCREAMING_SNAKE_CASE_						)
      return student, e_layers_to_copy, d_layers_to_copy

   # Decide which layers of the teacher to copy. Not exactly alternating -- we try to keep first and last layer.
   if e_layers_to_copy is None:
      _UpperCAmelCase           =   pick_layers_to_copy(SCREAMING_SNAKE_CASE_				,	SCREAMING_SNAKE_CASE_						)
   if d_layers_to_copy is None:
      _UpperCAmelCase           =   pick_layers_to_copy(SCREAMING_SNAKE_CASE_				,	SCREAMING_SNAKE_CASE_						)

   try:
      if hasattr(
          SCREAMING_SNAKE_CASE_				,	'''prophetnet'''						):  # For ProphetNet, student.model.encoder.layers is called student.prophetnet.encoder.layers
         copy_layers(teacher.prophetnet.encoder.layers				,	student.prophetnet.encoder.layers				,	SCREAMING_SNAKE_CASE_						)
         copy_layers(teacher.prophetnet.decoder.layers				,	student.prophetnet.decoder.layers				,	SCREAMING_SNAKE_CASE_						)
      else:
         copy_layers(teacher.model.encoder.layers				,	student.model.encoder.layers				,	SCREAMING_SNAKE_CASE_						)
         copy_layers(teacher.model.decoder.layers				,	student.model.decoder.layers				,	SCREAMING_SNAKE_CASE_						)
   except AttributeError:  # For t5, student.model.encoder.layers is called student.encoder.block
      copy_layers(teacher.encoder.block				,	student.encoder.block				,	SCREAMING_SNAKE_CASE_						)
      copy_layers(teacher.decoder.block				,	student.decoder.block				,	SCREAMING_SNAKE_CASE_						)
   logger.info(
       F'''Copied encoder layers {e_layers_to_copy} and decoder layers {d_layers_to_copy}. Saving them to {save_path}'''						)
   _UpperCAmelCase           =   {
       '''teacher_type''': teacher.config.model_type,
       '''copied_encoder_layers''': e_layers_to_copy,
       '''copied_decoder_layers''': d_layers_to_copy,
   }
   student.save_pretrained(SCREAMING_SNAKE_CASE_						)
   # Save information about copying for easier reproducibility

   return student, e_layers_to_copy, d_layers_to_copy


if __name__ == "__main__":
   fire.Fire(create_student_by_copying_alternating_layers)




"""simple docstring"""




import random

import torch
from huggingface_hub import HfApi

from diffusers import UNetaDModel


_lowerCAmelCase							:   Any				=				HfApi()

_lowerCAmelCase							:   int				=				{}
# fmt: off
_lowerCAmelCase							:   List[Any]				=				torch.tensor([
    -0.7_5_1_5, -1.6_8_8_3, 0.2_4_2_0, 0.0_3_0_0, 0.6_3_4_7, 1.3_4_3_3, -1.1_7_4_3, -3.7_4_6_7,
    1.2_3_4_2, -2.2_4_8_5, 0.4_6_3_6, 0.8_0_7_6, -0.7_9_9_1, 0.3_9_6_9, 0.8_4_9_8, 0.9_1_8_9,
    -1.8_8_8_7, -3.3_5_2_2, 0.7_6_3_9, 0.2_0_4_0, 0.6_2_7_1, -2.7_1_4_8, -1.6_3_1_6, 3.0_8_3_9,
    0.3_1_8_6, 0.2_7_2_1, -0.9_7_5_9, -1.2_4_6_1, 2.6_2_5_7, 1.3_5_5_7
])
_lowerCAmelCase							:   Any				=				torch.tensor([
    -2.3_6_3_9, -2.5_3_4_4, 0.0_0_5_4, -0.6_6_7_4, 1.5_9_9_0, 1.0_1_5_8, 0.3_1_2_4, -2.1_4_3_6,
    1.8_7_9_5, -2.5_4_2_9, -0.1_5_6_6, -0.3_9_7_3, 1.2_4_9_0, 2.6_4_4_7, 1.2_2_8_3, -0.5_2_0_8,
    -2.8_1_5_4, -3.5_1_1_9, 2.3_8_3_8, 1.2_0_3_3, 1.7_2_0_1, -2.1_2_5_6, -1.4_5_7_6, 2.7_9_4_8,
    2.4_2_0_4, -0.9_7_5_2, -1.2_5_4_6, 0.8_0_2_7, 3.2_7_5_8, 3.1_3_6_5
])
_lowerCAmelCase							:   List[str]				=				torch.tensor([
    -0.6_5_3_1, -0.6_8_9_1, -0.3_1_7_2, -0.5_3_7_5, -0.9_1_4_0, -0.5_3_6_7, -0.1_1_7_5, -0.7_8_6_9,
    -0.3_8_0_8, -0.4_5_1_3, -0.2_0_9_8, -0.0_0_8_3, 0.3_1_8_3, 0.5_1_4_0, 0.2_2_4_7, -0.1_3_0_4,
    -0.1_3_0_2, -0.2_8_0_2, -0.2_0_8_4, -0.2_0_2_5, -0.4_9_6_7, -0.4_8_7_3, -0.0_8_6_1, 0.6_9_2_5,
    0.0_2_5_0, 0.1_2_9_0, -0.1_5_4_3, 0.6_3_1_6, 1.0_4_6_0, 1.4_9_4_3
])
_lowerCAmelCase							:   Optional[int]				=				torch.tensor([
    0.0_9_1_1, 0.1_1_0_7, 0.0_1_8_2, 0.0_4_3_5, -0.0_8_0_5, -0.0_6_0_8, 0.0_3_8_1, 0.2_1_7_2,
    -0.0_2_8_0, 0.1_3_2_7, -0.0_2_9_9, -0.0_2_5_5, -0.0_0_5_0, -0.1_1_7_0, -0.1_0_4_6, 0.0_3_0_9,
    0.1_3_6_7, 0.1_7_2_8, -0.0_5_3_3, -0.0_7_4_8, -0.0_5_3_4, 0.1_6_2_4, 0.0_3_8_4, -0.1_8_0_5,
    -0.0_7_0_7, 0.0_6_4_2, 0.0_2_2_0, -0.0_1_3_4, -0.1_3_3_3, -0.1_5_0_5
])
_lowerCAmelCase							:   List[Any]				=				torch.tensor([
    0.1_3_2_1, 0.1_3_3_7, 0.0_4_4_0, 0.0_6_2_2, -0.0_5_9_1, -0.0_3_7_0, 0.0_5_0_3, 0.2_1_3_3,
    -0.0_1_7_7, 0.1_4_1_5, -0.0_1_1_6, -0.0_1_1_2, 0.0_0_4_4, -0.0_9_8_0, -0.0_7_8_9, 0.0_3_9_5,
    0.1_5_0_2, 0.1_7_8_5, -0.0_4_8_8, -0.0_5_1_4, -0.0_4_0_4, 0.1_5_3_9, 0.0_4_5_4, -0.1_5_5_9,
    -0.0_6_6_5, 0.0_6_5_9, 0.0_3_8_3, -0.0_0_0_5, -0.1_2_6_6, -0.1_3_8_6
])
_lowerCAmelCase							:   Optional[int]				=				torch.tensor([
    0.1_1_5_4, 0.1_2_1_8, 0.0_3_0_7, 0.0_5_2_6, -0.0_7_1_1, -0.0_5_4_1, 0.0_3_6_6, 0.2_0_7_8,
    -0.0_2_6_7, 0.1_3_1_7, -0.0_2_2_6, -0.0_1_9_3, -0.0_0_1_4, -0.1_0_5_5, -0.0_9_0_2, 0.0_3_3_0,
    0.1_3_9_1, 0.1_7_0_9, -0.0_5_6_2, -0.0_6_9_3, -0.0_5_6_0, 0.1_4_8_2, 0.0_3_8_1, -0.1_6_8_3,
    -0.0_6_8_1, 0.0_6_6_1, 0.0_3_3_1, -0.0_0_4_6, -0.1_2_6_8, -0.1_4_3_1
])
_lowerCAmelCase							:   Optional[Any]				=				torch.tensor([
    0.1_1_9_2, 0.1_2_4_0, 0.0_4_1_4, 0.0_6_0_6, -0.0_5_5_7, -0.0_4_1_2, 0.0_4_3_0, 0.2_0_4_2,
    -0.0_2_0_0, 0.1_3_8_5, -0.0_1_1_5, -0.0_1_3_2, 0.0_0_1_7, -0.0_9_6_5, -0.0_8_0_2, 0.0_3_9_8,
    0.1_4_3_3, 0.1_7_4_7, -0.0_4_5_8, -0.0_5_3_3, -0.0_4_0_7, 0.1_5_4_5, 0.0_4_1_9, -0.1_5_7_4,
    -0.0_6_4_5, 0.0_6_2_6, 0.0_3_4_1, -0.0_0_1_0, -0.1_1_9_9, -0.1_3_9_0
])
_lowerCAmelCase							:   List[str]				=				torch.tensor([
    0.1_0_7_5, 0.1_0_7_4, 0.0_2_0_5, 0.0_4_3_1, -0.0_7_7_4, -0.0_6_0_7, 0.0_2_9_8, 0.2_0_4_2,
    -0.0_3_2_0, 0.1_2_6_7, -0.0_2_8_1, -0.0_2_5_0, -0.0_0_6_4, -0.1_0_9_1, -0.0_9_4_6, 0.0_2_9_0,
    0.1_3_2_8, 0.1_6_5_0, -0.0_5_8_0, -0.0_7_3_8, -0.0_5_8_6, 0.1_4_4_0, 0.0_3_3_7, -0.1_7_4_6,
    -0.0_7_1_2, 0.0_6_0_5, 0.0_2_5_0, -0.0_0_9_9, -0.1_3_1_6, -0.1_4_7_3
])
_lowerCAmelCase							:   Any				=				torch.tensor([
    -1.4_5_7_2, -2.0_4_8_1, -0.0_4_1_4, -0.6_0_0_5, 1.4_1_3_6, 0.5_8_4_8, 0.4_0_2_8, -2.7_3_3_0,
    1.2_2_1_2, -2.1_2_2_8, 0.2_1_5_5, 0.4_0_3_9, 0.7_6_6_2, 2.0_5_3_5, 0.7_4_7_7, -0.3_2_4_3,
    -2.1_7_5_8, -2.7_6_4_8, 1.6_9_4_7, 0.7_0_2_6, 1.2_3_3_8, -1.6_0_7_8, -0.8_6_8_2, 2.2_8_1_0,
    1.8_5_7_4, -0.5_7_1_8, -0.5_5_8_6, -0.0_1_8_6, 2.3_4_1_5, 2.1_2_5_1])
_lowerCAmelCase							:   int				=				torch.tensor([
    -1.3_6_9_0, -1.9_7_2_0, -0.4_0_9_0, -0.6_9_6_6, 1.4_6_6_0, 0.9_9_3_8, -0.1_3_8_5, -2.7_3_2_4,
    0.7_7_3_6, -1.8_9_1_7, 0.2_9_2_3, 0.4_2_9_3, 0.1_6_9_3, 1.4_1_1_2, 1.1_8_8_7, -0.3_1_8_1,
    -2.2_1_6_0, -2.6_3_8_1, 1.3_1_7_0, 0.8_1_6_3, 0.9_2_4_0, -1.6_5_4_4, -0.6_0_9_9, 2.5_2_5_9,
    1.6_4_3_0, -0.9_0_9_0, -0.9_3_9_2, -0.0_1_2_6, 2.4_2_6_8, 2.3_2_6_6
])
_lowerCAmelCase							:   Union[str, Any]				=				torch.tensor([
    -1.3_5_2_5, -1.9_6_2_8, -0.3_9_5_6, -0.6_8_6_0, 1.4_6_6_4, 1.0_0_1_4, -0.1_2_5_9, -2.7_2_1_2,
    0.7_7_7_2, -1.8_8_1_1, 0.2_9_9_6, 0.4_3_8_8, 0.1_7_0_4, 1.4_0_2_9, 1.1_7_0_1, -0.3_0_2_7,
    -2.2_0_5_3, -2.6_2_8_7, 1.3_3_5_0, 0.8_1_3_1, 0.9_2_7_4, -1.6_2_9_2, -0.6_0_9_8, 2.5_1_3_1,
    1.6_5_0_5, -0.8_9_5_8, -0.9_2_9_8, -0.0_1_5_1, 2.4_2_5_7, 2.3_3_5_5
])
_lowerCAmelCase							:   str				=				torch.tensor([
    -2.0_5_8_5, -2.7_8_9_7, -0.2_8_5_0, -0.8_9_4_0, 1.9_0_5_2, 0.5_7_0_2, 0.6_3_4_5, -3.8_9_5_9,
    1.5_9_3_2, -3.2_3_1_9, 0.1_9_7_4, 0.0_2_8_7, 1.7_5_6_6, 2.6_5_4_3, 0.8_3_8_7, -0.5_3_5_1,
    -3.2_7_3_6, -4.3_3_7_5, 2.9_0_2_9, 1.6_3_9_0, 1.4_6_4_0, -2.1_7_0_1, -1.9_0_1_3, 2.9_3_4_1,
    3.4_9_8_1, -0.6_2_5_5, -1.1_6_4_4, -0.1_5_9_1, 3.7_0_9_7, 3.2_0_6_6
])
_lowerCAmelCase							:   Optional[int]				=				torch.tensor([
    -2.3_1_3_9, -2.5_5_9_4, -0.0_1_9_7, -0.6_7_8_5, 1.7_0_0_1, 1.1_6_0_6, 0.3_0_7_5, -2.1_7_4_0,
    1.8_0_7_1, -2.5_6_3_0, -0.0_9_2_6, -0.3_8_1_1, 1.2_1_1_6, 2.6_2_4_6, 1.2_7_3_1, -0.5_3_9_8,
    -2.8_1_5_3, -3.6_1_4_0, 2.3_8_9_3, 1.3_2_6_2, 1.6_2_5_8, -2.1_8_5_6, -1.3_2_6_7, 2.8_3_9_5,
    2.3_7_7_9, -1.0_6_2_3, -1.2_4_6_8, 0.8_9_5_9, 3.3_3_6_7, 3.2_2_4_3
])
_lowerCAmelCase							:   Union[str, Any]				=				torch.tensor([
    -2.0_6_2_8, -2.7_6_6_7, -0.2_0_8_9, -0.8_2_6_3, 2.0_5_3_9, 0.5_9_9_2, 0.6_4_9_5, -3.8_3_3_6,
    1.6_0_2_5, -3.2_8_1_7, 0.1_7_2_1, -0.0_6_3_3, 1.7_5_1_6, 2.7_0_3_9, 0.8_1_0_0, -0.5_9_0_8,
    -3.2_1_1_3, -4.4_3_4_3, 2.9_2_5_7, 1.3_6_3_2, 1.5_5_6_2, -2.1_4_8_9, -1.9_8_9_4, 3.0_5_6_0,
    3.3_3_9_6, -0.7_3_2_8, -1.0_4_1_7, 0.0_3_8_3, 3.7_0_9_3, 3.2_3_4_3
])
_lowerCAmelCase							:   Any				=				torch.tensor([
    -1.4_5_7_4, -2.0_5_6_9, -0.0_4_7_3, -0.6_1_1_7, 1.4_0_1_8, 0.5_7_6_9, 0.4_1_2_9, -2.7_3_4_4,
    1.2_2_4_1, -2.1_3_9_7, 0.2_0_0_0, 0.3_9_3_7, 0.7_6_1_6, 2.0_4_5_3, 0.7_3_2_4, -0.3_3_9_1,
    -2.1_7_4_6, -2.7_7_4_4, 1.6_9_6_3, 0.6_9_2_1, 1.2_1_8_7, -1.6_1_7_2, -0.8_8_7_7, 2.2_4_3_9,
    1.8_4_7_1, -0.5_8_3_9, -0.5_6_0_5, -0.0_4_6_4, 2.3_2_5_0, 2.1_2_1_9
])
# fmt: on

_lowerCAmelCase							:   Optional[Any]				=				api.list_models(filter="diffusers")
for mod in models:
 if "google" in mod.author or mod.modelId == "CompVis/ldm-celebahq-256":
  _lowerCAmelCase							:   List[Any]				=				"/home/patrick/google_checkpoints/" + mod.modelId.split("/")[-1]

  print(F"Started running {mod.modelId}!!!")

  if mod.modelId.startswith("CompVis"):
   _lowerCAmelCase							:   Tuple				=				UNetaDModel.from_pretrained(local_checkpoint, subfolder="unet")
  else:
   _lowerCAmelCase							:   List[Any]				=				UNetaDModel.from_pretrained(local_checkpoint)

  torch.manual_seed(0)
  random.seed(0)

  _lowerCAmelCase							:   Optional[Any]				=				torch.randn(1, model.config.in_channels, model.config.sample_size, model.config.sample_size)
  _lowerCAmelCase							:   Tuple				=				torch.tensor([10] * noise.shape[0])
  with torch.no_grad():
   _lowerCAmelCase							:   Optional[Any]				=				model(noise, time_step).sample

  assert torch.allclose(
      logits[0, 0, 0, :30], results["_".join("_".join(mod.modelId.split("/")).split("-"))], atol=1E-3
  )
  print(F"{mod.modelId} has passed successfully!!!")
