a
    Aþdo  ã                   @   s  d dl Z d dlZd dlmZmZmZmZ ejZe j 	ejd dd¡Z
e j 	ejd dd¡ZejZe j 	e
d¡Ze j 	e
d	¡Ze j 	e
d
¡Ze j 	ed¡Ze j 	ed¡Ze j 	e
d¡Ze j 	e
d¡Ze j 	e
d¡Ze j 	ed¡Ze j 	ed¡Ze j 	ed¡Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    N)ÚsharedÚpathsÚsd_disable_initializationÚdeviceszStable DiffusionÚconfigszstable-diffusionzStable Diffusion XLÚ	inferencezv2-inference.yamlzv2-inference-v.yamlzv2-inpainting-inference.yamlzsd_xl_base.yamlzsd_xl_refiner.yamlzv2-midas-inference.yamlz#v2-1-stable-unclip-l-inference.yamlz#v2-1-stable-unclip-h-inference.yamlzv1-inpainting-inference.yamlzinstruct-pix2pix.yamlzalt-diffusion-inference.yamlc                 C   s   ddl }tj}t ¡ N |jjjjddddddg d¢d	g d
¢ddddddd}| 	¡  W d  ƒ n1 sj0    Y  t
 ¡ Š dd„ |  ¡ D ƒ}|j|dd |j|t
jd t
jd|dd }t
jd|dd }||t
jdg|d|d|  ¡  ¡ }W d  ƒ n1 s0    Y  |dk S )zp
    Detects whether unet in state_dict is using v-parameterization. Returns True if it is. You're welcome.
    r   NTFé    é   i@  )r	   é   é   r
   )r   r
   r	   r	   é@   r   é   )Úuse_checkpointÚuse_fp16Ú
image_sizeÚin_channelsÚout_channelsÚmodel_channelsÚattention_resolutionsÚnum_res_blocksÚchannel_multÚnum_head_channelsÚuse_spatial_transformerÚuse_linear_in_transformerÚtransformer_depthÚcontext_dimÚlegacyc                 S   s&   i | ]\}}d |v r|  d d¡|“qS )zmodel.diffusion_model.Ú )Úreplace)Ú.0ÚkÚv© r"   ú@/var/www/html/stable-diffusion-webui/modules/sd_models_config.pyÚ
<dictcomp>8   ó    z7is_using_v_parameterization_for_sd2.<locals>.<dictcomp>)Ústrict)ÚdeviceÚdtype)r   r
   r   )r'   g      à?)r   r	   é   r)   iç  )Úcontextéÿÿÿÿ)Ú(ldm.modules.diffusionmodules.openaimodelr   Úcpur   ÚDisableInitializationÚmodulesÚdiffusionmodulesÚopenaimodelÚ	UNetModelÚevalÚtorchÚno_gradÚitemsÚload_state_dictÚtoÚfloatÚonesÚasarrayÚmeanÚitem)Ú
state_dictÚldmr'   ÚunetZunet_sdZ	test_condZx_testÚoutr"   r"   r#   Ú#is_using_v_parameterization_for_sd2   s:    

ñ&
FrB   c                 C   s  |   dd ¡}|   dd ¡}|   dd ¡}|   dd ¡d ur8tS |   dd ¡d urLtS |   dd ¡d ur`tS |d urz|jd dkrztS |d ur”|jd d	kr”tS |d urÌ|jd
 d	krÌ|jd
 dkr¼tS t| ƒrÈt	S t
S |d u rü|jd
 dkrètS |jd
 dk rütS |   dd ¡d urtS tS )NzBcond_stage_model.model.transformer.resblocks.0.attn.in_proj_weightz-model.diffusion_model.input_blocks.0.0.weightzembedder.model.ln_final.weightz-conditioner.embedders.1.model.ln_final.weightz-conditioner.embedders.0.model.ln_final.weightz>depth_model.model.pretrained.act_postprocess3.0.project.0.biasr   i   r   r   é	   r)   z:cond_stage_model.roberta.embeddings.word_embeddings.weight)ÚgetÚconfig_sdxlÚconfig_sdxl_refinerÚconfig_depth_modelÚshapeÚconfig_unclipÚconfig_unopenclipÚconfig_sd2_inpaintingrB   Úconfig_sd2vÚ
config_sd2Úconfig_inpaintingÚconfig_instruct_pix2pixÚconfig_alt_diffusionÚconfig_default)ÚsdÚfilenameZsd2_cond_proj_weightZdiffusion_model_inputZsd2_variations_weightr"   r"   r#   Ú"guess_model_config_from_state_dictD   s6    
rT   c                 C   s2   |d u rt | dƒS t|ƒ}|d ur&|S t | |jƒS )Nr   )rT   Ú$find_checkpoint_config_near_filenamerS   )r>   ÚinfoÚconfigr"   r"   r#   Úfind_checkpoint_configh   s    
rX   c                 C   s8   | d u rd S t j | j¡d › d}t j |¡r4|S d S )Nr   z.yaml)ÚosÚpathÚsplitextrS   Úexists)rV   rW   r"   r"   r#   rU   s   s    rU   )rY   r4   r/   r   r   r   r   Úsd_configs_pathrZ   ÚjoinZsd_repo_configs_pathZsd_xl_repo_configs_pathÚsd_default_configrQ   rM   rL   rK   rE   rF   rG   rI   rJ   rN   rO   rP   rB   rT   rX   rU   r"   r"   r"   r#   Ú<module>   s*   *$