ó
    >:j  ã                   ó>   • S SK r \ R                  4S jrS rS rS rg)é    Nc           
      ó°  • U R                  U5      n U R                  u  pEpg[        XU5      n[        R                  " XEXhX2S9n	[        R                  " XEX‡X2S9n
[        U5       Hm  n[        U5       H[  n[        R                  " XUSS2SS24   USSS9u  pÞnUSS2SU24   X›USS2SS24'   USS2SU24   R                  X«USS2SS24'   M]     Mo     X©4$ )a  
Perform slice-wise PCA (SVD) on 4D tensor.

Args:
    tensor: 4D tensor of shape (B, C, H, W)
    r: rank for low-rank approximation
    device: computation device
    dtype: data type

Returns:
    VVT: Right singular vectors (B, C, r, W) UU: Left singular vectors (B, C, H, r)
)ÚdtypeÚdeviceNé   )ÚqÚniterÚMr   )ÚtoÚshapeÚminÚtorchÚzerosÚrangeÚsvd_lowrankÚT)ÚtensorÚrr   r   ÚBÚCÚHÚWÚeffective_rÚUUÚVVTÚiÚjÚUÚ_ÚVs                   ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/adamss/utils.pyÚ	slice_pcar!      sÜ   € ð �Y‰Y�vÓ€FØ—‘�J€Aˆ!ô �a˜A“,€Kä	�Š�Q˜1°Ñ	F€BÜ
�+Š+�a˜K°%Ñ
G€Cä�1ŽXˆÜ�q–ˆAÜ×'Ò'¨°!²Qº¨zÑ(:¸kÐQRÐVZÑ[‰GˆA�!Øšq ! K -Ð/Ñ0ˆB�!’Qšˆz‰NØ¢ 1 [ =Ð 0Ñ1×3Ñ3ˆC�1’aš�
‹Oó ñ ð ˆ7€Nó    c                 ój  •  SSK Jn  U R                  5       R	                  5       R                  5       R                  S5      n[        XR                  S   5      nU" USSUSS9nUR                  U5      n[        R                  " U5      R                  5       U4$ ! [         a    [        S5      ef = f)	aÆ  
Cluster the rows of VT into K subspaces using K-Means.

Args:
    VT: Matrix to cluster (rows are clustered)
    num_subspaces: Number of clusters (subspaces)
    iternum: Maximum iterations for K-Means

Returns:
    cluster_idx: Cluster assignments as a ``torch.LongTensor`` effective_num_subspaces: Actual number of subspaces
    used (``int``)

Note:
    This function requires scikit-learn to be installed. Install it with: pip install scikit-learn
r   )ÚKMeanszdscikit-learn is required for AdaMSS initialization. Please install it with: pip install scikit-learnÚfloat32Úrandomé   iÍ[)Ú
n_clustersÚinitÚn_initÚmax_iterÚrandom_state)Úsklearn.clusterr$   ÚImportErrorÚdetachÚcpuÚnumpyÚastyper   r   Úfit_predictr   Ú
from_numpyÚlong)ÚVTÚnum_subspacesÚiternumr$   ÚvtÚeffective_num_subspacesÚkmeansÚidxs           r    Úclustering_Zr=   2   s°   € ð"
Ý*ð 
�‰‹�‰Ó	×	 Ñ	 Ó	"×	)Ñ	)¨)Ó	4€Bô " -·±¸!±Ó=ÐáØ*°À!ÈgÐdmñ€Fð ×
Ñ
˜RÓ
 €Cä×Ò˜CÓ ×%Ñ%Ó'Ð)@Ð@Ð@øô) ó 
ÜØró
ð 	
ð
ús   ‚B ÂB2c                 ó¼   • [        U R                  5       R                  5       5      S-   n0 n[        U5       H   n[        R
                  " X:H  5      S   X#'   M"     U$ )aX  
Segment indices into locations based on cluster assignments.

Args:
    index: Cluster assignments as a ``torch.LongTensor``

Returns:
    location: Dict mapping cluster id to ``torch.LongTensor`` of row indices.
        Clusters are ordered by their smallest index so that KMeans label permutations do not affect downstream
        ordering.
r'   r   )ÚintÚmaxÚitemr   r   Úwhere)ÚindexÚKÚlocationr   s       r    Úseg_locationsrF   \   sQ   € ô 	ˆE�I‰I‹K×ÑÓÓ !Ñ#€AØ€HÜ�1ŽXˆÜ—k’k %¡*Ó-¨aÑ0ˆ‹ñ à€Or"   c                 ó*   • [        [        U 5      5      $ )z”
Get all trainable subspace indices.

Args:
    num_subspaces: Number of subspaces

Returns:
    List of trainable subspace indices (``list[int]``)
)Úlistr   )r7   s    r    Úget_trainable_subspacesrI   o   s   € ô ”�mÓ$Ó%Ð%r"   )r   r%   r!   r=   rF   rI   © r"   r    Ú<module>rK      s*   ðó ð (-§}¡}ô ò@'AòTó&
&r"   