
    Q
i                     `    d Z ddlmZmZ ddlmZmZ  G d de          Z G d d          ZdS )	z/SVS-VAMANA compression configuration utilities.    )LiteralOptional)	BaseModelFieldc                       e Zd ZU dZdZed         ed<   dZee	         ed<   dZ
ee	         ed<    edd          Zee         ed	<   dZee         ed
<   dZee         ed<   dZee         ed<   dS )	SVSConfiga  SVS-VAMANA configuration model.

    Attributes:
        algorithm: Always "svs-vamana"
        datatype: Vector datatype (float16, float32)
        compression: Compression type (LVQ4, LeanVec4x8, etc.)
        reduce: Reduced dimensionality (only for LeanVec)
        graph_max_degree: Max edges per node
        construction_window_size: Build-time candidates
        search_window_size: Query-time candidates
    
svs-vamana	algorithmNdatatypecompressionz)Reduced dimensionality (only for LeanVec))defaultdescriptionreducegraph_max_degreeconstruction_window_sizesearch_window_size)__name__
__module____qualname____doc__r
   r   __annotations__r   r   strr   r   r   intr   r   r        C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\redisvl/utils/compression.pyr   r      s         
 
 (4Iw|$333"Hhsm"""!%K#%%%!E"M  FHSM    '+hsm***.2hsm222(,,,,,,r   r   c            
           e Zd ZdZdZdddddddZe	 	 dd
eded         de	e
         defd            Ze	 dde
d
ede	e         defd            Zd	S )CompressionAdvisora  Helper to recommend compression settings based on vector characteristics.

    This class provides utilities to:
    - Recommend optimal SVS-VAMANA configurations based on vector dimensions and priorities
    - Estimate memory savings from compression and dimensionality reduction

    Examples:
        >>> # Get recommendations for high-dimensional vectors
        >>> config = CompressionAdvisor.recommend(dims=1536, priority="balanced")
        >>> config.compression
        'LeanVec4x8'
        >>> config.reduce
        768

        >>> # Estimate memory savings
        >>> savings = CompressionAdvisor.estimate_memory_savings(
        ...     compression="LeanVec4x8",
        ...     dims=1536,
        ...     reduce=768
        ... )
        >>> savings
        81.2
    i               )LVQ4LVQ4x4LVQ4x8LVQ8
LeanVec4x8
LeanVec8x8balancedNdimspriority)speedmemoryr)   r   returnc                    | dk    rt          d|            | t          j        k    ri|pd}|dk    rt          d|ddd| d	z  d
          S |dk    r't          d|dddt	          d| dz            d          S t          d|ddd| d	z  d          S |pd}|dk    rt          d|ddd
d          S |dk    rt          d|ddd
d          S t          d|ddd
d          S )a  Recommend compression settings based on dimensions and priorities.

        Args:
            dims: Vector dimensionality (must be > 0)
            priority: Optimization priority:
                - "memory": Maximize memory savings
                - "speed": Optimize for query speed
                - "balanced": Balance between memory and speed
            datatype: Override datatype (default: float16 for high-dim, float32 for low-dim)

        Returns:
            dict: Complete SVS-VAMANA configuration including:
                - algorithm: "svs-vamana"
                - datatype: Recommended datatype
                - compression: Compression type
                - reduce: Dimensionality reduction (for LeanVec only)
                - graph_max_degree: Graph connectivity
                - construction_window_size: Build-time candidates
                - search_window_size: Query-time candidates

        Raises:
            ValueError: If dims <= 0

        Examples:
            >>> # High-dimensional embeddings (e.g., OpenAI ada-002)
            >>> config = CompressionAdvisor.recommend(dims=1536, priority="memory")
            >>> config.compression
            'LeanVec4x8'
            >>> config.reduce
            768

            >>> # Lower-dimensional embeddings
            >>> config = CompressionAdvisor.recommend(dims=384, priority="speed")
            >>> config.compression
            'LVQ4x8'
        r   zdims must be positive, got float16r-   r	   @   i,  r'         )r
   r   r   r   r   r   r   r,      r   (      float32   r#   )r
   r   r   r   r   r   r%   r$   )
ValueErrorr   HIGH_DIM_THRESHOLDr   max)r*   r+   r   base_datatypes       r   	recommendzCompressionAdvisor.recommendF   s   T 199A4AABBB %888$1	M8## **%'-0 ,19')    W$$ **%'-0 ,sDAI..')    !**%'-0 ,19')    %1	M8## **%'-0') &    W$$ **%'-0') (    !**%'-0') (   r   r   r   c                     d}t           j                            | |          }|r|n|}||z  }||z  }d||z  z
  dz  }t          |d          S )a  Estimate memory savings percentage from compression.

        Calculates the percentage of memory saved compared to uncompressed float32 vectors.

        Args:
            compression: Compression type (e.g., "LVQ4", "LeanVec4x8")
            dims: Original vector dimensionality
            reduce: Reduced dimensionality (for LeanVec compression)

        Returns:
            float: Memory savings percentage (0-100)

        Examples:
            >>> # LeanVec with dimensionality reduction
            >>> CompressionAdvisor.estimate_memory_savings(
            ...     compression="LeanVec4x8",
            ...     dims=1536,
            ...     reduce=768
            ... )
            81.2

            >>> # LVQ without dimensionality reduction
            >>> CompressionAdvisor.estimate_memory_savings(
            ...     compression="LVQ4",
            ...     dims=384
            ... )
            87.5
               d   )r   COMPRESSION_BITSgetround)	r   r*   r   	base_bitscompression_bitseffective_dimsoriginal_sizecompressed_sizesavingss	            r   estimate_memory_savingsz*CompressionAdvisor.estimate_memory_savings   su    B 	 .>BB
 

 $*3t y((+;;66#=Wa   r   )r)   N)N)r   r   r   r   r:   rB   staticmethodr   r   r   r   r   r=   floatrK   r   r   r   r   r       s         2     <F"&m mm78m 3-m 
	m m m \m^ =A/! /!/! #/!-5c]/!	/! /! /! \/! /! /!r   r   N)	r   typingr   r   pydanticr   r   r   r   r   r   r   <module>rP      s    5 5 $ $ $ $ $ $ $ $ % % % % % % % %- - - - -	 - - -0F! F! F! F! F! F! F! F! F! F!r   