
    +#h                     @    d dl Z d dlmZ d dlmZ d dlZ G d d      Zy)    N)deque)	Generatorc                   f    e Zd Zd Zd Zddeeed f   ddf   fdZd Z	d Z
d Zd	 Zd
 Zd Zd Zy)
BaseModulec                      y N selfs    S/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/primitives/module.py__init__zBaseModule.__init__   s        c                 .  
 ddl }ddlm
 t               g 
fd}| j                  j                         D ]  \  }}t        |
      r
 |||       t        ||j                        r5t        |dd      r@|j                         D ]  \  }} || d| |        gt        |t        t        f      r#t        |      D ]  \  }} || d| d	|        t        |t              s|j                         D ]  \  }	} || d
|	 d|         S )zR
        Unlike PyTorch, handles (non-recursive) lists of parameters too.
        r   N)	Parameterc                     t        |      r<t        |      vr.j                  t        |             j                  | |f       y y y r   )
isinstanceidaddappend)
param_nameparam_valuer   named_parametersvisiteds     r   add_parameterz2BaseModule.named_parameters.<locals>.add_parameter   sD    +y1boW6TB{O, ''[(AB 7U1r   	_compiledF.[]z['z'])dspydspy.predict.parameterr   set__dict__itemsr   Modulegetattrr   listtuple	enumeratedict)r   r   r   namevaluesub_nameparamidxitemkeyr   r   r   s             @@@r   r   zBaseModule.named_parameters   s$   
 	4%	C
  ==..0 	<KD%%+dE*E4;;/uk59+0+A+A+C C%%az&:EBC ED%=1!*5!1 :IC!TF!C5"2D9: E4(!& <IC!TF"SE"4d;<	<$  r   Nreturnc              #   8  
K   |t         }t        d| fg      
t        |       h
fd}
r
j                         \  }}t	        ||      r||f t	        |t               rA|rt        |dd      rG|j                  j                         D ]  \  }} || d| |        npt	        |t        t        f      r#t        |      D ]  \  }} || d| d|        n7t	        |t              r'|j                         D ]  \  }	} || d|	 d|        
ryyw)	a*  Find all sub-modules in the module, as well as their names.

        Say self.children[4]['key'].sub_module is a sub-module. Then the name will be
        'children[4][key].sub_module'. But if the sub-module is accessible at different
        paths, only one of the paths will be returned.
        Nr   c                 |    t        |      vr.j                  t        |             j                  | |f       y y r   )r   r   r   )r*   r/   queueseens     r   add_to_queuez2BaseModule.named_sub_modules.<locals>.add_to_queue?   s4    $xt#D"dD\* $r   r   Fr   r   r   )r   r   r   popleftr   r%   r"   r#   r&   r'   r(   r)   )r   type_skip_compiledr6   r*   r/   r,   sub_itemir0   r4   r5   s             @@r   named_sub_moduleszBaseModule.named_sub_modules2   s-     =E~&'4z	+
 JD$$&Dj $
+ WT;%F*.--*=*=*? A&Hh D68*!5x@A D4-0#,T? ;KAx D61#Q:; D$'%)ZZ\ =MC D63%q!18<=! s   DDDc                 T    | j                         D cg c]  \  }}|	 c}}S c c}}w r   )r   )r   _r-   s      r   
parameterszBaseModule.parametersW   s#    &*&;&;&=>(!U>>>s   $c                 ,    t        j                  |       S r   )copydeepcopyr
   s    r   rB   zBaseModule.deepcopyZ   s    }}T""r   c                 z    t        j                  |       }|j                         D ]  }|j                           |S r   )rA   rB   r?   reset)r   objr-   s      r   
reset_copyzBaseModule.reset_copy]   s6    mmD!^^% 	EKKM	 
r   c                 r    | j                         D ci c]  \  }}||j                          c}}S c c}}w r   )r   
dump_state)r   r*   r-   s      r   rH   zBaseModule.dump_statee   s1    <@<Q<Q<ST[T5e&&((TTTs   3c                 \    | j                         D ]  \  }}|j                  ||           y r   )r   
load_state)r   stater*   r-   s       r   rJ   zBaseModule.load_stateh   s0    002 	*KD%U4[)	*r   c                     t        |d      5 }|j                  t        j                  | j	                         d             d d d        y # 1 sw Y   y xY w)Nw   )indent)openwriteujsondumpsrH   r   pathfs      r   savezBaseModule.savel   s@    $_ 	>GGEKK 1!<=	> 	> 	>s   5AAc                     t        |      5 }| j                  t        j                  |j	                                      d d d        y # 1 sw Y   y xY wr   )rP   rJ   rR   loadsreadrT   s      r   loadzBaseModule.loadp   s;    $Z 	31OOEKK12	3 	3 	3s   3AA)NF)__name__
__module____qualname__r   r   r   r'   strr<   r?   rB   rF   rH   rJ   rW   r[   r	   r   r   r   r   
   sX    " H#=IeTWYeTeNfhlnrNrDs #=J?#U*>3r   r   )rA   collectionsr   collections.abcr   rR   r   r	   r   r   <module>rb      s      % 
h3 h3r   