Ë
    ´Œj#)  ã                   ó.  — d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 ddl
mZmZmZmZmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZmZ ddl m!Z! ddl"m#Z#  ed«      Z$ ede¬«      Z%dee$   dee$ge%f   dee$   fd„Z& G d„ de«      Z'y)zo
Ensemble retriever that ensemble the results of
multiple retrievers by using weighted  Reciprocal Rank Fusion
é    N)Údefaultdict)ÚHashableÚIterableÚIterator)Úchain)ÚAnyÚCallableÚOptionalÚTypeVarÚcast)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚDocument)ÚBaseRetrieverÚRetrieverLike)ÚRunnableConfig)Úensure_configÚpatch_config)ÚConfigurableFieldSpecÚget_unique_config_specs)Úmodel_validator)ÚoverrideÚTÚH)ÚboundÚiterableÚkeyÚreturnc              #   ór   K  — t        «       }| D ]$  } ||«      x}|vsŒ|j                  |«       |–— Œ& y­w)a  Yield unique elements of an iterable based on a key function.

    Args:
        iterable: The iterable to filter.
        key: A function that returns a hashable key for each element.

    Yields:
        Unique elements of the iterable based on the key function.
    N)ÚsetÚadd)r   r   ÚseenÚeÚks        úg/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/retrievers/ensemble.pyÚunique_by_keyr&   %   s9   è ø€ ô ‹5€DÛˆÙ�Q“ˆKˆA Ò$Ø�H‰H�QŒKØ‹Gñ ùs   ‚7Ÿ7c                   óº  — e Zd ZU dZee   ed<   ee   ed<   dZe	ed<   dZ
ee   ed<   edee   fd	„«       Z ed
¬«      edeeef   defd„«       «       Ze	 ddedee   dedee   fd„«       Ze	 ddedee   dedee   fd„«       Zdededee   fd„Zdededee   fd„Zddœdededee   dee   fd„Zddœdededee   dee   fd„Zdeee      dee   fd„Z y)ÚEnsembleRetrieverae  Retriever that ensembles the multiple retrievers.

    It uses a rank fusion.

    Args:
        retrievers: A list of retrievers to ensemble.
        weights: A list of weights corresponding to the retrievers. Defaults to equal
            weighting for all retrievers.
        c: A constant added to the rank, controlling the balance between the importance
            of high-ranked items and the consideration given to lower-ranked items.
            Default is 60.
        id_key: The key in the document's metadata used to determine unique documents.
            If not specified, page_content is used.
    Ú
retrieversÚweightsé<   ÚcNÚid_keyr   c                 ó:   — t        d„ | j                  D «       «      S )z+List configurable fields for this runnable.c              3   óB   K  — | ]  }|j                   D ]  }|–— Œ Œ y ­w©N)Úconfig_specs)Ú.0Ú	retrieverÚspecs      r%   Ú	<genexpr>z1EnsembleRetriever.config_specs.<locals>.<genexpr>N   s#   è ø€ ð '
Ù"1�Y¸i×>TÔ>T°dŒDÐ>TˆD¡/ùs   ‚)r   r)   )Úselfs    r%   r1   zEnsembleRetriever.config_specsK   s"   € ô 'ñ '
Ø"&§/¢/ó'
ó 
ð 	
ó    Úbefore)ÚmodeÚvaluesc                 ó\   — |j                  d«      st        |d   «      }d|z  g|z  |d<   |S )Nr*   r)   é   )ÚgetÚlen)Úclsr:   Ún_retrieverss      r%   Úset_weightszEnsembleRetriever.set_weightsR   s;   € ð �z‰z˜)Ô$Ü˜v lÑ3Ó4ˆLØ!" \Ñ!1Ð 2°\Ñ AˆF�9ÑØˆr7   ÚinputÚconfigÚkwargsc                 ó  — ddl m} t        |«      }|j                  |j	                  d«      d |j	                  dd«      |j	                  dg «      | j
                  |j	                  di «      | j                  ¬«      } |j                  d |fd	|j	                  d
«      xs | j                  «       i|¤Ž}	 | j                  |||¬«      } |j                  |fi |¤Ž |S # t        $ r}|j                  |«       ‚ d }~ww xY w)Nr   )ÚCallbackManagerÚ	callbacksÚverboseFÚtagsÚmetadata©rH   Úinheritable_tagsÚ
local_tagsÚinheritable_metadataÚlocal_metadataÚnameÚrun_name©Úrun_managerrC   )Úlangchain_core.callbacksrF   r   Ú	configurer=   rI   rJ   Úon_retriever_startÚget_nameÚrank_fusionÚon_retriever_endÚ	ExceptionÚon_retriever_error)	r6   rB   rC   rD   rF   Úcallback_managerrS   Úresultr#   s	            r%   ÚinvokezEnsembleRetriever.invokeZ   s  € õ 	=ä˜vÓ&ˆØ*×4Ñ4Ø�J‰J�{Ó#ØØ—J‘J˜y¨%Ó0Ø#ŸZ™Z¨°Ó3Ø—y‘yØ!'§¡¨J¸Ó!;ØŸ=™=ð 5ó 
Ðð :Ð&×9Ñ9ØØñ
ð —‘˜JÓ'Ò:¨4¯=©=«?ð
ð ñ	
ˆð
	Ø×%Ñ% e¸ÈVÐ%ÓTˆFð
 )ˆK×(Ñ(Øñàòð ˆMøô ò 	Ø×*Ñ*¨1Ô-Øûð	ús   Â5C Ã	C>Ã'C9Ã9C>c              ‹   óX  K  — ddl m} t        |«      }|j                  |j	                  d«      d |j	                  dd«      |j	                  dg «      | j
                  |j	                  di «      | j                  ¬«      } |j                  d |fd	|j	                  d
«      xs | j                  «       i|¤Žƒ d {  –—† }	 | j                  |||¬«      ƒ d {  –—† } |j                  |fi |¤Žƒ d {  –—†  |S 7 Œ>7 Œ#7 Œ
# t        $ r }|j                  |«      ƒ d {  –—†7   ‚ d }~ww xY w­w)Nr   )ÚAsyncCallbackManagerrG   rH   FrI   rJ   rK   rP   rQ   rR   )rT   r`   r   rU   r=   rI   rJ   rV   rW   Úarank_fusionrY   rZ   r[   )	r6   rB   rC   rD   r`   r\   rS   r]   r#   s	            r%   ÚainvokezEnsembleRetriever.ainvoke   sK  è ø€ õ 	Bä˜vÓ&ˆØ/×9Ñ9Ø�J‰J�{Ó#ØØ—J‘J˜y¨%Ó0Ø#ŸZ™Z¨°Ó3Ø—y‘yØ!'§¡¨J¸Ó!;ØŸ=™=ð :ó 
Ðð @Ð,×?Ñ?ØØñ
ð —‘˜JÓ'Ò:¨4¯=©=«?ð
ð ñ	
÷ 
ˆð	Ø×,Ñ,ØØ'Øð -ó ÷ ˆFð /�+×.Ñ.Øñàñ÷ ð ð ˆMð)
øðøðùô	 ò 	Ø×0Ñ0°Ó3×3Ñ3Øûð	üsf   ‚B7D*Â9C8Â:D*Â?C> ÃC:ÃC> ÃD*Ã1C<Ã2D*Ã:C> Ã<D*Ã>	D'ÄD"ÄDÄD"Ä"D'Ä'D*ÚqueryrS   c                ó&   — | j                  ||«      S )z¶
        Get the relevant documents for a given query.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        )rX   ©r6   rc   rS   s      r%   Ú_get_relevant_documentsz)EnsembleRetriever._get_relevant_documents¨   s   € ð" ×Ñ  {Ó3Ð3r7   c             ƒ   óB   K  — | j                  ||«      ƒ d{  –—† S 7 Œ­w)zÅ
        Asynchronously get the relevant documents for a given query.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        N)ra   re   s      r%   Ú_aget_relevant_documentsz*EnsembleRetriever._aget_relevant_documents»   s!   è ø€ ð" ×&Ñ& u¨kÓ:×:Ð:Ð:ús   ‚˜™)rC   c                óœ  — t        | j                  «      D ��cg c]8  \  }}|j                  |t        ||j	                  d|dz   › �¬«      ¬«      «      ‘Œ: }}}t        t        |«      «      D ]B  }||   D �cg c].  }t        |t        «      rt        t        t        |«      ¬«      n|‘Œ0 c}||<   ŒD | j                  |«      S c c}}w c c}w )zé
        Retrieve the results of the retrievers and use rank_fusion_func to get
        the final result.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        Ú
retriever_r<   ©Útag©rG   ©Úpage_content)Ú	enumerater)   r^   r   Ú	get_childÚranger>   Ú
isinstanceÚstrr   r   Úweighted_reciprocal_rank©r6   rc   rS   rC   Úir3   Úretriever_docsÚdocs           r%   rX   zEnsembleRetriever.rank_fusionÎ   sá   € ô6 !*¨$¯/©/Ô :ô	
ñ !;‘��9ð ×ÑØÜØØ)×3Ñ3¸*ÀQÈÁUÀGÐ8LÐ3ÓMôõð !;ð 	ñ 	
ô ”s˜>Ó*Ö+ˆAð *¨!Ò,ó!á,�Cô :DÀCÌÔ9M”¤d¬3°£nÕ5ÐSVÑVØ,ñ!ˆN˜1Òð ,ð ×,Ñ,¨^Ó<Ð<ùó'	
ùò!s   ™=CÁ73C	c             ƒ   ó¾  K  — t        j                  t        | j                  «      D ��cg c]8  \  }}|j	                  |t        ||j                  d|dz   › �¬«      ¬«      «      ‘Œ: c}}Ž ƒ d{  –—† }t        t        |«      «      D ]4  }||   D �cg c]   }t        |t        «      st        |¬«      n|‘Œ" c}||<   Œ6 | j                  |«      S c c}}w 7 Œfc c}w ­w)zø
        Asynchronously retrieve the results of the retrievers
        and use rank_fusion_func to get the final result.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        rj   r<   rk   rm   Nrn   )ÚasyncioÚgatherrp   r)   rb   r   rq   rr   r>   rs   r   ru   rv   s           r%   ra   zEnsembleRetriever.arank_fusionö   só   è ø€ ô&  'Ÿ~™~ô %.¨d¯o©oÔ$>ô	ñ %?‘L�A�yð ×!Ñ!ØÜ ØØ"-×"7Ñ"7¸jÈÈQÉÈÐ<PÐ"7Ó"Qôõð %?ò	ð 
÷ 
ˆô ”s˜>Ó*Ö+ˆAð *¨!Ò,ó!á,�Cô 3=¸SÄ(Ô2K” cÕ*ÐQTÑTØ,ñ!ˆN˜1Òð ,ð ×,Ñ,¨^Ó<Ð<ùó)	ð
úò!ùs.   ‚(Cª=C
Á'CÁ/CÁ0"CÂ%CÂ7 CÃCÚ	doc_listsc                 óæ  ‡ ‡— t        |«      t        ‰ j                  «      k7  rd}t        |«      ‚t        t        «      Št        |‰ j                  «      D ]f  \  }}t        |d¬«      D ]Q  \  }}‰‰ j                  €|j                  n|j                  ‰ j                     xx   ||‰ j                  z   z  z  cc<   ŒS Œh t        j                  |«      }t        t        |ˆ fd„«      dˆˆ fd„¬«      S )aÁ  
        Perform weighted Reciprocal Rank Fusion on multiple rank lists.
        You can find more details about RRF here:
        https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf

        Args:
            doc_lists: A list of rank lists, where each rank list contains unique items.

        Returns:
            list: The final aggregated list of items sorted by their weighted RRF
                    scores in descending order.
        z<Number of rank lists must be equal to the number of weights.r<   )Ústartc                 óf   •— ‰j                   €| j                  S | j                  ‰j                      S r0   ©r-   ro   rJ   )ry   r6   s    €r%   Ú<lambda>z<EnsembleRetriever.weighted_reciprocal_rank.<locals>.<lambda>F  s2   ø€ à—{‘{Ð*ð ×$Ñ$ð 3àŸ™ d§k¡kÑ2ð3r7   Tc                 óp   •— ‰‰j                   €| j                     S | j                  ‰j                         S r0   r�   )ry   Ú	rrf_scorer6   s    €€r%   r‚   z<EnsembleRetriever.weighted_reciprocal_rank.<locals>.<lambda>M  s1   ø€ ˜IØ$(§K¡KÐ$7�× Ñ òØ=@¿\¹\È$Ï+É+Ñ=Vòr7   )Úreverser   )r>   r*   Ú
ValueErrorr   ÚfloatÚziprp   r-   ro   rJ   r,   r   Úfrom_iterableÚsortedr&   )	r6   r}   ÚmsgÚdoc_listÚweightÚrankry   Úall_docsr„   s	   `       @r%   ru   z*EnsembleRetriever.weighted_reciprocal_rank   sè   ù€ ô  ˆy‹>œS §¡Ó.Ò.ØPˆCÜ˜S“/Ð!ô '2´%Ó&8ˆ	Ü # I¨t¯|©|Ö <ÑˆH�fÜ& x°q×9‘	��cØð  Ÿ;™;Ð.ð ×(Ò(à Ÿ\™\¨$¯+©+Ñ6ó	ð ˜t d§f¡f™}Ñ-ñ.ô ñ :ð !=ô ×&Ñ& yÓ1ˆÜÜØóóð ôô
ð 	
r7   r0   )!Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úlistr   Ú__annotations__r‡   r,   Úintr-   r
   rt   Úpropertyr   r1   r   ÚclassmethodÚdictr   rA   r   r   r   r^   rb   r   rf   r   rh   rX   ra   ru   © r7   r%   r(   r(   6   sÿ  … ñð �]Ñ#Ó#Ø�%‰[ÓØ€A€sƒKØ €FˆH�S‰MÓ àð
˜dÐ#8Ñ9ò 
ó ð
ñ ˜(Ô#Øð  c¨3 h¡ð °Cò ó ó $ðð ð ,0ñ"àð"ð ˜Ñ(ð"ð ð	"ð
 
ˆh‰ò"ó ð"ðH ð ,0ñ&àð&ð ˜Ñ(ð&ð ð	&ð
 
ˆh‰ò&ó ð&ðP4àð4ð 4ð	4ð
 
ˆh‰ó4ð&;àð;ð 9ð	;ð
 
ˆh‰ó;ð0 ,0ò&=àð&=ð 4ð&=ð
 ˜Ñ(ð&=ð 
ˆh‰ó&=ðZ ,0ò(=àð(=ð 9ð(=ð
 ˜Ñ(ð(=ð 
ˆh‰ó(=ðT0
à˜˜X™Ñ'ð0
ð 
ˆh‰ô0
r7   r(   )(r“   r{   Úcollectionsr   Úcollections.abcr   r   r   Ú	itertoolsr   Útypingr   r	   r
   r   r   rT   r   r   Úlangchain_core.documentsr   Úlangchain_core.retrieversr   r   Úlangchain_core.runnablesr   Úlangchain_core.runnables.configr   r   Úlangchain_core.runnables.utilsr   r   Úpydanticr   Útyping_extensionsr   r   r   r&   r(   rš   r7   r%   Ú<module>r¦      s•   ðñó
 Ý #ß 8Ñ 8Ý ÷õ ÷õ .ß BÝ 3ß G÷õ %Ý &áˆCƒL€ÙˆC�xÔ €ð˜H Q™Kð ¨h¸°s¸A°vÑ.>ð À8ÈAÁ;ó ô"Z
˜õ Z
r7   