o
    Neß  ã                   @   s<   d Z ddlmZ dd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )aô  
Example:
    >>from paddle.fluid.contrib.model_stat import summary
    >>main_program = ...
    >>summary(main_program)
    +-----+------------+----------------+----------------+---------+------------+
    | No. |       TYPE |          INPUT |         OUTPUT |  PARAMs |      FLOPs |
    +-----+------------+----------------+----------------+---------+------------+
    |   0 |     conv2d |  (3, 200, 200) | (64, 100, 100) |    9408 |  188160000 |
    |   1 | batch_norm | (64, 100, 100) | (64, 100, 100) |     256 |     640000 |
    |   2 |       relu | (64, 100, 100) | (64, 100, 100) |       0 |     640000 |
    |   3 |     pool2d | (64, 100, 100) |   (64, 50, 50) |       0 |    1440000 |
    ...
    | 176 |     conv2d |    (512, 7, 7) |    (512, 7, 7) | 2359296 |  231211008 |
    | 177 |       relu |    (512, 7, 7) |    (512, 7, 7) |       0 |      25088 |
    | 178 |     conv2d |    (512, 7, 7) |   (2048, 7, 7) | 1048576 |  102760448 |
    | 179 |       relu |   (2048, 7, 7) |   (2048, 7, 7) |       0 |     100352 |
    | 180 |     pool2d |   (2048, 7, 7) |   (2048, 1, 1) |       0 |     100352 |
    +-----+------------+----------------+----------------+---------+------------+
    Total PARAMs: 48017344(0.0480G)
    Total FLOPs: 11692747751(11.69G)
é    )ÚOrderedDictc           	      C   sª   g }| j D ]B}|j}|jD ]9}tƒ }t||ƒ}|du rq|j|d< |d dd… |d< |d dd… |d< |d |d< |d	 |d
< | |¡ qqt|ƒ\}}t||ƒ dS )zß
    It can summary model's PARAMS, FLOPs until now.
    It support common operator like conv, fc, pool, relu, sigmoid, bn etc. 
    Args:
        main_prog: main program 
    Returns:
        print summary on terminal
    NÚtyper   é   Úinput_shapeÚ	out_shapeé   ÚPARAMsé   ÚFLOPs)	ÚblocksÚvarsÚopsr   Ú_summary_modelr   ÚappendÚ_format_summaryÚ_print_summary)	Z	main_progÚcollected_ops_listZone_bÚ
block_varsÚone_opZop_infoZspf_resÚsummary_tableÚtotal© r   úOD:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/contrib/model_stat.pyÚsummary'   s"   	



õr   c                 C   st  |j dv rd| | d¡d  j}| | d¡d  j}| | d¡d  j}|\}}}}|\}	}
}}||
ks7J dƒ‚| d¡}|| ||  }| d¡g krMdnd	}|||  }|| | ||  }d
| }nÐ|j dkr™| | d¡d  j}| | d¡d  j}|\}	}}}| d¡}d}|| | |d |d	   }n›|j dkrÖ| | d¡d  j}| | d¡d  j}| | d¡d  j}d| d¡d vrÇdS |\}}|| d	 }|| }n^|j dv r| | d¡d  j}| | d¡d  j}d}|j dkrùd	}d	}|D ]}||9 }qýn/|j dkr2| | d¡d  j}| | d¡d  j}|\}	}}}|d
 }|| | d
 }ndS ||||fS )aR  
    Compute operator's params and flops.
    Args:
        block_vars: all vars of one block
        one_op: one operator to count
    Returns:
        in_data_shape: one operator's input data shape
        out_data_shape: one operator's output data shape
        params: one operator's PARAMs 
        flops: : one operator's FLOPs
    )Zconv2dZdepthwise_conv2dÚFilterr   ZInputÚOutputzshape error!ÚgroupsZBiasr   r   Zpool2dÚXZOutZksizeÚmulÚYZfcN)ZsigmoidÚtanhZreluZ
leaky_reluÚprelur!   Z
batch_norm)r   ÚinputÚshapeÚoutputÚattr)r   r   Zk_arg_shapeZin_data_shapeZout_data_shapeZc_outZc_inZk_hZk_wÚ_Zc_out_Zh_outZw_outZk_groupsZ
kernel_opsZbias_opsÚparamsÚflopsZk_sizeZk_inZk_outZone_dimr   r   r   r   D   s^   








ÿr   c           	   	   C   s´   t ƒ  ddlm} |g d¢ƒ}d|_i }g }g }t| ƒD ]1\}}||d |d |d t|d ƒt|d	 ƒg}| |¡ | t|d ƒ¡ | t|d	 ƒ¡ q||d
< ||d< ||fS )zÇ
    Format summary report.
    Args:
        collected_ops_list: the collected operator with summary
    Returns:
        summary_table: summary report format
        total: sum param and flops
    r   ©ÚPrettyTable)zNo.ZTYPEZINPUTZOUTPUTr   r
   Úrr   r   r   r   r
   r'   r(   )Ú_verify_dependent_packageÚprettytabler*   ÚalignÚ	enumerateÚintÚadd_rowr   )	r   r*   r   r   Ztotal_paramsZtotal_flopsÚir   Z	table_rowr   r   r   r   Ž   s.   	ÿ

ú
r   c                  C   s*   z	ddl m}  W dS  ty   tdƒ‚w )z4
    Verify whether `prettytable` is installed.
    r   r)   zkpaddle.summary() requires package `prettytable`, place install it firstly using `pip install prettytable`. N)r-   r*   ÚImportErrorr)   r   r   r   r,   µ   s   ÿÿr,   c                 C   s\   |d }|d }t | ƒ t d t|ƒt|ƒd ¡ƒ t d t|ƒt|ƒd ¡ƒ t dƒ dS )	z†
    Print all the summary on terminal.
    Args:
        summary_table: summary report format
        total: sum param and flops
    r'   r(   zTotal PARAMs: {}({:.4f}M)i@B zTotal FLOPs: {}({:.2f}G)i Êš;z‡Notice: 
 now supported ops include [Conv, DepthwiseConv, FC(mul), BatchNorm, Pool, Activation(sigmoid, tanh, relu, leaky_relu, prelu)]N)ÚprintÚformatÚsum)r   r   Zparmasr(   r   r   r   r   Á   s   
ÿÿr   N)Ú__doc__Úcollectionsr   r   r   r   r,   r   r   r   r   r   Ú<module>   s   J'