
    ΅i                     8    S SK rS SKJr  SS jrS rSS jrS rg)    Nc                    ^^^ SSK Jm  SSKJs  Jm  UUU4S jn[        U [        5      (       a-  U  Vs/ s H
  o2" U5      PM     nn[        R                  " U5      $ U" U 5      nU$ s  snf )a&  Render matplotlib figure to numpy format.

Note that this requires the ``matplotlib`` package.

Args:
    figures (matplotlib.pyplot.figure or list of figures): figure or a list of figures
    close (bool): Flag to automatically close the figure

Returns:
    numpy.array: image in [CHW] order
r   Nc                 ~  > T	R                  U 5      nUR                  5         [        R                  " UR	                  5       [        R
                  S9nU R                  R                  5       u  p4UR                  XCS/5      S S 2S S 2SS24   n[        R                  " USSS9nT(       a  TR                  U 5        U$ )Ndtype   r         )sourcedestination)FigureCanvasAggdrawnp
frombufferbuffer_rgbauint8canvasget_width_heightreshapemoveaxisclose)
figurer   datawh	image_hwc	image_chwr   pltplt_backend_aggs
          X/home/james-whalen/.local/lib/python3.13/site-packages/torch/utils/tensorboard/_utils.pyrender_to_rgb&figure_to_image.<locals>.render_to_rgb   s     008MM&*<*<*>bhhO}}--/LL!+Aq!A#I6	KK	!C	IIf    )	matplotlib.pyplotpyplotmatplotlib.backends.backend_aggbackendsbackend_agg
isinstancelistr   stack)figuresr   r    r   imagesimager   r   s    `    @@r   figure_to_imager.      s^     $==	 '4  6=>gF-'g>xxg&	 ?s   A'c           
         U R                   u  pp4nU R                  [        R                  :X  a  [        R                  " U 5      S-  n S nU" U R                   S   5      (       de  [        SU R                   S   R                  5       -  U R                   S   -
  5      n[        R                  " U [        R                  " XrX4U4S94SS9n SUR                  5       S-
  S-  -  nU R                   S   U-  n	[        R                  " XXX4U45      n [        R                  " U SS	9n [        R                  " XX-  X-  U45      n U $ )
a2  
Convert a 5D tensor into 4D tensor.

Convesrion is done from [batchsize, time(frame), channel(color), height, width]  (5D tensor)
to [time(frame), new_width, new_height, channel] (4D tensor).

A batch of images are spread to a grid, which forms a frame.
e.g. Video with batchsize 16 will have a 4x4 grid.
g     o@c                 .    U S:g  =(       a
    X S-
  -  S:H  $ )Nr       )nums    r   	is_power2!_prepare_video.<locals>.is_power28   s    ax4c1Wo!34r"   r   r	   )shape)axisr1   )r	   r   r   r1      r   )axes)r6   r   r   r   float32int
bit_lengthconcatenatezerosr   	transpose)
Vbtcr   r   r4   len_additionn_rowsn_colss
             r   _prepare_videorG   )   s    GGMA!ww"((JJqME!5
 QWWQZ  1
 5 5 77!''!*DENNArxx|a.HIJQRSALLNQ&1,-FWWQZ6!F


1v!23A
Q/0A


1&*fj!45AHr"   c           	         [        U [        R                  5      (       d  [        S5      eU R                  S   S:X  a  [        R
                  " X U /S5      n U R                  S:w  d  U R                  S   S:w  a  [        S5      eU R                  S   nU R                  S   nU R                  S   n[        X!5      n[        [        R                  " [        U5      U-  5      5      n[        R                  " SX5-  XA-  4U R                  S9nSn[        U5       HB  n[        U5       H0  n	Xr:  a    M  X   US S 2X-  US-   U-  2X-  U	S-   U-  24'   US-   nM2     MD     U$ )	Nz*plugin error, should pass numpy array herer1   r   r   z0Input should be a 4D numpy array with 3 channelsr   r	   r   )r(   r   ndarrayAssertionErrorr6   r=   ndimminr;   ceilfloatr>   r   range)
IncolsnimgHWnrowsr   iyxs
             r   	make_gridrY   M   s=   a$$IJJwwqzQNNA!9a(vv{aggajAoOPP771:D	
A	
AEde+,-EXXq!)QY/qww?F	A5\uAyBC$F1aeq1uk)15AEQ;+>>?AA	   Mr"   c                 h   [        [        U5      5      [        U5      :w  a  [        SU 35      e[        U R                  5      [        U5      :w  a  [        SU R                   SU 35      eUR	                  5       n[        U5      S:X  aO  S Vs/ s H  o!R                  U5      PM     nnU R                  U5      n[        U5      nUR                  SSS5      $ [        U5      S	:X  a_  S
 Vs/ s H  o!R                  U5      PM     nnU R                  U5      nUR                  S   S:X  a  [        R                  " XfU/S5      nU$ [        U5      S:X  aL  S Vs/ s H  o!R                  U5      PM     nnU R                  U5      n [        R                  " X U /S5      n U $ g s  snf s  snf s  snf )NzNYou can not use the same dimension shordhand twice.             input_format: zKsize of input tensor and input format are different.         tensor shape: z, input_format: r   NCHWr1   r	   r   r   HWCHW)lensetrJ   r6   upperfindr?   rY   r   r=   r*   )tensorinput_formatrC   indextensor_NCHW
tensor_CHW
tensor_HWCs          r   convert_to_HWCrh   i   s   
3|\!22  '.* + 	+
6<<C--  ||n$4\ND E 	E%%'L
<A/56v!""1%v6&&u-{+
##Aq!,,
<A/45u!""1%u5%%e,
A!#(LaPJ
<A/34t!""1%t4!!%(662A6	  7 6 5s   F%.F*F/)T)   )	numpyr   numpy.typingtypingnptr.   rG   rY   rh   r2   r"   r   <module>rn      s!     D!H8r"   