
    _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 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ededededef
dZ$dS )    )defaultdictN)TensorFloatTensor
LongTensor)DictUnionList)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          &/tmp/cameron/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=   getrA   rB   rC   r>   rD   rE   rF   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         }t          |#         ||#d |f         |dd          }d dt          dt          dt          f#$ fd}t          ||#         |	#d |f                   } j        %|                     | j        d                      j        v	 t#                      }|#         }g }t%          |          D ]?}||         dk    r|                    d            $|                    ||                    @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           o# 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_verticesg       @g?)rZ   rX   facessampled_skin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_.)osrO   relpathrA   r=   joinrD   rJ   )r>   r_   r`   rO   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%   )skinrX   rQ   npz)rO   c                     g | ]}d | S )bone_ ).0is     r$   
<listcomp>z1SkinWriter.write_on_batch_end.<locals>.<listcomp>   s     ? ? ? ? ? ?r%   fbxT)r`      )rO   rX   rQ   rj   rV   namesr[   group_per_vertexrU   use_extrude_boneuse_connect_unique_child)F) detachcpunumpyrH   r)   r   r-   torchfloat32	enumeratereskinr7   r8   r   rE   saverF   r   rangeappendr   loadrd   rO   rf   ru   rB   rC   r>   _export_fbx	Exceptionprint)%r"   trainerrL   rM   batch_indicesr.   r/   r0   
data_namesrQ   rR   rS   rT   rU   parents_listrX   rZ   r[   skin_pred_listret_sampled_verticesr'   NJF
o_verticesskin_resampledri   raw_dataexporter_parentsrV   rq   ru   rO   erg   rh   s%   `                                  @@r$   write_on_batch_endzSkinWriter.write_on_batch_endQ   sL    = %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 I	" I	"OR)V,, Q%NN5=99@@BBFFHHNNPP	
 2A"A"A!"bqb&)J#!1"!5#BFm&  N S # T         I8H8LU[\^`bab`b\bUcdddH*99T_e#D#DEEE*""'zzH+B/H G"1XX 8 8#A;",,#NN40000#NN8A;7777#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"E +MI	" I	"s   
D?T
T<T77T<c                 &    | xj         dz  c_         d S )N   )rJ   )r"   r   rL   predictionsr   s        r$   write_on_epoch_endzSkinWriter.write_on_epoch_end   s    qr%   r2   )r3   r4   r5   r   r7   r   r    r   r	   r   r   r   r9   r:   s   @r$   r<   r<   9   s        
 04	 #t)$  K-.	     .f"Z f"TRVZ f" f" f" f"P      r%   r<   rZ   rX   r[   r\   returnc                 *   |                     dd          }|                     dd          }|                     dd          }|                     dd          }|                     d	d          }	|j        d
         }
t          |           }|                    ||d          \  }}t	          j        |	 |z            }|                    dd          }||         }||dt          j        f         z                      d          |z  }t	          j        |d d d
dgf         |d d ddgf         |d d dd
gf         gd
          }d }|rt	          j        |d d d
f         |d d df         g          }t	          j        |d d df         |d d d
f         g          }t	          j	        |t                    }t          |||ff|
|
f          }||d d d
f         |d d df         fxx         dz  cc<   ||d d df         |d d d
f         fxx         dz  cc<   ||d d df         |d d df         fxx         dz  cc<   ||d d df         |d d df         fxx         dz  cc<   ||d d df         |d d d
f         fxx         dz  cc<   ||d d d
f         |d d df         fxx         dz  cc<   |                    d          d
k    }t	          j        |          d
         }t          |          }|d
k    r|}t	          j        |
t                    }t	          j        |          ||<   ||         }t          |          }|                    |dd          \  }}t	          j        |          }|}||         ||         z
  dz                      d          dk     }t	          j        ||         |||                  gd          } t	          j        || gd
          }t	          j        ||d d dd
gf         gd
          }t%          |          D ]}!t	          j	        |          }"t	          j        |
d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  cc<   |#|d d df         xx         |$z  cc<   ||"z   d|#z   z  }|r'|%||         |         ||         |         z   dz  }%|%||<   ||                    dd          z  }||k                        dd          }d|||k     |z  <   ||                    dd          z  }|S )Nnearest_samples   
iter_stepsr   	link_sameTr^   g{Gz?r]   r   )kpr   )axiskeepdims.)r   )dtype)shapeg|=g      ?rl   g        )rH   r   r   querynpexpsumnewaxisconcatenate
zeros_liker8   r   wherelenzerosr6   arangestackr   r}   sqrtany)&rZ   rX   r[   r\   rK   r   r   r   r^   r]   r   treedisnearestweights
weight_sumsampled_skin_nearestrj   edgessource_indicesrowcoldatamaskmask_on_boundrymask_boundry_verticesmmap_backmap_tomasked_vertices	tree_edgetarget_indices	new_edgesrb   neighbor_skinneighbor_cocogs&                                         r$   r   r      s]    jj!2A66OL!,,J

;--I

;--IJJw""EqA#$$D::h/Q:??LCfeVc\""G!d33J'0 73
?#;;@@a@HH:UDNE!!!aV),eAAA1vI.>aaa!Qi@PQXYZZZE N #?neAAAqDk5A;788neAAAqDk5A;788}S---4#s,QF;;;U111a4[%1+%&&&$.&&&U111a4[%1+%&&&$.&&&U111a4[%1+%&&&$.&&&U111a4[%1+%&&&$.&&&U111a4[%1+%&&&$.&&&U111a4[%1+%&&&$.&&&(((**Q. !# 9 9! <%&&q55,HXas+++F,.IaLLF() ''<=O00I %???a1?EELCYq\\N$N.~>Q_A``cddiiopiqqtyyN(>":H^TbEc<d!elmnnnINE9#5A>>>ENE5QF#341===E : 
; 
;d++h1vRZ888gqqq!t-qqq!t0EEINNTU`dNeeffVSD5L!!eAAAqDk"""d5A;&7"&<<"""E!!!Q$K   B&   }$k)9: (^/'(84@U;VWe;ffjkk&'"#$((T(222D)O  b4 88D"$D$y.$	$((T(222DKr%   )%collectionsr   torch.distributedr|   	lightningLrd   r{   r   r   r   r   typingr   r   r	   lightning.pytorch.callbacksr
   r   scipy.sparser   scipy.spatialr   
data.orderr   r   data.raw_datar   r   data.exporterr   
model.specr   LightningModuler   r<   r   ro   r%   r$   <module>r      s   # # # # # #         				      1 1 1 1 1 1 1 1 1 1 $ $ $ $ $ $ $ $ $ $ < < < < < <       # # # # # # ! ! ! ! ! ! / / / / / / / / , , , , , , , , $ $ $ $ $ $ " " " " " ""x "x "x "x "x" "x "x "xHA A A A A% A A AFXXX X 	X X X X X X Xr%   