Ë
    ˆ\;jk^  ã                   ó|   — d dl Z d dlZd dlmZ d dlZd dlZd dlmZ d dlm	Z	 d dl
mZ g Zdd„Z e	«       dd„«       Zy)	é    N)ÚOrderedDict)Únn)Úno_grad)Ú	InputSpecc                 ó  ‡‡‡— |€|€t        d«      ‚|�€|��t        j                  |«      rt        |j                  «      }nât        |t        t        f«      r.g }|D ]&  }|j                  t        |j                  «      «       Œ( nžt        |t        «      r?g }|j                  «       D ])  }|j                  t        ||   j                  «      «       Œ+ nOt        |t        j                  j                  j                  «      rt        |j                  «      }nt        d«      ‚t        |t        «      rt        |j                  «      }n²t        |t        «      rŒg }|D ]„  }t        |t        «      r|f}t        |t        t        f«      sJ dt        |«      › �«       ‚t        |t        «      r%|j                  t        |j                  «      «       Œt|j                  |«       Œ† nt        |t        «      r|f}n|}t        j                   «       st#        j$                  d«       d}n| j&                  }|r| j)                  «        d„ Šd„ Šˆˆˆfd„Š ‰|«      }t+        | |||«      \  }	}
t-        |	«       |r| j/                  «        |
S )	a¯)  Prints a string summary of the network.

    Args:
        net (Layer): The network which must be a subinstance of Layer.
        input_size (tuple|InputSpec|list[tuple|InputSpec], optional): Size of input tensor. if model only
                    have one input, input_size can be tuple or InputSpec. if model
                    have multiple input, input_size must be a list which contain
                    every input's shape. Note that input_size only dim of
                    batch_size can be None or -1. Default: None. Note that
                    input_size and input cannot be None at the same time.
        dtypes (str, optional): If dtypes is None, 'float32' will be used, Default: None.
        input (Tensor, optional): If input is given, input_size and dtype will be ignored, Default: None.

    Returns:
        Dict: A summary of the network including total params and total trainable params.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> import paddle.nn as nn
            >>> paddle.seed(2023)
            >>> class LeNet(nn.Layer):
            ...     def __init__(self, num_classes=10):
            ...         super().__init__()
            ...         self.num_classes = num_classes
            ...         self.features = nn.Sequential(
            ...             nn.Conv2D(1, 6, 3, stride=1, padding=1),
            ...             nn.ReLU(),
            ...             nn.MaxPool2D(2, 2),
            ...             nn.Conv2D(6, 16, 5, stride=1, padding=0),
            ...             nn.ReLU(),
            ...             nn.MaxPool2D(2, 2))
            ...
            ...         if num_classes > 0:
            ...             self.fc = nn.Sequential(
            ...                 nn.Linear(400, 120),
            ...                 nn.Linear(120, 84),
            ...                 nn.Linear(84, 10))
            ...
            ...     def forward(self, inputs):
            ...         x = self.features(inputs)
            ...
            ...         if self.num_classes > 0:
            ...             x = paddle.flatten(x, 1)
            ...             x = self.fc(x)
            ...         return x
            ...
            >>> lenet = LeNet()

            >>> params_info = paddle.summary(lenet, (1, 1, 28, 28))
            >>> print(params_info)
            ---------------------------------------------------------------------------
            Layer (type)       Input Shape          Output Shape         Param #
            ===========================================================================
              Conv2D-1       [[1, 1, 28, 28]]      [1, 6, 28, 28]          60
                ReLU-1        [[1, 6, 28, 28]]      [1, 6, 28, 28]           0
              MaxPool2D-1     [[1, 6, 28, 28]]      [1, 6, 14, 14]           0
              Conv2D-2       [[1, 6, 14, 14]]     [1, 16, 10, 10]         2,416
                ReLU-2       [[1, 16, 10, 10]]     [1, 16, 10, 10]           0
              MaxPool2D-2    [[1, 16, 10, 10]]      [1, 16, 5, 5]            0
              Linear-1          [[1, 400]]            [1, 120]           48,120
              Linear-2          [[1, 120]]            [1, 84]            10,164
              Linear-3          [[1, 84]]             [1, 10]              850
            ===========================================================================
            Total params: 61,610
            Trainable params: 61,610
            Non-trainable params: 0
            ---------------------------------------------------------------------------
            Input size (MB): 0.00
            Forward/backward pass size (MB): 0.11
            Params size (MB): 0.24
            Estimated Total Size (MB): 0.35
            ---------------------------------------------------------------------------
            {'total_params': 61610, 'trainable_params': 61610}
            >>> # multi input demo
            >>> class LeNetMultiInput(LeNet):
            ...     def forward(self, inputs, y):
            ...         x = self.features(inputs)
            ...
            ...         if self.num_classes > 0:
            ...             x = paddle.flatten(x, 1)
            ...             x = self.fc(x + y)
            ...         return x
            ...
            >>> lenet_multi_input = LeNetMultiInput()

            >>> params_info = paddle.summary(lenet_multi_input,
            ...                              [(1, 1, 28, 28), (1, 400)],
            ...                              dtypes=['float32', 'float32'])
            >>> print(params_info)
            ---------------------------------------------------------------------------
            Layer (type)       Input Shape          Output Shape         Param #
            ===========================================================================
              Conv2D-3       [[1, 1, 28, 28]]      [1, 6, 28, 28]          60
                ReLU-3        [[1, 6, 28, 28]]      [1, 6, 28, 28]           0
              MaxPool2D-3     [[1, 6, 28, 28]]      [1, 6, 14, 14]           0
              Conv2D-4       [[1, 6, 14, 14]]     [1, 16, 10, 10]         2,416
                ReLU-4       [[1, 16, 10, 10]]     [1, 16, 10, 10]           0
              MaxPool2D-4    [[1, 16, 10, 10]]      [1, 16, 5, 5]            0
              Linear-4          [[1, 400]]            [1, 120]           48,120
              Linear-5          [[1, 120]]            [1, 84]            10,164
              Linear-6          [[1, 84]]             [1, 10]              850
            ===========================================================================
            Total params: 61,610
            Trainable params: 61,610
            Non-trainable params: 0
            ---------------------------------------------------------------------------
            Input size (MB): 0.00
            Forward/backward pass size (MB): 0.11
            Params size (MB): 0.24
            Estimated Total Size (MB): 0.35
            ---------------------------------------------------------------------------
            {'total_params': 61610, 'trainable_params': 61610}
            >>> # list input demo
            >>> class LeNetListInput(LeNet):
            ...     def forward(self, inputs):
            ...         x = self.features(inputs[0])
            ...
            ...         if self.num_classes > 0:
            ...             x = paddle.flatten(x, 1)
            ...             x = self.fc(x + inputs[1])
            ...         return x
            ...
            >>> lenet_list_input = LeNetListInput()
            >>> input_data = [paddle.rand([1, 1, 28, 28]), paddle.rand([1, 400])]
            >>> params_info = paddle.summary(lenet_list_input, input=input_data)
            >>> print(params_info)
            ---------------------------------------------------------------------------
            Layer (type)       Input Shape          Output Shape         Param #
            ===========================================================================
              Conv2D-5       [[1, 1, 28, 28]]      [1, 6, 28, 28]          60
                ReLU-5        [[1, 6, 28, 28]]      [1, 6, 28, 28]           0
              MaxPool2D-5     [[1, 6, 28, 28]]      [1, 6, 14, 14]           0
              Conv2D-6       [[1, 6, 14, 14]]     [1, 16, 10, 10]         2,416
                ReLU-6       [[1, 16, 10, 10]]     [1, 16, 10, 10]           0
              MaxPool2D-6    [[1, 16, 10, 10]]      [1, 16, 5, 5]            0
              Linear-7          [[1, 400]]            [1, 120]           48,120
              Linear-8          [[1, 120]]            [1, 84]            10,164
              Linear-9          [[1, 84]]             [1, 10]              850
            ===========================================================================
            Total params: 61,610
            Trainable params: 61,610
            Non-trainable params: 0
            ---------------------------------------------------------------------------
            Input size (MB): 0.00
            Forward/backward pass size (MB): 0.11
            Params size (MB): 0.24
            Estimated Total Size (MB): 0.35
            ---------------------------------------------------------------------------
            {'total_params': 61610, 'trainable_params': 61610}
            >>> # dict input demo
            >>> class LeNetDictInput(LeNet):
            ...     def forward(self, inputs):
            ...         x = self.features(inputs['x1'])
            ...
            ...         if self.num_classes > 0:
            ...             x = paddle.flatten(x, 1)
            ...             x = self.fc(x + inputs['x2'])
            ...         return x
            ...
            >>> lenet_dict_input = LeNetDictInput()
            >>> input_data = {'x1': paddle.rand([1, 1, 28, 28]),
            ...               'x2': paddle.rand([1, 400])}
            >>> params_info = paddle.summary(lenet_dict_input, input=input_data)
            >>> print(params_info)
            ---------------------------------------------------------------------------
            Layer (type)       Input Shape          Output Shape         Param #
            ===========================================================================
              Conv2D-7       [[1, 1, 28, 28]]      [1, 6, 28, 28]          60
                ReLU-7        [[1, 6, 28, 28]]      [1, 6, 28, 28]           0
              MaxPool2D-7     [[1, 6, 28, 28]]      [1, 6, 14, 14]           0
              Conv2D-8       [[1, 6, 14, 14]]     [1, 16, 10, 10]         2,416
                ReLU-8       [[1, 16, 10, 10]]     [1, 16, 10, 10]           0
              MaxPool2D-8    [[1, 16, 10, 10]]      [1, 16, 5, 5]            0
              Linear-10         [[1, 400]]            [1, 120]           48,120
              Linear-11         [[1, 120]]            [1, 84]            10,164
              Linear-12         [[1, 84]]             [1, 10]              850
            ===========================================================================
            Total params: 61,610
            Trainable params: 61,610
            Non-trainable params: 0
            ---------------------------------------------------------------------------
            Input size (MB): 0.00
            Forward/backward pass size (MB): 0.11
            Params size (MB): 0.24
            Estimated Total Size (MB): 0.35
            ---------------------------------------------------------------------------
            {'total_params': 61610, 'trainable_params': 61610}

    z4input_size and input cannot be None at the same timezcInput is not tensor, list, tuple and dict, unable to determine input_size, please input input_size.z`When input_size is list,             expect item in input_size is a tuple or InputSpec, but got zZYour model was created in static graph mode, this may not get correct summary information!Fc                 óB   — | D ]  }t        |t        t        f«      sŒ y y©NFT©Ú
isinstanceÚlistÚtuple)ÚshapeÚitems     úbG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/hapi/model_summary.pyÚ	_is_shapezsummary.<locals>._is_shape  s"   € ÛˆDÜ˜$¤¤u Õ.Ùð ð ó    c                 ó  — d}g }t        t        | «      «      D ]d  }| |   }|�|dk(  r|dz  }|dkD  rt        d«      ‚d}n-t        |t        j
                  «      r|dk  rt        d|› �«      ‚|j                  |«       Œf t        |«      S )Nr   éÿÿÿÿé   z?Option input_size only the dim of batch_size can be None or -1.z:Expected element in input size greater than zero, but got )ÚrangeÚlenÚ
ValueErrorr   ÚnumbersÚNumberÚappendr   )r   Únum_unknownÚ	new_shapeÚir   s        r   Ú_check_shapezsummary.<locals>._check_shape  s¦   € ØˆØˆ	Ü”s˜5“zÖ"ˆAØ˜‘8ˆDØˆ|˜t ršzØ˜qÑ �Ø ’?Ü$ØYóð ð ‘Ü˜D¤'§.¡.Ô1Ø˜1’9Ü$ØTÐUYÐTZÐ[óð ð ×Ñ˜TÕ"ð #ô �YÓÐr   c                 ó†   •— t        | t        t        f«      r ‰| «      r ‰| «      S | D �cg c]
  } ‰|«      ‘Œ c}S c c}w ©Nr
   )Ú
input_sizer   Ú_check_inputr   r   s     €€€r   r#   zsummary.<locals>._check_input,  s?   ø€ Ü�j¤4¬ -Ô0±Y¸zÔ5JÙ 
Ó+Ð+á-7Ó8©Z¨‘L •O¨ZÑ8Ð8ùÒ8s   ¬>)r   ÚpaddleÚ	is_tensorr   r   r   r   r   ÚdictÚkeysÚbaseÚ	frameworkÚVariabler   ÚintÚtypeÚin_dynamic_modeÚwarningsÚwarnÚtrainingÚevalÚsummary_stringÚprintÚtrain)Únetr"   ÚdtypesÚinputÚxÚkeyÚ_input_sizer   Úin_train_modeÚresultÚparams_infor#   r   r   s              @@@r   Úsummaryr>      s1  ú€ ð@ Ð˜e˜mÜÐOÓPÐPàÑ˜eÑ/Ü×Ñ˜EÔ"Ü˜uŸ{™{Ó+‰JÜ˜¤¤e˜}Ô-ØˆJÛ�Ø×!Ñ!¤%¨¯©£.Õ1ñ ä˜œtÔ$ØˆJØ—z‘z–|�Ø×!Ñ!¤%¨¨c©
×(8Ñ(8Ó"9Õ:ñ $ä˜œvŸ{™{×4Ñ4×=Ñ=Ô>Ü˜uŸ{™{Ó+‰JäØuóð ô �*œiÔ(Ü˜J×,Ñ,Ó-‰Ü	�J¤Ô	%ØˆÛˆDÜ˜$¤Ô$Ø�w�ÜØ”uœiÐ(ôð UðHÜHLÈTË
À|ðUóUð ô
 ˜$¤	Ô*Ø×"Ñ"¤5¨¯©Ó#4Õ5à×"Ñ" 4Õ(ñ ô 
�J¤Ô	$Ø!�m‰à ˆä×!Ñ!Ô#Ü�‰Øhô	
ð ‰àŸ™ˆáØ�‰Œ
òò ö(9ñ ˜{Ó+€Kä(¨¨k¸6À5ÓIÑ€FˆKÜ	ˆ&„MáØ�	‰	ŒàÐr   c                 óâ  ‡ ‡‡‡‡‡‡‡‡‡— d„ Šˆˆfd„Št        |t        t        f«      s	 ‰||«      }d}d}t        t        ‰ j	                  «       «      «      Šˆfd„Šˆfd„Šˆˆˆˆˆ ˆfd„}t        |t        «      r|g}ˆˆfd„Št        «       Šg Š‰ j                  |«       |�|} ‰ |«       n ‰||«      } ‰ |Ž  ‰D ]  }|j                  «        Œ d	„ }	 |	‰«      }
|d
|
d   z  dz   z  }dj                  d|
d   d|
d   d|
d   d|
d   «      }||dz   z  }|d|
d   z  dz   z  }d}d}d}d}‰D ]º  }dj                  ||
d   t        ‰|   d   «      |
d   t        ‰|   d   «      |
d   dj                  ‰|   d   «      |
d   «      }|‰|   d   z  }	 |t        j                  t        j                  ‰|   d   d¬«      «      z  }d‰|   v r‰|   d   r|‰|   d   z  }||dz   z  }Œ¼ ˆˆfd „Š ‰|d«      }t        d!|z  d"z  d#z  «      }t        |d"z  d#z  «      }||z   |z   }|d|
d   z  dz   z  }|d$|d%›�dz   z  }|d&|d%›�dz   z  }|d'||z
  d%›�dz   z  }|d
|
d   z  dz   z  }|d(|z  dz   z  }|d)|z  dz   z  }|d*|z  dz   z  }|d+|z  dz   z  }|d
|
d   z  dz   z  }|||d,œfS #  ‰|   d   D ]/  }|t        j                  t        j                  |d¬«      «      z  }Œ1 Y �Œ#xY w)-Nc                 óJ   — | D ]  }t        |t        j                  «      rŒ y yr	   )r   r   r   )Úitemsr   s     r   Ú_all_is_numperz&summary_string.<locals>._all_is_numper?  s"   € ÛˆDÜ˜d¤G§N¡NÕ3Ùð ð r   c                 ó†   •— |€d}t        | t        t        f«      r ‰| «      r|gS | D �cg c]  } ‰||«      ‘Œ c}S c c}w )NÚfloat32r
   )r"   Údtyper   rB   Ú_build_dtypess      €€r   rF   z%summary_string.<locals>._build_dtypesE  sH   ø€ Øˆ=ØˆEä�j¤4¬ -Ô0±^ÀJÔ5OØ�7ˆNá5?Ó@±Z°‘M ! UÕ+°ZÑ@Ð@ùÒ@s   «>r   Ú c                 ó6  •— t        | t        j                  j                  t        j                  j                  j
                  j                  f«      rt        | j                  «      S t        | t        t        f«      r| D �cg c]
  } ‰|«      ‘Œ c}S y c c}w r!   )
r   r$   r(   r*   ÚcoreÚeagerÚTensorr   r   r   )r8   ÚxxÚ_get_shape_from_tensors     €r   rM   z.summary_string.<locals>._get_shape_from_tensorW  sq   ø€ Ü�aœ&Ÿ+™+×.Ñ.´·±×0@Ñ0@×0FÑ0F×0MÑ0MÐNÔOÜ˜Ÿ™“=Ð Ü˜œD¤%˜=Ô)Ù9:Ó;¹°2Ñ*¨2Õ.¸Ñ;Ð;ð *ùÚ;s   ÂBc                 ó¶   •— t        | t        t        f«      r| D �cg c]
  } ‰|«      ‘Œ }}|S t        | d«      rt        | j                  «      }|S g }|S c c}w )Nr   )r   r   r   Úhasattrr   )ÚoutputÚoÚoutput_shapeÚ_get_output_shapes      €r   rS   z)summary_string.<locals>._get_output_shape]  sh   ø€ Ü�fœt¤U˜mÔ,Ù:@ÓA¹&°QÑ-¨aÕ0¸&ˆLÐAð
 Ðô	 �V˜WÔ%Ü §¡Ó-ˆLð Ðð ˆLØÐùò Bs   œAc                 óF  •— ˆˆˆfd„}t        | t        j                  «      sEt        | t        j                  «      s+| ‰k(  r‰dk  r!‰j	                  | j                  |«      «       y t        | d«      r.| j                  r!‰j	                  | j                  |«      «       y y y )Nc                 óè  •— t        | j                  «      j                  d«      d   j                  d«      d   }	 t        | j                  j                  d«      d   «      }d||dz   fz  }t        «       ‰|<   	  ‰|«      ‰|   d<   	  ‰|«      ‰|   d
<   d}t        j                  «       r| j                  }n| j                  «       }d‰|   d<   d}|j                  «       D ]–  \  }	}
|t        j                  |
j                   «      z  }	 t#        | |	«      j$                  rNt#        | |	«      j&                  s8‰|   dxx   t        j                  |
j                   «      z  cc<   d‰|   d<   d}n
|sd‰|   d<   Œ˜ |‰|   d<   y #  t        ‰«      }Y �Œ4xY w#  t        j                  d	«       g ‰|   d<   Y �Œ3xY w#  t        j                  d«       ‰|   d
    Y �ŒIxY w#  d‰|   d<   Y �ŒxY w)NÚ.r   Ú'r   Ú_z%s-%ir   Úinput_shapez Get layer {} input shape failed!rR   z!Get layer {} output shape failed!Útrainable_paramsFTÚ	trainableÚ	nb_params)ÚstrÚ	__class__Úsplitr+   Ú
_full_namer   r   r.   r/   r$   r-   Ú_parametersÚ
state_dictrA   ÚnpÚprodr   Úgetattrr[   Ústop_gradient)Úlayerr7   rP   Ú
class_nameÚ	layer_idxÚm_keyÚparamsÚlayer_state_dictÚtrainable_flagÚkÚvrS   rM   r>   s              €€€r   Úhookz3summary_string.<locals>.register_hook.<locals>.hookg  s÷  ø€ Ü˜UŸ_™_Ó-×3Ñ3°CÓ8¸Ñ<×BÑBÀ3ÓGÈÑJˆJð)Ü × 0Ñ 0× 6Ñ 6°sÓ ;¸BÑ ?Ó@�	ð ˜z¨9°q©=Ð9Ñ9ˆEÜ(›]ˆG�E‰Nð3Ù0FÀuÓ0M�˜‘˜}Ñ-ð
/Ù1BÀ6Ó1J�˜‘˜~Ñ.ð
 ˆFä×%Ñ%Ô'Ø#(×#4Ñ#4Ñ à#(×#3Ñ#3Ó#5Ð à12ˆG�E‰NÐ-Ñ.Ø"ˆNØ(×.Ñ.Ö0‘��1Øœ"Ÿ'™' !§'¡'Ó*Ñ*�ð
7Ü  qÓ)×3Ò3Ü# E¨1Ó-×;Ò;à ™Ð'9Ó:¼b¿g¹gÀaÇgÁgÓ>NÑNÓ:Ø6:˜ ™ {Ñ3Ø)-™Ù+Ø6;˜ ™ {Ñ3øð 1ð +1ˆG�E‰N˜;Ò'øðU)Ü ›L“	ûð3Ü—‘Ð@ÔAØ02�˜‘˜}Ô-ûð/Ü—‘ÐAÔBØ˜‘˜~Õ.ûð.7Ø26�G˜E‘N ;Ô/ús0   ¼'F Á;F Â
F? ÄA.G$ÆFÆF<Æ?G!Ç$
G1r   Úcould_use_cudnn)r   r   Ú
SequentialÚ	LayerListr   Úregister_forward_post_hookrO   rq   )rg   rp   rS   rM   ÚdepthÚhooksÚmodelr>   s     €€€€€€r   Úregister_hookz%summary_string.<locals>.register_hookf  s~   ø€ ö/	1ôd ˜5¤"§-¡-Ô0Ü˜u¤b§l¡lÔ3Ø˜u’n¨°ªà�L‰L˜×9Ñ9¸$Ó?Õ@ä�UÐ-Ô.°5×3HÒ3HØ�L‰L˜×9Ñ9¸$Ó?Õ@ð 4IÐ.r   c                 ó8  •— t        | t        t        f«      rX ‰| «      rPt        |t        t        f«      r|d   }n|}t        j                  t        j
                  t        | «      «      |«      S t        | |«      D ��cg c]  \  }} ‰||«      ‘Œ c}}S c c}}w )Nr   )r   r   r   r$   ÚcastÚrandÚzip)r"   r6   rE   r   rB   Úbuild_inputs       €€r   r}   z#summary_string.<locals>.build_input¥  s‰   ø€ Ü�j¤4¬ -Ô0±^ÀJÔ5OÜ˜&¤4¬ -Ô0Ø˜q™	‘à�Ü—;‘;œvŸ{™{¬4°
Ó+;Ó<¸eÓDÐDô 7:¸*ÀfÔ6MôÙ6M©(¨!¨U‘˜A˜uÕ%Ð6Mòð ùó s   Á?Bc                 óf  — ddddddœ}| D ]ë  }|d   t        t        | |   d   «      «      k  rt        t        | |   d   «      «      |d<   |d   t        t        | |   d   «      «      k  rt        t        | |   d   «      «      |d<   |d	   t        t        |«      «      k  rt        t        |«      «      |d	<   |d
   t        t        | |   d   «      «      k  sŒÏt        t        | |   d   «      «      |d
<   Œí d}|j                  «       D ]  \  }}|dk7  sŒ||z  }Œ |d   |dz   k  r|dz   |d<   |S )Né   é   éK   )Úlayer_widthÚinput_shape_widthÚoutput_shape_widthÚparams_widthÚtable_widthr„   rR   rƒ   rY   r‚   r…   r\   r   r†   é   )r   r]   rA   )r>   Úhead_lengthrg   Ú_temp_widthrn   ro   s         r   Ú_get_str_lengthz'summary_string.<locals>._get_str_lengthÂ  s  € àØ!#Ø"$ØØñ
ˆó ˆEØÐ/Ñ0´3Ü�G˜E‘N >Ñ2Ó3ó4ò ô 58Ü˜ ™ ~Ñ6Ó7ó5�Ð0Ñ1ð Ð.Ñ/´#Ü�G˜E‘N =Ñ1Ó2ó3ò ô 47Ü˜ ™ }Ñ5Ó6ó4�Ð/Ñ0ð ˜=Ñ)¬C´°E³
«OÒ;Ü-0´°U³«_�˜MÑ*Ø˜>Ñ*¬SÜ�G˜E‘N ;Ñ/Ó0ó.ó ô /2Ü˜ ™ {Ñ3Ó4ó/�˜NÒ+ð% ð, ˆØ×%Ñ%Ö'‰DˆAˆqØ�MÓ!Ø˜qÑ ‘ð (ð �}Ñ%¨°a©Ò7Ø)4°q©ˆK˜Ñ&àÐr   Ú-r†   Ú
z{:^{}} {:^{}} {:^{}} {:^{}}zLayer (type)r‚   zInput Shaperƒ   zOutput Shaper„   zParam #r…   Ú=r   rY   rR   z{:,}r\   r   )Úaxisr[   rZ   c           	      óÚ   •— t        | t        t        f«      r. ‰| «      r&t        t	        j
                  | «      dz  dz  «      }|S t        | D �cg c]  } ‰||«      ‘Œ c}«      }|S c c}w )Nç      @ç      0A)r   r   r   Úabsrc   rd   Úsum)r"   Úsizer   rB   Ú_get_input_sizes      €€r   r•   z'summary_string.<locals>._get_input_size  si   ø€ Ü�j¤4¬ -Ô0±^ÀJÔ5OÜ”r—w‘w˜zÓ*¨SÑ0°IÑ>Ó?ˆDð ˆô ¹*ÓE¹*°Q™¨¨4Õ0¸*ÑEÓFˆDØˆùò Fs   ÁA(g       @r�   r‘   zTotal params: Ú,zTrainable params: zNon-trainable params: zInput size (MB): %0.2fz&Forward/backward pass size (MB): %0.2fzParams size (MB): %0.2fz Estimated Total Size (MB): %0.2f)Útotal_paramsrZ   )r   r   r   r   Ú	sublayersr   ÚapplyÚremoveÚformatr]   rc   r“   rd   r’   )rw   r"   r6   r7   Ú
batch_sizeÚsummary_strrx   r8   ÚhrŠ   r†   Úline_newr—   Útotal_outputrZ   Ú
max_lengthrg   rR   Útotal_input_sizeÚtotal_output_sizeÚtotal_params_sizeÚ
total_sizerB   rF   r•   rS   rM   r}   ru   rv   r>   s   `                     @@@@@@@@@r   r2   r2   =  s  ÿù€ òõAô �fœt¤U˜mÔ,Ù˜z¨6Ó2ˆà€Jà€Kä”�U—_‘_Ó&Ó'Ó(€Eô<ô÷:Añ :Aôx �*œeÔ$Ø �\ˆ
õ
ô ‹m€GØ€Eà	‡K�K�ÔØÐØˆÙˆa�á˜
 FÓ+ˆáˆq‰	ó ˆØ	�‰�
ð ò'ñR " 'Ó*€Kà�3˜ ]Ñ3Ñ3°dÑ:Ñ:€KØ,×3Ñ3ØØ�MÑ"ØØÐ'Ñ(ØØÐ(Ñ)ØØ�NÑ#ó	€Hð �8˜d‘?Ñ"€KØ�3˜ ]Ñ3Ñ3°dÑ:Ñ:€KØ€LØ€LØÐØ€JÛˆà0×7Ñ7ØØ˜Ñ&Ü�˜‘˜}Ñ-Ó.ØÐ+Ñ,Ü�˜‘˜~Ñ.Ó/ØÐ,Ñ-Ø�M‰M˜' %™.¨Ñ5Ó6Ø˜Ñ'ó	
ˆð 	˜ ™ {Ñ3Ñ3ˆð	GØœBŸF™FÜ—‘˜ ™ ~Ñ6¸RÔ@óñ ˆLð ˜' %™.Ñ(Ø�u‰~˜kÒ*Ø  G¨E¡NÐ3EÑ$FÑFÐ Ø�x $‘Ñ&‰ð3 õ6ñ ' z°1Ó5ÐäØˆlÑ˜SÑ  IÑ.óÐô ˜L¨3Ñ.°)Ñ<Ó=ÐØ"Ð%6Ñ6Ð9IÑI€Jà�3˜ ]Ñ3Ñ3°dÑ:Ñ:€KØ�^ L°Ð#3Ð4°tÑ;Ñ;€KØÐ'Ð(8¸Ð';Ð<¸tÑCÑC€KØØ
  Ð0@Ñ!@ÀÐ CÐDÀtÑKñ€Kð �3˜ ]Ñ3Ñ3°dÑ:Ñ:€KØÐ+Ð.>Ñ>ÀÑEÑE€KØØ0Ð3DÑDÀtÑKñ€Kð Ð,Ð/@Ñ@À4ÑGÑG€KØÐ5¸
ÑBÀTÑIÑI€KØ�3˜ ]Ñ3Ñ3°dÑ:Ñ:€Kð Ø$Ø,ñð ð øðQ	GØ '¨¡¨~Ô >�Ø¤§¡¤r§w¡w¨|À"Ô'EÓ FÑF‘ó !?ús   Æ3J/Ê/<K.)NNN)r   r.   Úcollectionsr   Únumpyrc   r$   r   Úpaddle.autogradr   Úpaddle.staticr   Ú__all__r>   r2   © r   r   Ú<module>r¬      sC   ðó Û Ý #ã ã Ý Ý #Ý #à
€ó]ñ@	 	ƒò}ó ñ}r   