o
    ajy*                     @   s~   d dl Z d dlZd dlZd dlmZmZmZ dd ZG dd dZ	G dd de j
ZG d	d
 d
e j
Zedkr=e   dS dS )    N)
BodyEngine
BodyStreambasis_to_humanoid_spacec                 C   sb   | t jj| ddd } |t jj|ddd }t t t j| | dddd}t dt | S )NT)axiskeepdimsr                 ?       @)nplinalgnormclipabssumrad2degarccos)qaqbdot r   test_streaming.py_quaternion_delta_degrees	   s   "r   c                   @   sH   e Zd ZdZdZdZdZdddZd	d
 Zdd Z	dddZ
dd ZdS )_FakeEngine         )hipsspine      @r   c                 C   s   g | _ || _t|| _d S )N)callsrollout_bias_degreessetnegate_calls)selfr"   r$   r   r   r   __init__   s   z_FakeEngine.__init__c                 C   s   t d| jdfdS )N   g      )torchfullPRE)r%   emotionr   r   r   seed_for   s   z_FakeEngine.seed_forc                 C   sN   | j | | |f dt| j d  }tj||| j tjd	dddS )Nd   r'   dtyper   )
r!   appendcopyclonelenr(   arangeSEQfloat32reshape)r%   onsetseedr+   styleguidanceoffsetr   r   r   
gen_window   s   "z_FakeEngine.gen_windowTc                 C   s   t j| jd t jd}|d | || j  }t |d }t j| jd t| jdft jd}t 	|d d d f |d< t 
|d d d f |d< |rR|| jv rR| }|S )N   r.   g      8@r   ).r   ).   )r   r4   r5   r6   r"   deg2radzerosr3   
bone_namessincosr$   )r%   
call_indexsignedframedegreeshalfqr   r   r   rollout_quaternions#   s   "z_FakeEngine.rollout_quaternionsc                 C   s   t |d  d }| |S )N)r   r   r   r-   )intitemrK   )r%   grE   r   r   r   _decode_latent4   s   
z_FakeEngine._decode_latentN)r    r   )T)__name__
__module____qualname__r*   r5   WIN_SAMPrB   r&   r,   r=   rK   rO   r   r   r   r   r      s    

r   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )BodyStreamTestsc                 C   sx   t  }t|ddd}tjdtjd}|| |jd d }| t|d d dk | t|dd  d	k d S )
Nneutral   emit_frames)   r   r.   r      r'   )	r   r   r   onesr6   tickr!   
assertTrueall)r%   engstreamchunkr8   r   r   r   9test_feature_window_is_left_padded_so_new_audio_is_at_now:   s   
 zIBodyStreamTests.test_feature_window_is_left_padded_so_new_audio_is_at_nowc                 C   sz   t  }t|ddd}|tjdtjd |tjdtjd |jd d  d}tj	
|tjdd	gtjd d S )
NrU   rV   rW   )r>   r   r.   r'   r   r         @)r   r   r]   r   r\   r6   r!   numpyr7   testingassert_array_equalarray)r%   r`   ra   second_seedr   r   r   8test_next_seed_uses_time_aligned_slice_not_previous_tailC   s   "zHBodyStreamTests.test_next_seed_uses_time_aligned_slice_not_previous_tailc                 C   s   t  }dd }t|dd|d}|d}|tj|tjd}| |jd |jtjd	tjdd
d}t	|d	 d d }| |j|ddf | |j
| d S )Nc                 S      t j| t | gddS Nr   r   r   stack
zeros_likeaudio_srr   r   r   <lambda>M       z^BodyStreamTests.test_pcm_steps_emit_codec_aligned_frame_count_and_flush_tail.<locals>.<lambda>joyrV   rX   
feature_fnr   r.   r   r   r>   i   Tflush   >  r   r>   )r   r   _samples_for_steppush_pcmr   r\   r6   assertEqualshaperoundframes_emitted)r%   r`   rw   ra   first_nouttailexpectedr   r   r   <test_pcm_steps_emit_codec_aligned_frame_count_and_flush_tailK   s   
zLBodyStreamTests.test_pcm_steps_emit_codec_aligned_frame_count_and_flush_tailc                 C   sv   t  }dd }t|dd|d}|tj|dtjd}|tj|dtjd}| |jd	 | |jd
 d S )Nc                 S   rk   rl   rm   rp   r   r   r   rs   Y   rt   z\BodyStreamTests.test_regular_packets_are_held_for_one_rollout_of_lookahead.<locals>.<lambda>rU      rv   r   r.   r'   rx   )r   r   r>   )	r   r   r~   r   r\   r}   r6   r   r   )r%   r`   rw   ra   firstsecondr   r   r   :test_regular_packets_are_held_for_one_rollout_of_lookaheadW   s   zJBodyStreamTests.test_regular_packets_are_held_for_one_rollout_of_lookaheadc              	   C   s   dd }dD ]G}| j |d7 t }t|dd|d}|jtj|tjdd	d
}| t|t	|d d  | |j
t| W d    n1 sHw   Y  qd S )Nc                 S   rk   rl   rm   rp   r   r   r   rs   g   rt   zbBodyStreamTests.test_total_frames_match_30fps_for_tiny_and_long_final_remainders.<locals>.<lambda>)r'   r-   i  i1  i 2  id2  idq )	n_samplesrU   r   rv   r.   Try   r{   r|   )subTestr   r   r~   r   r\   r6   r   r3   r   r   )r%   rw   r   r`   ra   r   r   r   r   @test_total_frames_match_30fps_for_tiny_and_long_final_remaindersf   s   zPBodyStreamTests.test_total_frames_match_30fps_for_tiny_and_long_final_remaindersc           
   	   C   s  dd }dD ]}| j |d t }t|dd|d}|d}|tj|tjd	 t|d
 d }|jtj|tjd	dd}| 	|j
d| ddf |jd d  d}tj|tjddgtjd	 | t|jd d dk |jddd}	tjj|d |	d dd tjj|d |	d dd tjj|d |	d| d  dd tjjt|d |d t|	d |	d dd W d    n1 sw   Y  qd S )Nc                 S   rk   rl   rm   rp   r   r   r   rs   q   rt   zeBodyStreamTests.test_partial_flush_uses_regular_seed_shift_and_adjacent_tail_prefix.<locals>.<lambda>)r'   r   r?   rY      )remainder_framesrU   r   rv   r   r.   r|   r{   Try   r   r>   r'   r   r    g      @FrF   r   '   ư>atol(   h㈵>)r   r   r   r}   r~   r   r\   r6   r   r   r   r!   re   r7   rf   rg   rh   r^   r_   rK   assert_allcloser   )
r%   rw   r   r`   ra   regular_samplesremainder_samplespacketri   rollout_oner   r   r   Ctest_partial_flush_uses_regular_seed_shift_and_adjacent_tail_prefixp   sB   
zSBodyStreamTests.test_partial_flush_uses_regular_seed_shift_and_adjacent_tail_prefixc           
   	   C   s
  t  }dd }t|dd|d}g }tdD ]}||tj||tjd q|j	dd	d
}|j	dd	d
}tj
j|d d |d dd tj
j|d d |d dd tj
j|d d |d dd t|d d |d d }t|d |d }	tj
j||	dd d S )Nc                 S   rk   rl   rm   rp   r   r   r   rs      rt   z]BodyStreamTests.test_packet_seam_uses_adjacent_frames_from_the_same_rollout.<locals>.<lambda>rU   r   rv   r?   r.   r'   Fr   r   r   r   r   r   r   r   r   )r   r   ranger0   r~   r   r\   r}   r6   rK   rf   r   r   )
r%   r`   rw   ra   packetsstepr   rollout_zero
seam_deltarollout_deltar   r   r   ;test_packet_seam_uses_adjacent_frames_from_the_same_rollout   s(   zKBodyStreamTests.test_packet_seam_uses_adjacent_frames_from_the_same_rolloutc                 C   s   t ddd}dd }t|dd|d}|tj|d	tjd
 |tj|dtjd
}|jd	dddd  }tjj	||dd tjj	tj
j|ddtj|jd d tjd
dd d S )Nr	   )r'   )r"   r$   c                 S   rk   rl   rm   rp   r   r   r   rs      rt   z]BodyStreamTests.test_lookahead_slerp_normalizes_and_aligns_quaternion_signs.<locals>.<lambda>rU   r   rv   r   r.   r'   Fr   ir   r   r   r   )r   r   r~   r   r\   r}   r6   rK   rf   r   r   r   r   )r%   r`   rw   ra   r   r   r   r   r   ;test_lookahead_slerp_normalizes_and_aligns_quaternion_signs   s   
zKBodyStreamTests.test_lookahead_slerp_normalizes_and_aligns_quaternion_signsN)rP   rQ   rR   rc   rj   r   r   r   r   r   r   r   r   r   r   rT   9   s    	
(rT   c                   @   s   e Zd Zdd Zdd ZdS )BodyRigSpaceTestsc           
      C   s   t tj}tjg dtjd}t||df}t|d|df}tjd}td}d|d|g||< dtdd }}|dd|g|d	|f< t	||}	tj
j|	d	|f tjdd| |gtjdd
d dS )zBA source-rest Y rotation maps local X arm-down into normalized -Z.r	   r	   r	   r
   r.   r'   leftUpperArmg      ?r	   rd   r   r   r   r   N)r3   r   rB   r   rh   r6   tileindexsqrtr   rf   r   )
r%   n_bonesidentity
world_restbasisarmsin45sin30cos30	convertedr   r   r   Htest_source_world_rest_conjugation_rotates_basis_axis_for_normalized_rig   s   




zZBodyRigSpaceTests.test_source_world_rest_conjugation_rotates_basis_axis_for_normalized_rigc                 C   s   |  dtj | dtj | ttjd tt}t	tj
g dtjdttjdf|_t	tj
g dtjddttjdf}|j|dd}| |jd	 d S )
N
upperChest+   r   r.   r'   r   T)mapped_only)r   r   r>   )assertInr   rB   assertNotInstream_bone_namesr   r3   __new__r   r   rh   float64_WORLD_REST_ARRr6   basis_to_humanoidr   )r%   r`   rJ   mappedr   r   r   /test_stream_contract_omits_unmapped_upper_chest   s   
zABodyRigSpaceTests.test_stream_contract_omits_unmapped_upper_chestN)rP   rQ   rR   r   r   r   r   r   r   r      s    r   __main__)unittestre   r   r(   body_enginer   r   r   r   r   TestCaserT   r   rP   mainr   r   r   r   <module>   s    ) '