§
    ÎÐj5  ã                   ó,   — d Z ddlZ G d„ d¦  «        ZdS )z
The following code is copied from https://github.com/modelscope/DiffSynth-Studio/blob/main/diffsynth/schedulers/flow_match.py
é    Nc                   ó<   — e Zd ZdZdd„Zdd„Zdd	„Zd
„ Zd„ Zd„ Z	dS )ÚFlowMatchSchedulerFéd   éè  ç      @ç      ð?çJ°«ðå†h?c	                 ó’   — || _         || _        || _        || _        || _        || _        || _        |                      |¦  «         d S ©N)Únum_train_timestepsÚshiftÚ	sigma_maxÚ	sigma_minÚinverse_timestepsÚextra_one_stepÚreverse_sigmasÚset_timesteps)	ÚselfÚnum_inference_stepsr   r   r   r   r   r   r   s	            úDC:\Users\johnn\OneDrive\Documents\AI\shared\utils\basic_flowmatch.pyÚ__init__zFlowMatchScheduler.__init__   sR   € Ø#6ˆÔ ØˆŒ
Ø"ˆŒØ"ˆŒØ!2ˆÔØ,ˆÔØ,ˆÔØ×ÒÐ.Ñ/Ô/Ð/Ð/Ð/ó    c                 ó¤  — | j         | j        | j         z
  |z  z   }| j        r,t          j        || j         |dz   ¦  «        d d…         | _        n t          j        || j         |¦  «        | _        | j        r!t          j        | j        dg¬¦  «        | _        | j        | j        z  d| j        dz
  | j        z  z   z  | _        | j	        rd| j        z
  | _        | j        | j
        z  | _        |rd| j        }t          j        d||dz  z
  |z  dz  z  ¦  «        }||                     ¦   «         z
  }|||                     ¦   «         z  z  }|| _        d S d S )Né   éÿÿÿÿr   )Údimséþÿÿÿé   )r   r   r   ÚtorchÚlinspaceÚsigmasr   Úflipr   r   r   Ú	timestepsÚexpÚminÚsumÚlinear_timesteps_weights)	r   r   Údenoising_strengthÚtrainingÚsigma_startÚxÚyÚ	y_shiftedÚbsmntw_weighings	            r   r   z FlowMatchScheduler.set_timesteps   s€  € Ø”nØŒ^˜dœnÑ,Ð0BÑBñCˆàÔð 	BÝœ.Ø˜Tœ^Ð-@À1Ñ-DñFô FØFIÀrÀcôKˆDŒKˆKõ  œ.Ø˜Tœ^Ð-@ñBô BˆDŒKàÔ!ð 	<Ýœ* T¤[¸°sÐ;Ñ;Ô;ˆDŒKØ”j 4¤;Ñ.Ø�$”*˜q‘. D¤KÑ/Ñ/ñ1ˆŒàÔð 	*Ø˜dœk™/ˆDŒKØœ tÔ'?Ñ?ˆŒØð 	<Ø”ˆAÝ”	˜" Ð%8¸1Ñ%<Ñ!<Ø-ñ!.Ø23ñ 4ñ 4ñ 5ô 5ˆAà˜AŸEšE™GœG™ˆIØ'Ø$ y§}¢}¡¤Ñ6ñ8ˆOà,;ˆDÔ)Ð)Ð)ð	<ð 	<r   c                 ó$  — | j                              |j        ¦  «        | _         | j                             |j        ¦  «        | _        t	          j        | j        |z
                       ¦   «         d¬¦  «        }| j         |                              dddd¦  «        }|s-|dz   t          | j        ¦  «        k     	                    ¦   «         r| j
        s| j        rdnd}n&| j         |dz                                 dddd¦  «        }||||z
  z  z   }|gS )Nr   ©Údimr   r   )r!   ÚtoÚdevicer#   r   ÚargminÚabsÚreshapeÚlenÚanyr   r   )	r   Úmodel_outputÚtimestepÚsampleÚto_finalÚtimestep_idÚsigmaÚsigma_Úprev_samples	            r   ÚstepzFlowMatchScheduler.step0   s  € Ø”k—n’n \Ô%8Ñ9Ô9ˆŒØœ×*Ò*¨<Ô+>Ñ?Ô?ˆŒÝ”lØŒ^˜hÑ&×+Ò+Ñ-Ô-°1ð6ñ 6ô 6ˆà”˜KÔ(×0Ò0°°Q¸¸1Ñ=Ô=ˆØð 	G˜ a™­3¨t¬~Ñ+>Ô+>Ò>×CÒCÑEÔEð 	GàÔ&ðFØ*.Ô*=ðF�Q�QØDEð ˆFð ”[ ¨q¡Ô1×9Ò9¸"¸aÀÀAÑFÔFˆFØ˜|¨v¸©~Ñ>Ñ>ˆØˆ}Ðr   c                 óÊ  — | j                              |j        ¦  «        | _         | j                             |j        ¦  «        | _        t	          j        | j                             d¦  «        |                     d¦  «        z
                       ¦   «         d¬¦  «        }| j         |                              dddd¦  «        }d|z
  |z  ||z  z   }| 	                    |¦  «        S )a3  
        Diffusion forward corruption process.
        Input:
            - clean_latent: the clean latent with shape [B, C, H, W]
            - noise: the noise with shape [B, C, H, W]
            - timestep: the timestep with shape [B]
        Output: the corrupted latent with shape [B, C, H, W]
        r   r   r0   r   )
r!   r2   r3   r#   r   r4   Ú	unsqueezer5   r6   Útype_as)r   Úoriginal_samplesÚnoiser:   r=   r>   r;   s          r   Ú	add_noisezFlowMatchScheduler.add_noise>   sË   € ð ”k—n’n U¤\Ñ2Ô2ˆŒØœ×*Ò*¨5¬<Ñ8Ô8ˆŒÝ”lØŒ^×%Ò% aÑ(Ô(¨8×+=Ò+=¸aÑ+@Ô+@Ñ@×EÒEÑGÔGÈQðPñ Pô Pˆà”˜KÔ(×0Ò0°°Q¸¸1Ñ=Ô=ˆØ�e‘)Ð/Ñ/°%¸%±-Ñ?ˆØ�~Š~˜eÑ$Ô$Ð$r   c                 ó   — ||z
  }|S r   © )r   r;   rF   r:   Útargets        r   Útraining_targetz"FlowMatchScheduler.training_targetO   s   € Ø˜‘ˆØˆr   c                 ó¶   — t          j        | j        |                     | j        j        ¦  «        z
                       ¦   «         ¦  «        }| j        |         }|S r   )r   r4   r#   r2   r3   r5   r'   )r   r:   r=   Úweightss       r   Útraining_weightz"FlowMatchScheduler.training_weightS   sN   € Ý”lØŒ^˜hŸkšk¨$¬.Ô*?Ñ@Ô@Ñ@×EÒEÑGÔGñIô IˆàÔ/°Ô<ˆØˆr   N)r   r   r   r   r	   FFF)r   r   F)F)
Ú__name__Ú
__module__Ú__qualname__Úis_statefulr   r   rA   rG   rK   rN   rI   r   r   r   r   
   s‚   € € € € € Ø€Kð0ð 0ð 0ð 0ð<ð <ð <ð <ð2ð ð ð ð%ð %ð %ð"ð ð ðð ð ð ð r   r   )Ú__doc__r   r   rI   r   r   ú<module>rT      sV   ððð ð €€€ðMð Mð Mð Mð Mñ Mô Mð Mð Mð Mr   