
    +hg                        S SK r S SKrS SKJr  S SKJrJrJr  S SKJ	r	J
r
JrJrJrJrJr  S SKrSSKJrJr  SSKJrJr  \" 5       (       a   \R.                  " \5      r " S S	\5      r\ " S
 S5      5       r\ " S S5      5       r\ " S S5      5       r\ " S S5      5       rS rS r SS jr!SS jr"SS jr#SS jr$SS jr%    SS jr&g)    N)OrderedDict)	dataclassfieldfields)AnyDictListLiteralOptionalTypeUnion   )ConfigMixin
FrozenDict)is_torch_availableloggingc                        \ rS rSrS rS rSrg)InsertableDict!   c                     [        U R                  5       5      nU VVs/ s H  u  pVXQ:w  d  M  XV4PM     nnnUR                  X1U45        U R                  5         U R	                  U5        U $ s  snnf N)listitemsinsertclearupdate)selfkeyvalueindexr   kvs          l/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/modular_pipelines/modular_pipeline_utils.pyr   InsertableDict.insert"   sg    TZZ\" %*6EDAQX!E6 	U%L) 	

E  7s
   A.A.c           	         U (       d  g/ n[        U R                  5       5       H  u  nu  p4[        U[        5      (       a  SUR                   SUR
                   S3nO1SUR                  R                   SUR                  R
                   S3nUR                  U S[        U5       SU S35        M     S	S
R                  U5      -   S-   $ )NzInsertableDict()z<class '.z'>z<obj 'z: (, )zInsertableDict([
  z,
  z
]))
	enumerater   
isinstancetype
__module____name__	__class__appendreprjoin)r   r   ir   r   obj_reprs         r#   __repr__InsertableDict.__repr__2   s    %(6OA|%&&%e&6&6%7q8HK $EOO$>$>#?qAYAY@ZZ\]LLA3c$s)Bxj:;  7 &U(;;fDD     N)r-   r,   __qualname____firstlineno__r   r4   __static_attributes__r7   r6   r#   r   r   !   s     Er6   r   c                      \ rS rSr% SrSr\\   \S'   Sr	\\
   \S'   Sr\\   \S'   Sr\\   \S'   \" SSS	0S
9r\\\\\   4      \S'   \" SSS	0S
9r\\   \S'   \" SSS	0S
9r\\   \S'   \" SSS	0S
9r\\   \S'   Sr\S   \S'   S rS r\S\S\S\4S j5       r\S\\   4S j5       r\S\4S j5       r\S\S\\\\   4   4S j5       r SS\\\\\\4   4      S\4S jjr!S\4S jr"Sr#g) ComponentSpecF   a  Specification for a pipeline component.

A component can be created in two ways:
1. From scratch using __init__ with a config dict
2. using `from_pretrained`

Attributes:
    name: Name of the component
    type_hint: Type of the component (e.g. UNet2DConditionModel)
    description: Optional description of the component
    config: Optional config dict for __init__ creation
    repo: Optional repo path for from_pretrained creation
    subfolder: Optional subfolder in repo
    variant: Optional variant in repo
    revision: Optional revision in repo
    default_creation_method: Preferred creation method - "from_config" or "from_pretrained"
Nname	type_hintdescriptionconfigloadingT)defaultmetadatarepo 	subfoldervariantrevisionfrom_pretrained)from_configrJ   default_creation_methodc                 Z    [        U R                  U R                  U R                  45      $ )z=Make ComponentSpec hashable, using load_id as the hash value.)hashr>   load_idrL   r   s    r#   __hash__ComponentSpec.__hash__e   s"    TYYd.J.JKLLr6   c                     [        U[        5      (       d  gU R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ )z8Compare ComponentSpec objects based on name and load_id.F)r*   r<   r>   rO   rL   )r   others     r#   __eq__ComponentSpec.__eq__i   sW    %//II# N-N,,0M0MM	
r6   	componentreturnc                 z   [        US5      (       a  UR                  S:w  a  SnO[        U[        R                  R
                  5      (       a  [        S5      e[        U[        5      (       a)  [        US5      (       d  [        R                  S5        SnO&[        SU SUR                  R                   S	35      eUR                  n[        U[        5      (       a  US:X  a  UR                  nOS
n[        US5      (       a,  UR                  S:w  a  U R                  UR                  5      nO0 nU " SXXSS.UD6$ )a  Create a ComponentSpec from a Component.

Currently supports:
- Components created with `ComponentSpec.load()` method
- Components that are ConfigMixin subclasses but not nn.Modules (e.g. schedulers, guiders)

Args:
    name: Name of the component
    component: Component object to create spec from

Returns:
    ComponentSpec object

Raises:
    ValueError: If component is not supported (e.g. nn.Module without load_id, non-ConfigMixin)
_diffusers_load_idnullrJ   zeCannot create ComponentSpec from a nn.Module that was not created with `ComponentSpec.load()` method.z\Component was not created using `ComponentSpec`, defaulting to `from_config` creation methodrK   z!Cannot create ComponentSpec from (z). Currently ComponentSpec.from_component() only supports:  - components created with `ComponentSpec.load()` method - components that are a subclass of ConfigMixin but not a nn.Module (e.g. guider, scheduler).N)r>   r?   rA   rL   r7   )hasattrrZ   r*   torchnnModule
ValueErrorr   loggerwarningr.   r-   rA   decode_load_id)clsr>   rW   rL   r?   rA   	load_specs          r#   from_componentComponentSpec.from_components   s?   ( 9233	8T8TX^8^&7# )UXX__55 {  I{33y*>??NNv +8' !7vQy?R?R?[?[>\ ]u v  ''	i--2I]2Z%%FF9233	8T8TX^8^**9+G+GHII 
6
nw
 	
r6   c                     [        U 5       Vs/ s H1  oR                  R                  SS5      (       d  M%  UR                  PM3     sn$ s  snf )uh   
Return the names of all loading‐related fields (i.e. those whose field.metadata["loading"] is True).
rB   F)r   rD   getr>   )re   fs     r#   loading_fieldsComponentSpec.loading_fields   s5    
 !'sP1zz~~i/OPPPs
   $A	A	c                     U R                   S:X  a  gU R                  5        Vs/ s H  n[        X5      PM     nnU Vs/ s H	  o3c  SOUPM     nnSR                  S U 5       5      $ s  snf s  snf )zu
Unique identifier for this spec's pretrained load, composed of repo|subfolder|variant|revision (no empty
segments).
rK   r[   |c              3   6   #    U  H  o(       d  M  Uv   M     g 7fr   r7   ).0ps     r#   	<genexpr>(ComponentSpec.load_id.<locals>.<genexpr>   s     .5aA5s   
	)rL   rl   getattrr1   )r   r!   partsrr   s       r#   rO   ComponentSpec.load_id   sr     ''=8+/+>+>+@A+@a!+@A5:;U9!+U;xx.5... B;s
   A)A.rO   c                     U R                  5       nU Vs0 s H  o3S_M     nnUS:X  a  U$ UR                  S5      n[        U5       H%  u  pgU[        U5      :  d  M  US:X  a  SOUXBU   '   M'     U$ s  snf )a+  
Decode a load_id string back into a dictionary of loading fields and values.

Args:
    load_id: The load_id string to decode, format: "repo|subfolder|variant|revision"
             where None values are represented as "null"

Returns:
    Dict mapping loading field names to their values. e.g. {
        "repo": "path/to/repo", "subfolder": "subfolder", "variant": "variant", "revision": "revision"
    } If a segment value is "null", it's replaced with None. Returns None if load_id is "null" (indicating
    component not created with `load` method).
Nr[   ro   )rl   splitr)   len)re   rO   rl   rk   resultrv   r2   parts           r#   rd   ComponentSpec.decode_load_id   s    " ++-#12>aT'>2fM c" !'GA3~&&48FNDa() (
  3s   A2c                    U R                   b  [        U R                   [        5      (       d  [        S5      eU=(       d    U R                  =(       d    0 n[        U R                   [        5      (       a  U R                   R                  " U40 UD6nO[        R                  " U R                   R                  5      R                  n0 nUR                  5        H  u  pgXd;   d  M  XuU'   M     UR                  5        H  u  pgXd;   d  M  XuU'   M     U R                   " S0 UD6nSUl        [        US5      (       a  UR                  U l        U$ )z/Create component using from_config with config.z?`type_hint` is required when using from_config creation method.r[   rA   r7   )r?   r*   r+   ra   rA   
issubclassr   rK   inspect	signature__init__
parametersr   rZ   r]   )r   rA   kwargsrW   signature_paramsinit_kwargsr!   r"   s           r#   createComponentSpec.create   s    >>!DNND)I)I^__,4;;,"dnnk22226DVDI&001H1HITTK(%&N ' (%&N ' 55I'-	$9h''#**DKr6   c                    U R                  5        Vs0 s H  o"U;   d  M
  X!R                  U5      _M     nnU R                  5        Vs0 s H  o"UR                  U[        X5      5      _M      nnUR                  SS5      nUc  [	        S5      eU R
                  c.   SSKJn  UR                  " U40 UDUD6nUR                  U l        O  U R
                  R                  " U40 UDUD6nXPl        UR                  5        H  u  p[        X	U
5        M     U R                  Ul        U$ s  snf s  snf ! [         a   n[	        SU R                   SU 35      eSnAff = f! [         a   n[	        SU R                   SU 35      eSnAff = f)	z%Load component using from_pretrained.rE   Nz`repo` info is required when using `load` method (you can directly set it in `repo` field of the ComponentSpec or pass it as an argument)r   )	AutoModelzUnable to load z without `type_hint`: z using load method: )rl   poprj   ru   ra   r?   	diffusersr   rJ   	Exceptionr>   r.   rE   r   setattrrO   rZ   )r   r   r   passed_loading_kwargsload_kwargsrE   r   rW   er!   r"   s              r#   loadComponentSpec.load  s    BFATATAV hAV#agZg!5jjo!5AV hZ^ZmZmZopZoSV155c74;MNNZopvt,< \  >>!Y/%55dTkTVT	 '00DNW NN::4Y;YRXY	 	%%'DADQ ('+||	$= !ip  Y ?499+=STUSV!WXXY  W ?499+=QRSQT!UVVWs@   	D)D)	%D.D3 E  3
E=EE 
F
*FF
)rA   rE   r?   r   )$r-   r,   r8   r9   __doc__r>   r   str__annotations__r?   r   r@   rA   r   r   rE   r   r	   rG   rH   rI   rL   r
   rQ   rU   classmethodr   rg   rl   propertyrO   r   rd   r   r   r:   r7   r6   r#   r<   r<   F   s   $ D(3- $Ix~$!%K#%#'FHZ ',1$)UYIZ,[D(5d3i(
)[$R9d:KLIx}L"49d:KLGXc]L#DIt;LMHhsmMIZW%EFZM
 9
# 9
# 9
# 9
 9
v QtCy Q Q 	/ 	/ 	/ S T#x}2D-E  JXeJS#X,F&GH ^a 8" "r6   r<   c                   B    \ rS rSr% Sr\\S'   \\S'   Sr\	\   \S'   Sr
g)
ConfigSpeci)  z5Specification for a pipeline configuration parameter.r>   rC   Nr@   r7   )r-   r,   r8   r9   r   r   r   r   r@   r   r:   r7   r6   r#   r   r   )  s    ?
IL!%K#%r6   r   c                   t    \ rS rSr% SrSr\\S'   Sr\	\S'   Sr
\	\S'   Sr\\S'   S	r\\S
'   Sr\\S'   S rSrg)
InputParami7  z%Specification for an input parameter.Nr>   r?   rC   FrequiredrF   r@   kwargs_typec                 h    SU R                    SU R                  (       a  SOS SU R                   S3$ )N<: r   optionalz
, default=>)r>   r   rC   rP   s    r#   r4   InputParam.__repr__B  s3    499+Rdmm
LJW[WcWcVddeffr6   r7   )r-   r,   r8   r9   r   r>   r   r   r?   r   rC   r   boolr@   r   r4   r:   r7   r6   r#   r   r   7  sG    /D#IsGSHdKKgr6   r   c                   T    \ rS rSr% Sr\\S'   Sr\\S'   Sr	\\S'   Sr
\\S'   S	 rS
rg)OutputParamiF  z&Specification for an output parameter.r>   Nr?   rF   r@   r   c                     SU R                    S[        U R                  S5      (       a  U R                  R                  O[	        U R                  5       S3$ )Nr   r   r-   r   )r>   r]   r?   r-   r   rP   s    r#   r4   OutputParam.__repr__O  sI    		{"PZ8[8[T^^44adeiesesatuuvw	
r6   r7   )r-   r,   r8   r9   r   r   r   r?   r   r@   r   r4   r:   r7   r6   r#   r   r   F  s-    0
IIsKK
r6   r   c                 <   U  Vs/ s H  oR                   (       d  M  UPM     nnU  Vs/ s H  oR                   (       a  M  UPM     nnSR                  S U 5       5      nSR                  S U 5       5      nUnU(       a  U(       a  U SU 3OUnU$ s  snf s  snf )a  
Format input parameters into a string representation, with required params first followed by optional ones.

Args:
    inputs: List of input parameters with 'required' and 'name' attributes, and 'default' for optional params

Returns:
    str: Formatted string of input parameters

Example:
    >>> inputs = [ ... InputParam(name="prompt", required=True), ... InputParam(name="image", required=True), ...
    InputParam(name="guidance_scale", required=False, default=7.5), ... InputParam(name="num_inference_steps",
    required=False, default=50) ... ] >>> format_inputs_short(inputs) 'prompt, image, guidance_scale=7.5,
    num_inference_steps=50'
r'   c              3   8   #    U  H  oR                   v   M     g 7fr   )r>   rq   params     r#   rs   &format_inputs_short.<locals>.<genexpr>h  s     E_EZZ_s   c              3   V   #    U  H  oR                    S UR                   3v   M!     g7f)=N)r>   rC   r   s     r#   rs   r   i  s!     Z/

|1U]]O</s   '))r   r1   )inputsr   required_inputsoptional_inputsrequired_stroptional_str
inputs_strs          r#   format_inputs_shortr   U  s      +1C&NNu&OC*0G&u&OG99E_EEL99Z/ZZLJ8D
|2l^4,
 DGs   BBBBc                 &   / nU  H{  nUR                   U;   a!  UR                  SUR                    S35        M4  UR                   c  UR                  b  SUR                  -   nOUR                   nUR                  U5        M}     U  Vs1 s H  oDR                   iM     nn/ n/ nU HK  n	U	R                   U;   a  UR                  U	R                   5        M0  UR                  U	R                   5        MM     / n
U(       a#  U
R                  SSR                  U5       35        U(       a#  U
R                  SSR                  U5       35        U(       a#  U
R                  SSR                  U5       35        U
(       a  SR                  U
5      $ S	$ s  snf )
a  
Formats intermediate inputs and outputs of a block into a string representation.

Args:
    intermediate_inputs: List of intermediate input parameters
    required_intermediate_inputs: List of required intermediate input names
    intermediate_outputs: List of intermediate output parameters

Returns:
    str: Formatted string like:
        Intermediates:
            - inputs: Required(latents), dtype
            - modified: latents # variables that appear in both inputs and outputs
            - outputs: images # new outputs only
z	Required(r(   z*_z    - inputs: r'   z    - modified: z    - outputs: 
z
    (none))r>   r/   r   r1   )intermediate_inputsrequired_intermediate_inputsintermediate_outputsinput_partsinpinp_name
inputs_setmodified_partsnew_output_partsoutr{   s              r#   format_intermediates_shortr   r  sV   " K"8833388*A67xxCOO$?#//188x( # '::&9s((&9J:N#88z!!!#((+##CHH-	 $ Ftyy'=&>?@(>)B(CDE		2B(C'DEF &499V8L8% ;s   Fc                    U (       d  gSU-  nSUS-   -  nSUS-   -  n/ nS nS n	UR                  U U S35        U  GH  n
U
R                  [        :w  a  U" U
R                  5      OSnU
R                  c  U
R                  b  SU
R                   3OU
R                  nU U S	U S
3n[        U
S5      (       a5  U
R                  (       d$  US-  nU
R                  b  USU
R                   3-  nUS-  nU
R                  (       a5  [        R                  " SSU
R                  5      nU	" XU5      nUSU U 3-  nUR                  U5        GM     SR                  U5      $ )a  Format a list of InputParam or OutputParam objects into a readable string representation.

Args:
    params: List of InputParam or OutputParam objects to format
    header: Header text to use (e.g. "Args" or "Returns")
    indent_level: Number of spaces to indent each parameter line (default: 4)
    max_line_length: Maximum length for each line before wrapping (default: 115)

Returns:
    A formatted string representing all parameters
rF          c                 R   [        U S5      (       aj  U R                  [        L aW  U R                   Vs/ s H+  n[        US5      (       a  UR                  O
[        U5      PM-     nnSSR                  U5       S3$ [        U S5      (       a  U R                  $ [        U 5      $ s  snf )N
__origin__r-   zUnion[r'   ])r]   r   r   __args__r-   r   r1   )r?   ttypess      r#   get_type_str#format_params.<locals>.get_type_str  s    9l++	0D0D0MOXOaOabOa!71j#9#9QZZs1vEOaEbDIIe,-Q//%,Y
%C%Cy!!WYW cs   2B$c                    U R                  5       n/ n/ nSnU Hn  n[        U5      U(       a  SOS-   nU(       a8  Xh-   U:  a0  UR                  SR                  U5      5        U/n[        U5      nMY  UR                  U5        Xh-  nMp     U(       a   UR                  SR                  U5      5        SU 3R                  U5      $ )zFWrap text while preserving markdown links and maintaining indentation.r      r   r   )ry   rz   r/   r1   )	textindent
max_lengthwordslinescurrent_linecurrent_lengthwordword_lengths	            r#   	wrap_text format_params.<locals>.wrap_text  s    

Dd)Lqa@K <z ISXXl34 $v!$T##D)-  LL,/0F8}!!%((r6   :z** (``r   z, *optional*z, defaults to z):z \[(.*?)\]\((https?://[^\s\)]+)\)z[\1](\2)r   

)r/   r?   r   r>   r   r]   r   rC   r@   resubr1   )paramsheaderindent_levelmax_line_lengthbase_indentparam_indentdesc_indentformatted_paramsr   r   r   type_strr>   	param_strdescwrapped_descs                   r#   format_paramsr     sx    $K,*+L)*KX)0 {mF815649OOs4J<0PR+0::+=%BSBSB_E%%&'ejeoeo#nTF#hZq9	 5*%%>>^+	==,>%--!AAIT	 66={EL]L]^D$THL2k]<.99I	*+ . ;;'((r6   c                     [        U SX5      $ )ak  Format a list of InputParam objects into a readable string representation.

Args:
    input_params: List of InputParam objects to format
    indent_level: Number of spaces to indent each parameter line (default: 4)
    max_line_length: Maximum length for each line before wrapping (default: 115)

Returns:
    A formatted string representing all input parameters
Inputsr   )input_paramsr   r   s      r#   format_input_paramsr     s     xOOr6   c                     [        U SX5      $ )ao  Format a list of OutputParam objects into a readable string representation.

Args:
    output_params: List of OutputParam objects to format
    indent_level: Number of spaces to indent each parameter line (default: 4)
    max_line_length: Maximum length for each line before wrapping (default: 115)

Returns:
    A formatted string representing all output parameters
Outputsr   )output_paramsr   r   s      r#   format_output_paramsr      s     	<QQr6   c                    U (       d  gSU-  nSUS-   -  n/ nUR                  U S35        U(       a  UR                  S5        [        U 5       GH!  u  px[        UR                  S5      (       a  UR                  R                  O[        UR                  5      n	U UR                   SU	 S3n
UR                  (       a  U
SUR                   3-  n
/ nUR                  5        H)  n[        X5      nUc  M  UR                  U S	U 35        M+     U(       a  U
S
SR                  U5       S3-  n
UR                  U
5        U(       d  M  U[        U 5      S-
  :  d  GM  UR                  S5        GM$     SR                  U5      $ )a  Format a list of ComponentSpec objects into a readable string representation.

Args:
    components: List of ComponentSpec objects to format
    indent_level: Number of spaces to indent each component line (default: 4)
    max_line_length: Maximum length for each line before wrapping (default: 115)
    add_empty_lines: Whether to add empty lines between components (default: True)

Returns:
    A formatted string representing all components
rF   r   r   zComponents:r-   r   z`)r   r   z [r'   r   r   r   )r/   r)   r]   r?   r-   r   r>   r@   rl   ru   r1   rz   )
componentsr   r   add_empty_linesr   component_indentformatted_componentsr2   rW   	type_namecomponent_descloading_field_values
field_namefield_values                 r#   format_componentsr    s    $KlQ./ ;-{ ;<##B' "*- -4I4G4G,T,TI((Z]^g^q^qZr 	 --inn-=S2N  9#8#8"9::N  "#224J!)8K&$++zl!K=,IJ 5  499-A#B"C1EEN##N3 ?q3z?Q#66 ''+3 .6 99)**r6   c                    U (       d  gSU-  nSUS-   -  n/ nUR                  U S35        U(       a  UR                  S5        [        U 5       H  u  pxU UR                   SUR                   S3n	UR                  (       a  U	SUR                   3-  n	UR                  U	5        U(       d  M`  U[        U 5      S-
  :  d  Mt  UR                  S5        M     S	R                  U5      $ )
a  Format a list of ConfigSpec objects into a readable string representation.

Args:
    configs: List of ConfigSpec objects to format
    indent_level: Number of spaces to indent each config line (default: 4)
    max_line_length: Maximum length for each line before wrapping (default: 115)
    add_empty_lines: Whether to add empty lines between configs (default: True)

Returns:
    A formatted string representing all configs
rF   r   r   zConfigs:z (default: r(   r   r   r   )r/   r)   r>   rC   r@   rz   r1   )
configsr   r   r   r   config_indentformatted_configsr2   rA   config_descs
             r#   format_configsr
  E  s     $K<!+,M }H56  $ w'	&}K?OqQR 2 2344K  - ?q3w<!#33$$R( ( 99&''r6   c                    SnU(       a	  USU S3-  nU(       a>  UR                  5       R                  S5      nSR                  S U 5       5      nXhS-   -  nU(       a   [        U5      S:  a  [	        USS9n	XiS-   -  nU(       a   [        U5      S:  a  [        USS9n
XjS-   -  nU[        U SS9-  nUS-  nU[        USS9-  nU$ )	a  
Generates a formatted documentation string describing the pipeline block's parameters and structure.

Args:
    inputs: List of input parameters
    intermediate_inputs: List of intermediate input parameters
    outputs: List of output parameters
    description (str, *optional*): Description of the block
    class_name (str, *optional*): Name of the class to include in the documentation
    expected_components (List[ComponentSpec], *optional*): List of expected components
    expected_configs (List[ConfigSpec], *optional*): List of expected configurations

Returns:
    str: A formatted string containing information about components, configs, call parameters,
        intermediate inputs/outputs, and final outputs.
rF   zclass r   r   c              3   ,   #    U  H
  nS U-   v   M     g7f)z  Nr7   )rq   lines     r#   rs   "make_doc_string.<locals>.<genexpr>  s      Ds   r   r   )r   )stripry   r1   rz   r  r
  r   r   )r   outputsr@   
class_nameexpected_componentsexpected_configsoutput
desc_linesaligned_desccomponents_strconfigs_strs              r#   make_doc_stringr  k  s    0 F F:,d++  &&(..t4
yy D DD'' s#67!;*+>QO6)) C 01A5$%5AF&& !&q99F fF
"7;;FMr6   )Argsr   s   )r   r  )r   r  T)rF   NNN)'r   r   collectionsr   dataclassesr   r   r   typingr   r   r	   r
   r   r   r   r^   configuration_utilsr   r   utilsr   r   
get_loggerr-   rb   r   r<   r   r   r   r   r   r   r   r   r  r
  r  r7   r6   r#   <module>r"     s     	 # 0 0 B B B  9 / 			H	%E[ EJ _ _ _D & & & g g g 
 
 
:/9dK)\PR4+n#(R 5r6   