
    ]i>                     T    S r SSKrSSKrSS jr\R                  " S5      r  SS jrg)z Ways to make the model stronger.    Nc                 z   U R                  5       S:X  d   eU R                  S   U R                  S   :X  d   eU R                  S   n[        R                  " X2U R                  U R
                  S9n[        U5       H,  nU R                  U5      nUR                  SSS9nUSU-   -  nM.     WR                  5       $ )zXThis is the power method. batch size is used to try multiple starting point in parallel.   r      )devicedtypeT)dimkeepdimg|=)
r   shapetorchrandnr   r   rangemmnormmean)mnitersbsr   b_nr   s           G/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/demucs/svd.pypower_iterationr      s    557a<<771:###
''!*CCAHHAGG<A6]DDGvv!Tv* 
 99;    i  c
                    Sn
[         R                  5       U:  a  gU R                  5        GH1  nUR                  SS9 GH  u  pUR	                  5       S-  U:  a  M  U(       aw  [        U[        R                  R                  [        R                  R                  45      (       a4  UR                  5       S;   a   UR                  SS5      R                  5       nUR                  5       S:X  a  UR                  [        U5      S	5      nOQUR                  5       S
:X  a  UR                  [        U5      S	5      nO!UR                  5       S:X  a  GM  U(       a  GM  UR                  5       S:X  d   XR                  45       eU(       a6  [        R                   " USS9S   R#                  S5      R%                  5       nOU(       aa  UR                  u  nnUU:  a   UR'                  UR)                  5       5      nOUR)                  5       R'                  U5      n[+        UX95      nO,[        R,                  " XU5      S   S   R#                  S5      nX-  n
GM     GM4     X-  $ )aC  
Penalty on the largest singular value for a layer.
Args:
    - model: model to penalize
    - min_size: minimum size in MB of a layer to penalize.
    - dim: projection dimension for the svd_lowrank. Higher is better but slower.
    - niters: number of iterations in the algorithm used by svd_lowrank.
    - powm: use power method instead of lowrank SVD, my own experience
        is that it is both slower and less stable.
    - convtr: when True, differentiate between Conv and Transposed Conv.
        this is kept for compatibility with older experiments.
    - proba: probability to apply the penalty.
    - conv_only: only apply to conv and conv transposed, not LSTM
        (might not be reliable for other models than Demucs).
    - exact: use exact SVD (slow but useful at validation).
    - bs: batch_size for power method.
r   g        F)recursei   )      r   r   r   r   )
compute_uv)penalty_rngrandommodulesnamed_parametersnumel
isinstancer   nnConvTranspose1dConvTranspose2dr   	transpose
contiguousviewlenr
   svdpowmaxr   tr   svd_lowrank)modelmin_sizer   r   powmconvtrproba	conv_onlyexactr   totalr   namepestimatear   r   s                     r   svd_penaltyr>      s   & Ee#]]_))%)8GDwwy5 8+a%((":":EHH<T<T!UVVuuw&(KK1-88:uuw!|FF3q62&AFF3q62&A557a<0$0< 99Q59!<@@CGGIww1q5QSSUAA*1f9 ,,QV<Q?BFFqIE7 9 : =r   )r   r   )	g?r   r   FTr   FFr   )__doc__r!   r   r   Randomr    r>    r   r   <module>rB      s4    '  " mmD! JN:;4r   