ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ U &]^K@sndZddlmZmZddlZddlZz ddlZWnek rLddlZYnXzddl m Z m Z m Z m Z mZmZmZmZmZmZe eeefZe eeefZe egefZe egefZe eeeefgefZWnek rYnXddlmZddZeeZdd ZeeZ d d Z!ee!Z"dd d Z#ee#Z$ddZ%ddZ&ddZ'ee'Z(GdddZ)dS)z< Facilities to work with debtags - tags for Debian packages )absolute_importprint_functionN) CallableDictIOIterableIteratorListOptionalSetTextTuple)function_deprecated_byccsltd}|D]X}||}|s"qt|dd}|drVt|dd}nt}||fVqdS)Nz^(.+?)(?::?\s*|:\s+(.+?)\s*)$, )recompilematchsetgroupsplit) input_dataZlrelinempkgstagsr0/usr/lib/python3/dist-packages/debian/debtags.py parse_tags7s   rcCs0i}t|D]\}}|D]}|||<qq |S)z7Read the tag database, returning a pkg->tags dictionaryrcopy)rdbrrprrrread_tag_databaseLs r$cCsJi}t|D]8\}}|D]*}||kr6|||O<q|||<qq |S)z7Read the tag database, returning a tag->pkgs dictionaryr )rr"rrtagrrrread_tag_database_reversedZsr&cCsi}i}t|D]n\}}|dkr*t|}ntt||}|D]}|||<q<|D]*}||krp|||O<qR|||<qRq||fS)zGRead the tag database, returning a pkg->tags and a tag->pkgs dictionaryN)rrfilterr!)r tag_filterr"Zdbrrrpkgr%rrrread_tag_database_both_waysks r*cCsDi}|D]2\}}|D]$}||kr.t||<|||qq |S)z=Reverse a tag database, from package -> tags to tag->packages)itemsradd)r"resr)rr%rrrreverses r.cCs*|D]\}}td|d|qdS)zWrite the tag databasez%s:rN)r+printjoin)r"r)rrrroutputsr1csfddS)Ncs t|dt|S)Nr)floatcard)r%Zfullsubrrz*relevance_index_function..rr4rr4rrelevance_index_functionsr8c@seZdZdZddZdIddZddZd d Zd d Zd dZ ddZ e e Z ddZ ddZe eZddZddZe eZddZe eZddZe eZddZe eZdd Ze eZd!d"Ze eZd#d$Ze eZd%d&Ze eZ d'd(Z!e e!Z"d)d*Z#e e#Z$d+d,Z%e e%Z&d-d.Z'e e'Z(d/d0Z)e e)Z*d1d2Z+e e+Z,d3d4Z-e e-Z.d5d6Z/d7d8Z0d9d:Z1e e1Z2d;d<Z3e e3Z4d=d>Z5e e5Z6d?d@Z7e e7Z8dAdBZ9e e9Z:dCdDZ;e e;ZdGdHZ?dS)JDBzK In-memory database mapping packages to tags and tags to packages. cCsi|_i|_dSN)r"rdbselfrrr__init__sz DB.__init__NcCst||\|_|_dS)z Read the database from a file. Example:: # Read the system Debtags database db.read(open("/var/lib/debtags/package-tags", "r")) N)r*r"r;)r=rr(rrrreads zDB.readcCs t|j|t|j|dS)z(Quickly write the data to a pickled fileN)pickledumpr"r;r=filerrrqwritesz DB.qwritecCst||_t||_dS)z)Quickly read the data from a pickled fileN)r@loadr"r;rBrrrqreads zDB.qreadcCsF||j|<|D].}||jkr2|j||qt||j|<qdSr:)r!r"r;r,r)r=r)rr%rrrinserts  z DB.insertcCst|jdSr:)r1r"r<rrrrAszDB.dumpcCst|jdSr:)r1r;r<rrr dump_reverseszDB.dump_reversecCst}|j|_|j|_|S)z sz&DB.facet_collection..)r9rriter_packages_tagsrG)r=Zfcollr)rZftagsrrMrfacet_collections  zDB.facet_collectioncCs"t}|j|_|j|_|S)z\ Return a copy of this collection, with the tagsets copied as well. )r9r"r!r;rIrrrr!s  zDB.copycCs"t}|j|_|j|_|S)z` Return the reverse collection, with a copy of the tagsets of this one. )r9r;r!r"rIrrr reverse_copys  zDB.reverse_copycCs@t}i}|D]}||jkr|j|||<q||_t||_|S)zs Return a collection with only the packages in package_iter, sharing tagsets with this one r9r"r.r;r=Z package_iterr-r"r)rrrchoose_packages(s  zDB.choose_packagescCs6t}i}|D]}|j|||<q||_t||_|S)z| Return a collection with only the packages in package_iter, with a copy of the tagsets of this one rRrSrrrchoose_packages_copy9s zDB.choose_packages_copycCsDt}i}t|t|jD]}|j|||<q||_t||_|S)z Return a collection with only those packages that match a filter, sharing tagsets with this one. The filter will match on the package. )r9r'sixiterkeysr"r.r;)r=Zpackage_filterr-r"r)rrrfilter_packagesIs zDB.filter_packagescCsHt}i}t|t|jD]}|j|||<q||_t||_|S)z Return a collection with only those packages that match a filter, with a copy of the tagsets of this one. The filter will match on the package. )r9r'rVrWr"r!r.r;)r=Z filter_datar-r"r)rrrfilter_packages_copyZs zDB.filter_packages_copycCsHt}i}t|t|jD]\}}|j|||<q||_t||_|S)z Return a collection with only those packages that match a filter, sharing tagsets with this one. The filter will match on (package, tags). )r9r'rV iteritemsr"r.r;r=Zpackage_tag_filterr-r"r)_rrrfilter_packages_tagsks zDB.filter_packages_tagscCsLt}i}t|t|jD]\}}|j|||<q||_t||_|S)z Return a collection with only those packages that match a filter, with a copy of the tagsets of this one. The filter will match on (package, tags). )r9r'rVrZr"r!r.r;r[rrrfilter_packages_tags_copy|s zDB.filter_packages_tags_copycCsDt}i}t|t|jD]}|j|||<q||_t||_|S)z Return a collection with only those tags that match a filter, sharing package sets with this one. The filter will match on the tag. )r9r'rVrWr;r.r"r=r(r-r;r%rrr filter_tagss zDB.filter_tagscCsHt}i}t|t|jD]}|j|||<q||_t||_|S)z Return a collection with only those tags that match a filter, with a copy of the package sets of this one. The filter will match on the tag. )r9r'rVrWr;r!r.r"r_rrrfilter_tags_copys zDB.filter_tags_copycCs ||jkS)z2Check if the collection contains the given package)r"r=r)rrr has_packageszDB.has_packagecCs ||jkS)z9Check if the collection contains packages tagged with tag)r;r=r%rrrhas_tagsz DB.has_tagcCs||jkr|j|StS)zReturn the tag set of a package)r"rrbrrrtags_of_packageszDB.tags_of_packagecCs||jkr|j|StS)zReturn the package set of a tag)r;rrdrrrpackages_of_tagszDB.packages_of_tagcstjfdd|DS)z=Return the set of tags that have all the packages in ``pkgs``c3s|]}|VqdSr:)rf)rKr#r<rr sz&DB.tags_of_packages..runion)r=rrr<rtags_of_packagesszDB.tags_of_packagescstjfdd|DS)z=Return the set of packages that have all the tags in ``tags``c3s|]}|VqdSr:)rgrJr<rrrhsz&DB.packages_of_tags..ri)r=rrr<rpackages_of_tagsszDB.packages_of_tagscCs||jkrt|j|SdS)z1 Return the cardinality of a tag r)r;lenrdrrrr3szDB.cardcCs ||}|}t|||S)a Return the discriminance index if the tag. Th discriminance index of the tag is defined as the minimum number of packages that would be eliminated by selecting only those tagged with this tag or only those not tagged with this tag. )r3 package_countmin)r=r%nZtotrrr discriminances zDB.discriminancecCs t|jS)zIterate over the packages)rVrWr"r<rrr iter_packagesszDB.iter_packagescCs t|jS)zIterate over the tags)rVrWr;r<rrr iter_tagssz DB.iter_tagscCs t|jS)z$Iterate over 2-tuples of (pkg, tags))rVrZr"r<rrrrOszDB.iter_packages_tagscCs t|jS)z$Iterate over 2-tuples of (tag, pkgs))rVrZr;r<rrriter_tags_packagesszDB.iter_tags_packagescCs t|jS)zReturn the number of packages)rmr"r<rrrrn szDB.package_countcCs t|jS)zReturn the number of tags)rmr;r<rrr tag_countsz DB.tag_countc Csdd}t}d}tt|D]V}||d|d}t|}|dkrLqv||}||kr|}t|d|d}q|st|ddS|S)av Return an ideal selection of the top tags in a list of tags. Return the tagset made of the highest number of tags taken in consecutive sequence from the beginning of the given vector, that would intersect with the tagset of a comfortable amount of packages. Comfortable is defined in terms of how far it is from 7. cSst|d|d|S)N)r2)xrrr score_fun(sz"DB.ideal_tagset..score_funNrr)rrangermrl) r=rrxZtagsetZ min_scoreirr3Zscorerrr ideal_tagsetszDB.ideal_tagsetc#s|D]|fdd}|fdd}|D]R}|krFq8t||t|}t||t|}|||fVq8qdS)z Generate the list of correlation as a tuple (hastag, hasalsotag, score). Every tuple will indicate that the tag 'hastag' tends to also have 'hasalsotag' with a score of 'score'. cs |dkSNrrZptZpivotrrr6Hr7z!DB.correlations..cs |dkSr}rr~rrrr6Ir7N)rsr]r2r3rn)r=Zwith_Zwithoutr%ZhasZhasntrrr correlations>s  zDB.correlations)N)@__name__ __module__ __qualname____doc__r>r?rDrFrGrArHrZ dumpReverser.rPZfacetCollectionr!rQZ reverseCopyrTZchoosePackagesrUZchoosePackagesCopyrXZfilterPackagesrYZfilterPackagesCopyr]ZfilterPackagesTagsr^ZfilterPackagesTagsCopyr`Z filterTagsraZfilterTagsCopyrcZ hasPackagereZhasTagrfZ tagsOfPackagergZ packagesOfTagrkZtagsOfPackagesrlZpackagesOfTagsr3rqrrZ iterPackagesrsZiterTagsrOZiterPackagesTagsrtZiterTagsPackagesrnZ packageCountruZtagCountr|Z idealTagsetrrrrrr9sz     $r9)N)*rZ __future__rrrrVZcPickler@ ImportErrortypingrrrrrr r r r r strZ PkgTagDbTypeZ TagPkgDbTypeboolZ PkgFilterTypeZ TagFilterTypeZPkgTagFilterTypeZdebian.deprecationrrZ parseTagsr$ZreadTagDatabaser&ZreadTagDatabaseReversedr*ZreadTagDatabaseBothWaysr.r1r8ZrelevanceIndexFunctionr9rrrrs> 0      $