§
   ìª*°v�rã                   óÎ   — d Z ddlZddlZddlmZ d\  ZZZdZ	dZ
d\  ZZdZd	\  ZZh d
£Zd„ Zd„ Zd„ Zd„ ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd d„Zd„ Zd!d„Zh d£Zd"d„Zd"d„Z d„ Z!d„ Z"dS )#uŒ  Taste profile, match score, match percentage and reason (docs/plan/pro-tebe/010 Â§5). Pure: no Kodi, no network.

score = content similarity (taste profile vs. the title's features, IDF weighted)
      + co-occurrence (the title is in TMDb recommendations / similar of the seeds, by rank and seed weight)
      + quality (Bayesian rating), each normalised to 0..1 over the pool, minus penalties.
é    N©Úfeatures)g®GázÞ?gìQ¸…ëÑ?g      Ð?çffffffÖ?gffffffò?)ç      à?g333333Ó?çš™™™™™é?)gffffff@éú   >   ÚcsÚenÚskc                 óÆ   ‡— t          j        t          d„ |                      ¦   «         D ¦   «         ¦  «        ¦  «        Š‰r ˆfd„|                      ¦   «         D ¦   «         ni S )Nc              3   ó    K  — | ]	}||z  V — Œ
d S ©N© ©Ú.0Úvs     ú^/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/foryou/score.pyú	<genexpr>z_norm.<locals>.<genexpr>   s&   è è € Ð7Ð7 Q˜1˜q™5Ð7Ð7Ð7Ð7Ð7Ð7ó    c                 ó"   •— i | ]\  }}||‰z  “ŒS r   r   )r   Úkr   Úlengths      €r   ú
<dictcomp>z_norm.<locals>.<dictcomp>   s#   ø€ Ð2Ð2Ð2™d˜a ˆAˆq�6‰zÐ2Ð2Ð2r   )ÚmathÚsqrtÚsumÚvaluesÚitems)Úvecr   s    @r   Ú_normr       s^   ø€ ÝŒY•sÐ7Ð7¨#¯*ª*©,¬,Ð7Ñ7Ô7Ñ7Ô7Ñ8Ô8€FØ6<ÐDÐ2Ð2Ð2Ð2 c§i¢i¡k¤kÐ2Ñ2Ô2Ð2À"ÐDr   c                 óô   — i i }}| D ]n\  }}|d         dk    r|n|}t          |¦  «                             ¦   «         D ]7\  }}|                     |d¦  «        t          |d         ¦  «        |z  z   ||<   Œ8Œo||fS )zl(positive, negative) taste vectors from [(seed, features)]; each seed counts by its weight, unit-normalised.Úweightr   ç        )r    r   ÚgetÚabs)Úseed_featuresÚposÚnegÚseedÚfeatsÚtargetÚnameÚvalues           r   Úprofiler.      sœ   € à�2ˆ€CØ$ð Oð O‰ˆˆeØ˜Xœ¨Ò*Ð*��°ˆÝ  ™<œ<×-Ò-Ñ/Ô/ð 	Oð 	O‰KˆD�%Ø!Ÿ:š: d¨CÑ0Ô0µ3°t¸H´~Ñ3FÔ3FÈÑ3NÑNˆF�4‰LˆLð	Oà�ˆ8€Or   c                 óÎ   ‡— i }| D ]#}|D ]}|                      |d¦  «        dz   ||<   ŒŒ$t          dt          | ¦  «        ¦  «        Šˆfd„|                     ¦   «         D ¦   «         S )z_Inverse document frequency over the candidate pool: 'Drama' says little, a director says a lot.r   é   c                 óL   •— i | ] \  }}|t          j        d ‰|z  z   ¦  «        “Œ!S )ç      ð?)r   Úlog)r   r,   ÚcountÚns      €r   r   zidf.<locals>.<dictcomp>,   s1   ø€ ÐJÐJÐJ±°°eˆD•$”(˜3  U¡™?Ñ+Ô+ÐJÐJÐJr   )r$   ÚmaxÚlenr   )Úfeature_setsÚdfr*   r,   r5   s       @r   Úidfr:   %   s€   ø€ à	€BØð +ð +ˆØð 	+ð 	+ˆDØ—v’v˜d A‘”¨Ñ*ˆBˆt‰HˆHð	+åˆA�s�<Ñ Ô Ñ!Ô!€AØJÐJÐJÐJ¸r¿xºx¹z¼zÐJÑJÔJÐJr   c                 ó†  ‡‡— | r‰sdS t          ˆˆfd„|                      ¦   «         D ¦   «         ¦  «        }t          j        t          ˆfd„|                      ¦   «         D ¦   «         ¦  «        ¦  «        }t          j        t          ˆfd„‰                     ¦   «         D ¦   «         ¦  «        ¦  «        }|r
|r|||z  z  ndS )Nr#   c              3   ó„   •K  — | ]:\  }}|‰                      |d ¦  «        z  ‰                      |d¦  «        dz  z  V — Œ;dS )r#   r2   é   N©r$   )r   r   r   ÚbÚweightss      €€r   r   z_cosine.<locals>.<genexpr>2   sP   øè è € ÐQÐQ¹t¸qÀ!ˆa�!—%’%˜˜3‘-”-Ñ '§+¢+¨a°Ñ"5Ô"5¸Ñ":Ñ:ÐQÐQÐQÐQÐQÐQr   c              3   óV   •K  — | ]#\  }}|‰                      |d ¦  «        z  dz  V — Œ$dS ©r2   r=   Nr>   ©r   r   r   r@   s      €r   r   z_cosine.<locals>.<genexpr>3   ó?   øè è € ÐLÐL¹$¸!¸Q˜˜GŸKšK¨¨3Ñ/Ô/Ñ/°AÑ5ÐLÐLÐLÐLÐLÐLr   c              3   óV   •K  — | ]#\  }}|‰                      |d ¦  «        z  dz  V — Œ$dS rB   r>   rC   s      €r   r   z_cosine.<locals>.<genexpr>4   rD   r   )r   r   r   r   )Úar?   r@   ÚdotÚnaÚnbs    ``   r   Ú_cosinerJ   /   sÉ   øø€ Øð �Að ØˆsÝ
ÐQÐQÐQÐQÐQÀqÇwÂwÁyÄyÐQÑQÔQÑ
QÔ
Q€CÝ	Œ•3ÐLÐLÐLÐLÀ!Ç'Â'Á)Ä)ÐLÑLÔLÑLÔLÑ	MÔ	M€BÝ	Œ•3ÐLÐLÐLÐLÀ!Ç'Â'Á)Ä)ÐLÑLÔLÑLÔLÑ	MÔ	M€BØ Ð0 RÐ0ˆ3�"�r‘'‰?ˆ?¨SÐ0r   )úlang:zm:zoc:údec:zcert:c                 óN   — d„ }t           || ¦  «         ||¦  «        i ¦  «        S )zdCosine of two titles over their specific features (genres, keywords, people, studio, network, saga).c                 ó>   — d„ |                       ¦   «         D ¦   «         S )Nc                 óN   — i | ]"\  }}|                      t          ¦  «        °||“Œ#S r   )Ú
startswithÚGENERIC)r   r   r   s      r   r   z0similarity.<locals>.specific.<locals>.<dictcomp>>   s/   € ÐJÐJÐJ™˜˜A°A·L²LÅÑ4IÔ4IÐJ��1ÐJÐJÐJr   )r   )r   s    r   Úspecificzsimilarity.<locals>.specific=   s   € ØJÐJ §¢¡¤ÐJÑJÔJÐJr   )rJ   )rF   r?   rR   s      r   Ú
similarityrS   ;   s6   € ðKð Kð Kå�8�8˜A‘;”;  ¨¡¤¨RÑ0Ô0Ð0r   c                 ó¢   — |r || z  t           t          z  z   |t           z   z  n	t          dz
  }t          dt          d|dz
  dz  ¦  «        ¦  «        S )z4Bayesian rating mapped to 0..1 (5.0 -> 0, 9.0 -> 1).ç333333ã?r#   r2   g      @g      @)ÚPRIOR_VOTESÚPRIOR_RATINGr6   Úmin)ÚratingÚvotesÚbayess      r   Úqualityr\   B   sS   € àUZÐrˆU�V‰^�k­LÑ8Ñ8¸UÅ[Ñ=PÑQÐQÕ`lÐorÑ`r€EÝˆs•C˜˜e c™k¨SÑ0Ñ1Ô1Ñ2Ô2Ð2r   c                 óð   — d\  }}}|                       ¦   «         D ]W\  \  }}}|dvrŒ|                     |d¦  «        }|dk    rŒ*|dd|dz  z   z  z  |dk    rdnt          z  }	||	z  }|	|k    r||	}}ŒX|||fS )zXSum over seeds of weight x rank decay; returns (value, best seed key, its contribution).)r#   Nr#   )ÚrecÚsimÚkwr#   r   r2   ç      @r^   )r   r$   ÚSIMILAR_FACTOR)
ÚsourcesÚseed_weightÚtotalÚbestÚ
best_valueÚkindÚseed_keyÚrankr"   r-   s
             r   Úcooccurrencerk   H   s²   € à,Ñ€Eˆ4�Ø")§-¢-¡/¤/ð 	/ð 	/ÑÑˆˆx˜$ØÐ+Ð+Ð+ØØ—’ ¨3Ñ/Ô/ˆØ�QŠ;ˆ;ØØ˜#  t¨c¡zÑ!1Ñ2Ñ3¸dÀeºm¸m°s°sÕQ_Ñ`ˆØ�‰ˆØ�:ÒÐØ'¨�*ˆDøØ�$˜
Ð"Ð"r   c                 ó²  ‡‡— d„ |                       ¦   «         D ¦   «         }|r!t          |                     ¦   «         ¦  «        ndŠd„ |                       ¦   «         D ¦   «         }|r!t          |                     ¦   «         ¦  «        ndŠ‰r ˆfd„|                      ¦   «         D ¦   «         ni ˆfd„|                      ¦   «         D ¦   «         d„ | D ¦   «         dœS )z\What the penalties need from the profile: genre shares (of the strongest genre) and decades.c                 ón   — i | ]2\  }}|                      d ¦  «        ¯t          |dd…         ¦  «        |“Œ3S ©úg:r=   N©rP   Úint©r   r5   r   s      r   r   ztaste_of.<locals>.<dictcomp>Z   s=   € ÐJÐJÐJ¡  1°q·|²|ÀDÑ7IÔ7IÐJ�c�!�A�B�B”%‰jŒj˜!ÐJÐJÐJr   r#   c                 ón   — i | ]2\  }}|                      d ¦  «        ¯t          |dd…         ¦  «        |“Œ3S )rL   é   Nrp   rr   s      r   r   ztaste_of.<locals>.<dictcomp>\   s=   € ÐMÐMÐM¡  A¸¿ºÀVÑ8LÔ8LÐM�s�1�Q�R�R”5‰zŒz˜1ÐMÐMÐMr   c                 ó"   •— i | ]\  }}||‰z  “ŒS r   r   )r   Úgr   Útops      €r   r   ztaste_of.<locals>.<dictcomp>^   s#   ø€ Ð<Ð<Ð<¡T Q¨�a˜˜S™Ð<Ð<Ð<r   c                 ó0   •— h | ]\  }}‰¯|‰z  d k    ¯|’ŒS )gš™™™™™É?r   )r   Údr   Útop_decs      €r   ú	<setcomp>ztaste_of.<locals>.<setcomp>_   s1   ø€ ÐXÐXÐX™d˜a ¸ÐXÀQÈÁ[ÐTWÒEWÐEW˜ÐEWÐEWÐEWr   c                 óL   — h | ]!}|                      d ¦  «        ¯|dd…         ’Œ"S )rK   é   N©rP   ©r   r5   s     r   r{   ztaste_of.<locals>.<setcomp>`   s1   € ÐBÐBÐB ¨A¯LªL¸Ñ,AÔ,AÐB�a˜˜˜”eÐBÐBÐBr   )ÚshareÚdecadesÚlangs)r   r6   r   )r'   Úgenresr�   rw   rz   s      @@r   Útaste_ofr„   X   sæ   øø€ àJÐJ¨¯	ª	©¬ÐJÑJÔJ€FØ"(Ð
1�#ˆf�mŠm‰oŒoÑ
Ô
Ð
¨c€CØMÐM¨¯ª©¬ÐMÑMÔM€GØ'.Ð7�c�'—.’.Ñ"Ô"Ñ#Ô#Ð#°C€GØ@CÐKÐ<Ð<Ð<Ð<¨V¯\ª\©^¬^Ð<Ñ<Ô<Ð<ÈØXÐXÐXÐX g§m¢m¡o¤oÐXÑXÔXØBÐB SÐBÑBÔBðDð Dð Dr   c                 óV  — d}t          | d         ¦  «        }|t          j        z  rdS |d         }|t          j        z  D ]=}|                     |d¦  «        dk     r!||                     |d¦  «        dk     rdndz  }Œ>|t          j        z  D ]!}|                     |d¦  «        d	k     r|d
z  }Œ"| d         r$| d         t          vr| d         |d         vr|dz  }| d         }|r|dk     r|dz  dz  |d         vrdS |r#|dk     r|dz  dz  |d         vr||dk     rdnd
z  }| d         dk     r|dz  }n| d         dk     r|dz  }| d         dk    r| d         dk     r|| d         dk     rdndz  }| d         s|d
z  }n+| d         dk    r| d          r| d!         | d          k    r|d"z  }|S )#zPMultiplier < 1 for titles the household is unlikely to want (outside its taste).r2   rƒ   r#   r€   r   ç333333Ã?r   g      è?gš™™™™™¹?gffffffæ?Úlanguager‚   rU   Úyeari¨  é
   r�   iÁ  i·  rZ   é(   é–   g333333ë?é   rY   gš™™™™™@ra   gÍÌÌÌÌÌä?g=
×£p=ê?Úoverviewr	   Úoriginal_titleÚtitleg)\�Âõ(ì?)ÚsetÚFÚBLOCKED_TV_GENRESÚNICHE_GENRESr$   ÚMOOD_GENRESÚ
HOME_LANGS)ÚcardÚtasteÚfactorrƒ   r€   Úgidrˆ   s          r   Úpenaltyrš   c   s5  € à€FÝ��h”Ñ Ô €FØ•Ô#Ñ#ð ØˆsØ�'ŒN€EØ�œÑ&ð Bð BˆØ�9Š9�S˜#ÑÔ Ò%Ð%Ø˜UŸYšY s¨CÑ0Ô0°4Ò7Ð7�c�c¸TÑAˆFøØ�œÑ%ð ð ˆØ�9Š9�S˜#ÑÔ Ò$Ð$Ø�c‰MˆFøØˆJÔð ˜D Ô,µJÐ>Ð>À4È
ÔCSÐ[`ÐahÔ[iÐCiÐCiØ�#‰ˆØ�Œ<€DØð ��t’� ¨¡¨b¡¸¸yÔ9IÐ IÐ IØˆsØð .��t’� ¨¡¨b¡¸¸yÔ9IÐ IÐ IØ˜ š˜�#�#¨#Ñ-ˆØˆG„}�rÒÐØ�#‰ˆˆØ	ˆgŒ˜Ò	Ð	Ø�$‰ˆØˆG„}˜ÒÐ˜t Hœ~°Ò3Ð3Ø˜$˜xœ.¨3Ò.Ð.�$�$°DÑ8ˆØ�
Ôð Ø�#‰ˆˆØ	ˆjÔ	˜TÒ	!Ð	! dÐ+;Ô&<Ð	!ÀÀgÄÐRVÐWgÔRhÒAhÐAhØ�$‰ˆØ€Mr   çš™™™™™©?c                 óÊ   — t          j        d                     | |¦  «                             d¦  «        ¦  «                             ¦   «         }d||d         dz  dz
  z  dz  z   S )zPStable per-day noise, so the page moves a little every day without being random.z{}|{}zutf-8r2   r   g     ào@r   r=   )ÚhashlibÚsha1ÚformatÚencodeÚdigest)ÚdayÚitem_keyÚamountr¡   s       r   Újitterr¥   „   s\   € åŒ\˜'Ÿ.š.¨¨hÑ7Ô7×>Ò>¸wÑGÔGÑHÔH×OÒOÑQÔQ€FØ�˜6 !œ9 uÑ,¨sÑ2Ñ3°aÑ7Ñ7Ð7r   c           
      ó¾   — |dk    rdS t          dt          d| |z  ¦  «        ¦  «        }t          t          ddt	          j        |d¦  «        z  z   ¦  «        ¦  «        S )zRNetflix-like percentage: the best title of the day is ~98 %, an average fit ~75 %.r   r#   r2   é:   rŠ   r   )r6   rX   rq   Úroundr   Úpow)Úscorerf   Úratios      r   Úmatch_percentr¬   Š   sY   € àˆq‚y€yØˆqÝ�•S˜˜e d™lÑ+Ô+Ñ,Ô,€EÝ�u�R˜"�tœx¨¨sÑ3Ô3Ñ3Ñ3Ñ4Ô4Ñ5Ô5Ð5r   é   ro   c                 óˆ   ‡— d„ t          ˆfd„|                      ¦   «         D ¦   «         d„ ¬¦  «        d |…         D ¦   «         S )Nc                 ó   — g | ]\  }}|‘ŒS r   r   )r   r,   Ú_vs      r   ú
<listcomp>z!taste_summary.<locals>.<listcomp>“   s.   € ð Hð Hð H‘X�T˜2ˆDð Hð Hð Hr   c              3   óP   •K  — | ] \  }}|                      ‰¦  «        ¯||fV — Œ!d S r   r~   )r   r   r   Úprefixs      €r   r   z taste_summary.<locals>.<genexpr>“   s=   øè è € Ð(`Ð(`±D°A°qÈ1Ï<Ê<ÐX^ÑK_ÔK_Ð(`¨!¨Q¨Ð(`Ð(`Ð(`Ð(`Ð(`Ð(`r   c                 ó   — | d          S )Nr0   r   )Úkvs    r   ú<lambda>ztaste_summary.<locals>.<lambda>”   s   € ¸¸1¼°v€ r   )Úkey)Úsortedr   )r'   Úlimitr³   s     `r   Útaste_summaryrº   ’   sj   ø€ ðHð H¥Ð(`Ð(`Ð(`Ð(`¸C¿IºI¹K¼KÐ(`Ñ(`Ô(`Ø,=Ð,=ð"?ñ "?ô "?Ø?EÀ¸vô"Gð Hñ Hô Hð Hr   >   éÿ)  é   é   é   é#   é5   c                 ó´   — d\  }}|                      ¦   «         D ];\  }}|r|                     |dz   ¦  «        sŒ t          || i ¦  «        }||k    r||}}Œ<||fS )z}(seed key, cosine) of the positive seed most like the title; only seeds of the same kind (a film is not
    'like' a sitcom).)Nr#   ú:)r   rP   rJ   )r   Úseed_vectorsÚmediarf   r-   r·   r   r_   s           r   Úsimilar_seedrÅ   š   s|   € ð �K€Dˆ%Ø ×&Ò&Ñ(Ô(ð #ð #‰ˆˆSØð 	˜Ÿš¨°©Ñ4Ô4ð 	ØÝ�c˜8 RÑ(Ô(ˆØ�Š;ˆ;Ø˜s�%ˆDøØ�ˆ;Ðr   c                 ó0  ‡‡‡— t          | d         |¦  «        \  }}}	|rP|	dk    rJdddddddœ                     |                     |¦  «        d¦  «        }
|
|                     |d¦  «        |d	œS |                      d
¦  «        pi }ˆfd„|                     ¦   «         D ¦   «         }dD ]N\  Š}
t          ˆˆfd„|D ¦   «         ¦  «        }|r+|d         d         dk    r|
‰|d         d                  dœc S ŒOt	          ||pi | d         d         ¦  «        \  }}|oOt          t          j        | d         d         ¦  «        ¦  «        d„ |pi                      |i ¦  «        D ¦   «         z  }|r"|dk    r|rd|                     |d¦  «        |d	œS | d         d         dk    r| d         d         dk    rdddœS t          d„ |D ¦   «         ¦  «        }|r&dt          |d         d         dd …         ¦  «        dœS d!| d"         v s
d#| d"         v rd$ddœS dddœS )%zR{'kind', 'arg'}: why the title is recommended (rendered with localized templates).rc   r†   Úbecause_watchedÚbecause_likedÚbecause_listÚ
similar_to)ÚwatchedÚlikeÚpickÚlistÚtriedÚstartedÚ )rh   Úargr)   r   c                 óT   •— g | ]$\  }}|‰v ¯	‰                      |d ¦  «        |z  |f‘Œ%S )r#   r>   )r   r,   r-   r'   s      €r   r±   zreason.<locals>.<listcomp>°   sA   ø€ ÐaÐaÐa±[°T¸5ÐUYÐ]`ÐU`ÐU`ˆs�wŠw�t˜SÑ!Ô! EÑ)¨4Ð0ÐU`ÐU`ÐU`r   ))zd:Úmaker)zcol:Ú
collection)zc:Úactorc              3   óz   •K  — | ]5\  }}|                      ‰¦  «        ¯‰                     |¦  «        ¯/||fV — Œ6d S r   )rP   r$   )r   Úsr5   Úfeature_namesr³   s      €€r   r   zreason.<locals>.<genexpr>²   sP   øè è € ÐaÐa¡  A°1·<²<ÀÑ3GÔ3GÐaÈM×L]ÒL]Ð^_ÑL`ÔL`Ða�q˜!�fÐaÐaÐaÐaÐaÐar   éÿÿÿÿr   r›   r0   )rh   rÒ   r–   rÄ   rƒ   c                 óf   — h | ].}|                      d ¦  «        ¯t          |dd…         ¦  «        ’Œ/S rn   rp   r   s     r   r{   zreason.<locals>.<setcomp>¶   sU   € ð MVð MVð MVØÀ!Ç,Â,ÈtÑBTÔBTðMVÝˆAˆaˆbˆbŒE‰
Œ
ðMVð MVð MVr   gáz®GáÚ?rY   g      @rZ   iô  r\   c              3   óŠ   K  — | ]>\  }}|                      d ¦  «        ¯t          |dd…         ¦  «        t          v¯8||fV — Œ?dS rn   )rP   rq   ÚBROAD_GENRES)r   rØ   r5   s      r   r   zreason.<locals>.<genexpr>¼   sT   è è € ÐgÐg™t˜q !°·²¸dÑ1CÔ1CÐgÍÈAÈaÈbÈbÌEÉ
Ì
ÕZfÐHfÐHf�Q˜�FÐHfÐHfÐHfÐHfÐgÐgr   Úgenrer=   NÚtrendÚkindsÚczÚtrending)	rk   r$   r   r¸   rÅ   r�   r‘   Úfolded_genresrq   )Úentryrd   Ú	seed_kindÚseed_titlesr'   rÙ   rÃ   Ú_totalrf   rg   rh   r*   ÚsharedÚhitsr)   r_   Úshares_genrerƒ   r³   s       ``            @r   Úreasonrë   §   sÃ  øøø€ å+¨E°)Ô,<¸kÑJÔJÑ€FˆD�*Øð N�
˜dÒ"Ð"Ø,°oÈØ&°È,ðXð XßX[ÒX[Ð\e×\iÒ\iÐjnÑ\oÔ\oØ]nñYpô Ypð 	ð  [§_¢_°T¸2Ñ%>Ô%>ÈÐMÐMÐMØ�IŠI�jÑ!Ô!Ð' R€EØaÐaÐaÐaÀEÇKÂKÁMÄMÐaÑaÔa€FØRð Eð E‰ˆ�ÝÐaÐaÐaÐaÐa¨ÐaÑaÔaÑaÔaˆØð 	E�D˜”H˜Q”K $Ò&Ð&Ø ¨°t¸B´xÀ´{Ô)CÐDÐDÐDÐDÐDøÝ˜U LÐ$6°B¸¸f¼ÀgÔ8NÑOÔO�I€Dˆ#Øð V�C¥¤°°f´¸hÔ0GÑ HÔ HÑIÔIð MVð MVØ)Ð/¨R×4Ò4°T¸2Ñ>Ô>ðMVñ MVô MVñ V€Làð V��t’� �Ø$¨[¯_ª_¸TÀ2Ñ-FÔ-FÐPTÐUÐUÐUØˆV„}�XÔ #Ò%Ð%¨%°¬-¸Ô*@ÀCÒ*GÐ*GØ!¨"Ð-Ð-Ð-ÝÐgÐg vÐgÑgÔgÑgÔg€FØð @Ø­¨F°2¬J°q¬M¸!¸"¸"Ô,=Ñ(>Ô(>Ð?Ð?Ð?Ø�%˜”.Ð Ð  D¨E°'¬NÐ$:Ð$:Ø"¨2Ð.Ð.Ð.Ø bÐ)Ð)Ð)r   c           
      óÂ   — t          d„ | D ¦   «         ¦  «        }|sdS |t          t          |¦  «        dz
  t          |t          |¦  «        z  ¦  «        ¦  «                 S )Nc              3   ó&   K  — | ]}|d k    ¯|V — ŒdS )r   Nr   r   s     r   r   z_percentile.<locals>.<genexpr>Å   s&   è è € Ð1Ð1˜A¨1¨qª5¨5�a¨5¨5¨5¨5Ð1Ð1r   g•Ö&è.>r0   )r¸   rX   r7   rq   )r   ÚqÚpositives      r   Ú_percentilerð   Ä   s^   € ÝÐ1Ð1 Ð1Ñ1Ô1Ñ1Ô1€HØð ØˆtØ•C�˜H™œ¨Ñ)­3¨qµ3°x±=´=Ñ/@Ñ+AÔ+AÑBÔBÔCÐCr   c                 óª  — t          d„ |                      ¦   «         D ¦   «         ¦  «        }t          |¦  «        }i }|                      ¦   «         D ]’\  }}	t	          ||	d         |¦  «        t
          t	          ||	d         |¦  «        z  z
  }
t          |	d         |¦  «        \  }}}t          d|
¦  «        |t          |	d         d         |	d         d         ¦  «        f||<   Œ“t          d„ |                     ¦   «         D ¦   «         d	¦  «        }t          d
„ |                     ¦   «         D ¦   «         d	¦  «        }|                      ¦   «         D �]\  }}	||         \  }
}}t          d|
|z  ¦  «        t          d||z  ¦  «        }}
|	d         ddhz  r&t          |d|	d         v rt          nt          ¦  «        }t          |
z  t          |z  z   t          |z  z   }t!          |
d¦  «        t!          |d¦  «        t!          |d¦  «        dœ|	d<   d|	d         v rt"          nd}||z  t%          |	d         |¦  «        z  t'          ||¦  «        z  |	d<   �Œ| S )zlFill entry['score'] for every pool entry (in place). Pool entries: {'card', 'features', 'sources', 'kinds'}.c                 ó   — g | ]
}|d          ‘ŒS r   r   )r   Úes     r   r±   zscore_pool.<locals>.<listcomp>Í   s   € Ð8Ð8Ð8 Q�1�Z”=Ð8Ð8Ð8r   r   rc   r#   r–   rY   rZ   c                 ó   — g | ]
}|d          ‘ŒS )r   r   ©r   Úrs     r   r±   zscore_pool.<locals>.<listcomp>Õ   s   € Ð:Ð:Ð:¨˜q œtÐ:Ð:Ð:r   gffffffî?c                 ó   — g | ]
}|d          ‘ŒS )r0   r   rõ   s     r   r±   zscore_pool.<locals>.<listcomp>Ö   s   € Ð7Ð7Ð7 Q˜A˜aœDÐ7Ð7Ð7r   r2   rà   rÔ   Úkeywordr­   )ÚcontentÚcoocr\   ÚpartsÚsagarª   )r:   r   r„   r   rJ   Ú
NEG_FACTORrk   r6   r\   rð   rX   Ú
MAKER_COOCÚKEYWORD_COOCÚ	W_CONTENTÚW_COOCÚ	W_QUALITYr¨   Ú
SAGA_BONUSrš   r¥   )Úpoolr'   r(   rd   r¢   r@   r—   Úrawr   ró   rù   rú   Ú_bestÚ_valueÚmax_contentÚmax_coocÚqualr-   rü   s                      r   Ú
score_poolr  Ë   sJ  € åÐ8Ð8¨$¯+ª+©-¬-Ð8Ñ8Ô8Ñ9Ô9€GÝ�S‰MŒM€EØ
€CØ—
’
‘”ð ]ð ]‰ˆˆ1Ý˜#˜q œ}¨gÑ6Ô6½ÅgÈcÐSTÐU_ÔS`ÐbiÑFjÔFjÑ9jÑjˆÝ*¨1¨Y¬<¸ÑEÔEÑˆˆe�VÝ�c˜7Ñ#Ô# T­7°1°V´9¸XÔ3FÈÈ&Ì	ÐRYÔHZÑ+[Ô+[Ð\ˆˆA‰ˆåÐ:Ð:¨S¯ZªZ©\¬\Ð:Ñ:Ô:¸DÑAÔA€KÝÐ7Ð7¨#¯*ª*©,¬,Ð7Ñ7Ô7¸Ñ>Ô>€HØ—
’
‘”ð 	Oñ 	O‰ˆˆ1Ø! !œfÑˆ��tÝ˜C ¨;Ñ!6Ñ7Ô7½¸SÀ$ÈÁ/Ñ9RÔ9R�ˆØˆWŒ:˜ )Ð,Ñ,ð 	TÝ�t¨7°a¸´jÐ+@Ð+@�Z˜ZÅlÑSÔSˆDÝ˜GÑ#¥f¨t¡mÑ3µiÀ$Ñ6FÑFˆÝ!& w°Ñ!2Ô!2½EÀ$È¹N¼NÝ!& t¨Q¡¤ð1ð 1ˆˆ'‰
à# q¨¤zÐ1Ð1�zˆz°sˆØ˜T‘\¥G¨A¨f¬I°uÑ$=Ô$=Ñ=ÅÀsÈAÁÄÑNˆˆ'‰
‰
Ø€Kr   )r›   )r­   ro   r   )#Ú__doc__r�   r   Ú
wcs.foryour   r‘   r   r  r  rb   r  rþ   rÿ   rý   rW   rV   r•   r    r.   r:   rJ   rQ   rS   r\   rk   r„   rš   r¥   r¬   rº   rÝ   rÅ   rë   rð   r  r   r   r   ú<module>r     s¢  ððð ð €€€Ø €€€à $Ð $Ð $Ð $Ð $Ð $à/Ñ €	ˆ6�9Ø€Ø€
Ø#Ñ €
ˆLØ€
Ø$Ñ €ˆkØÐÐ€
ðEð Eð Eð
ð ð ðKð Kð Kð1ð 1ð 1ð 2€ð1ð 1ð 1ð3ð 3ð 3ð#ð #ð #ð Dð Dð Dðð ð ðB8ð 8ð 8ð 8ð6ð 6ð 6ðHð Hð Hð Hð
 +Ð*Ð*€ð
ð 
ð 
ð 
ð*ð *ð *ð *ð:Dð Dð Dðð ð ð ð r   