
    Hh'                     `   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d	d
lmZmZ d	dlmZmZ d	dlmZ d	dl m!Z!  G d dej"                  Z# G d de          Z$	 ddededeede%f                  dededed         defdZ&dS )    )defaultdictN)TensorFloatTensor
LongTensor)DictUnionListLiteral)BasePredictionWriter)ndarray)
csr_matrix)cKDTree   )OrderConfig	get_order)RawSkinRawData)Exporter)	ModelSpecc                        e Zd Z	 	 	 	 ddededeedf         dee         deedf         deedf         f fd	Zdd
Z	 xZ
S )
SkinSystemNFsteps_per_epochmodeloutput_path
record_resval_intervalval_start_fromc                     t                                                       |                     d           || _        || _        || _        || _        || _        || _        | j        r| j        J d            d S d S )Nr   )ignorez3record_res is True, but output_path in skin is None)	super__init__save_hyperparametersr   r   r   r   r   r   )selfr   r   r   r   r   r   	__class__s          @/data/cameron/tmprepos/clean_dreammesh/UniRig/src/system/skin.pyr!   zSkinSystem.__init__   s     	!!!111"1"'
"-","."0? 	g#//1f///	g 	g//    c                 D   | j                             |          }t          |t                    rd|iS t          |t                    r2d|v s,J d| j         j         d|                                             |S J d| j         j         dt          |                       )N	skin_predz*expect key 'skin_pred' in prediction from z	, found: r   zexpect type of prediction from z to be a list or dict, found: )r   predict_step
isinstancelistdictr$   keystype)r#   batch	batch_idxdataloader_idxress        r%   r)   zSkinSystem.predict_step,   s    j%%e,,c4   	xS  T"" 	x#%%%'TXT^Th''svs{s{s}s}''%%%Jww
8Lwwlpqtluluwwww1r&   )NFNNN)__name__
__module____qualname__intr   r   strboolr!   r)   __classcell__r$   s   @r%   r   r      s         '+ %'+)-g gg g 39%	g
 $Kg CI&g c4i(g g g g g g*x x x x x x x xr&   r   c            	       r     e Zd Z	 d
deedf         dedeedf         f fdZdedee	         fdZ
d	 Z xZS )
SkinWriterN
output_dir	save_nameorder_configc                    t                                          d           || _        |                    dd           | _        |                    dd          | _        |                    dd           | _        || _        |                    dd          | _        |                    dd          | _	        |                    d	d          | _
        |t          |
          | _        nd | _        d| _        d S )Nr/   npz_dir	user_modeFoutput_nameadd_num
export_npzT
export_fbx)configr   )r    r!   r>   getrB   rC   rD   r?   rE   rF   rG   r   order_epoch)r#   r>   r?   r@   kwargsr$   s        r%   r!   zSkinWriter.__init__:   s     	!!!","(**Y"="="(**[%"@"@"(**]D"A"A"+"(**Y">">"(**\4"@"@"(**\5"A"A#",777DJJDJr&   	pl_module
predictionc                 
   #$ d|v sJ |d         $|d         }|d         }	|d         }
|d         }|d         }|d         }|d         }|d	         }|d
         }|d         }|	                                                                                                 }	|                                                                                                 }|                                                                                                 }|
                                                                                                 }
|                                                                                                 }|                                                                                                 }|                                                                                                 }|d         }|                    dd           }|t	          |t
                    sJ |}t	          |t
                    rU|                    t          j                                                                                                                   }t          |          D ]\  #}t	          |t
                    rU|                    t          j                                                                                                                   }|#         }|
#         }|#         }|#d |f         }|#         }g }t          |          D ]?}||         dk    r|                    d            $|                    ||                    @t          |#         |||#d |f         |ddd          }d!dt          dt          dt          f#$ fd}t          ||#         |	#d |f                   } j        %|                     | j        d                      j        	 t'                      }t)          j        t,          j                            $#         |#                             j        } | d t          |          D             }  j        r# j         j        }!n% | j        dd          }!n | j        d          }!|                    |!||	#d |f         ||| |#d |f         d|#d |f         dd            q# t<          $ r'}"t?          t          |"                     Y d }"~"d }"~"ww xY wd S )"Npath	data_namejoints	num_bones	num_faces
num_pointstailsparentsorigin_verticesverticesorigin_facesr(   sampled_verticesmediang       @gQ?)r[   rY   rW   facessampled_skinsample_methodalpha	thresholdFr?   suffixtrimc                    |r,t           j                                     j                  }n         }j        %t           j                            j        |          }j        r.t           j                            ||  dj         d|           }n%t           j                            ||  d|           }|S )N_.)osrP   relpathrB   r>   joinrE   rK   )r?   rc   rd   rP   idpathsr#   s       r%   	make_pathz0SkinWriter.write_on_batch_end.<locals>.make_path   s     %7??59dlCCDD 9D?.7<<>>D< G7<<.S.ST[.S.S6.S.STTDD7<<.E.EV.E.EFFDr&   )skinrY   rR   npz)rP   c                     g | ]}d | S )bone_ ).0is     r%   
<listcomp>z1SkinWriter.write_on_batch_end.<locals>.<listcomp>   s     ? ? ? ? ? ?r&   fbxT)rd      )rP   rY   rR   rn   rW   namesr^   group_per_vertexrV   use_extrude_boneuse_connect_unique_child)F) detachcpunumpyrI   r*   r   r.   torchfloat32	enumeraterangeappendreskinr8   r9   r   rF   saverG   r   r   loadrh   rP   rj   rx   rC   rD   r?   _export_fbx	Exceptionprint)%r#   trainerrM   rN   batch_indicesr/   r0   r1   
data_namesrR   rS   rT   rU   rV   parents_listrY   r[   r^   skin_pred_listret_sampled_verticesr(   NJF
o_vertices_parentsrW   rt   skin_resampledrm   raw_dataexporterrx   rP   erk   rl   s%   `                                  @@r%   write_on_batch_endzSkinWriter.write_on_batch_endQ   sQ    = %k 2
#Ho %k 2	 %k 2	!&|!4
"7^#(#3 %&7 8(-j(9!.1$$&&,,..""$$**,,#**,,002288::$$&&**,,2244	$$&&**,,2244	??$$((**0022""$$**,,)+6)~~.@$GG+2F;;;;;3&// 	[/44U]CCJJLLPPRRXXZZ(88 M	" M	"OR)V,, Q%NN5=99@@BBFFHHNNPP	
 2A"A"A!"bqb&)J#B'HG1XX 0 0A;"$$NN4((((NN8A;////#!1"!5#BFm&&	 	 	N S # T         I8H8LU[\^`bab`b\bUcdddH*99T_e#D#DEEE*"'zzH#Lbgll59jQSn.U.UVVV\E} ? ?eAhh ? ? ?~ A+7#'#3DD#,9T^U#N#N#NDD(y%@@((!!+%b"1"f~+ '##BFm)*#BFm).16 )     ! " " "#a&&MMMMMMMM"7 +cM	" M	"s   %C&T
T>T99T>c                 &    | xj         dz  c_         d S )N   )rK   )r#   r   rM   predictionsr   s        r%   write_on_epoch_endzSkinWriter.write_on_epoch_end   s    qr&   r3   )r4   r5   r6   r   r8   r   r!   r   r	   r   r   r   r:   r;   s   @r%   r=   r=   9   s        
 04	 #t)$  K-.	     .j"Z j"TRVZ j" j" j" j"X      r&   r=   meanr[   rY   rW   r^   r_   r`   r   r]   returnc                    |                     dd          }|                     dd          }|                     dd          }	|                     dd          }
|d	v sJ |j        d
         }|j        d         }|dk    rt          |           }|                    ||d          \  }}t	          j        |
 |z            }|                    dd          }||         }||dt          j        f         z                      d          |z  }nO|dk    rGt          |           }|                    ||d          \  }}t	          j        ||         d          }nJ t	          j	        |d d d
dgf         |d d ddgf         |d d dd
gf         gd
          }t	          j	        ||d d dd
gf         gd
          }t          |          D ]}|                                }t          t          |                    D ]+}||         }||d d |fxx         |d d |f         z  cc<   ,||d d df                  ||d d d
f                  k     }t	          j        |          }t	          j        ||ft          j                  }t	          j        ||d d df                  ||d d d
f                  z
  dz                      dd                    }t	          j        | |
z            }||d d df         xx         ||d d d
f                  |z  |z  z  cc<   ||d d df         xx         ||z  z  cc<   ||z   d|z   z  }t          |          D ]E}||         }||d d |fxx         |d d |f         z  cc<   ||                    dd          z  }F||	k                        dd          }d|||	k     |z  <   ||                    dd          z  }|S )Nnearest_samples   
iter_stepsr   rb   g{Gz?ra   r   r   r   r   )kpT)axiskeepdims.)r   r]   )dtypeg      ?r\   g        )rI   shaper   querynpexpsumnewaxisr]   concatenater   copyreversed
zeros_likezerosr   sqrtany)r[   rY   rW   r^   r_   r`   rL   r   r   rb   ra   r   r   treedisnearestweights
weight_sumsampled_skin_nearestrn   edgesrf   sum_skinrt   r   maskneighbor_skinneighbor_cocos                                r%   r   r      sf    jj!2A66OL!,,J

;--IJJw""E.....qA1A'((zz(ozCCW&%#&&[[a$[77
+G4$wsBJ'??DD!DLLzY	(	"	"'((zz(ozCCWyg.Q777q NE!!!aV),eAAA1vI.>aaa!Qi@PQXYZZZENE5QF#341===E : C C99;;%((## 	- 	-A
AyQQQTNNNhqqq!tn,NNNN aaad$xaaad'<<h//h1vRZ888gqqq!t-qqq!t0EEINNTU`dNeeffVSD5L!!eAAAqDk"""huQQQT{&;b&@4&GG"""E!!!Q$K   BI-   },k1ABq 	C 	CA
AyQQQTNNNhqqq!tn,NNNhllTlBBBDD	C )O  b4 88D"$D$y.$	$((T(222DKr&   )r   )'collectionsr   torch.distributedr   	lightningLrh   r~   r   r   r   r   typingr   r   r	   r
   lightning.pytorch.callbacksr   r   scipy.sparser   scipy.spatialr   
data.orderr   r   data.raw_datar   r   data.exporterr   
model.specr   LightningModuler   r=   r7   r   rr   r&   r%   <module>r      s!   # # # # # #         				      1 1 1 1 1 1 1 1 1 1 - - - - - - - - - - - - < < < < < <       # # # # # # ! ! ! ! ! ! / / / / / / / / , , , , , , , , $ $ $ $ $ $ " " " " " ""x "x "x "x "x" "x "x "xHE E E E E% E E EZ .4F FFF %c	"#F 	F
 F +,F F F F F F Fr&   