§
    kÃ¿aØS  ã                   ó\  — d Z ddlmZ ddlmZ ddlmZ g d¢ZddlmZmZm	Z	 ddl
mZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZmZ erddlmZ d„ Z G d„ de ¦  «        Z! G d„ de ¦  «        Z" G d„ de¦  «        Z#ee$ge%f         Z&eee%e$f         eee%e$f         f         Z'ee'df         Z(eee(e$f                  Z)ee$ee%e$f         f         Z* G d„ d¦  «        Z+ee         Z,eg df         Z- G d„ de ¦  «        Z.d„ Z/d„ Z0d#d„Z1d„ Z2 e¦   «         Z3d„ Z4d „ Z5d!„ Z6d"„ Z7dS )$aó  
A collection of utilities for canonicalizing and inspecting graphs.

Among other things, they solve of the problem of deterministic bnode
comparisons.

Warning: the time to canonicalize bnodes may increase exponentially on
degenerate larger graphs. Use with care!

Example of comparing two graphs::

    >>> g1 = Graph().parse(format='n3', data='''
    ...     @prefix : <http://example.org/ns#> .
    ...     <http://example.org> :rel
    ...         <http://example.org/same>,
    ...         [ :label "Same" ],
    ...         <http://example.org/a>,
    ...         [ :label "A" ] .
    ... ''')
    >>> g2 = Graph().parse(format='n3', data='''
    ...     @prefix : <http://example.org/ns#> .
    ...     <http://example.org> :rel
    ...         <http://example.org/same>,
    ...         [ :label "Same" ],
    ...         <http://example.org/b>,
    ...         [ :label "B" ] .
    ... ''')
    >>>
    >>> iso1 = to_isomorphic(g1)
    >>> iso2 = to_isomorphic(g2)

These are not isomorphic::

    >>> iso1 == iso2
    False

Diff the two graphs::

    >>> in_both, in_first, in_second = graph_diff(iso1, iso2)

Present in both::

    >>> def dump_nt_sorted(g):
    ...     for l in sorted(g.serialize(format='nt').splitlines()):
    ...         if l: print(l.decode('ascii'))

    >>> dump_nt_sorted(in_both) #doctest: +SKIP
    <http://example.org>
        <http://example.org/ns#rel> <http://example.org/same> .
    <http://example.org>
        <http://example.org/ns#rel> _:cbcaabaaba17fecbc304a64f8edee4335e .
    _:cbcaabaaba17fecbc304a64f8edee4335e
        <http://example.org/ns#label> "Same" .

Only in first::

    >>> dump_nt_sorted(in_first) #doctest: +SKIP
    <http://example.org>
        <http://example.org/ns#rel> <http://example.org/a> .
    <http://example.org>
        <http://example.org/ns#rel> _:cb124e4c6da0579f810c0ffe4eff485bd9 .
    _:cb124e4c6da0579f810c0ffe4eff485bd9
        <http://example.org/ns#label> "A" .

Only in second::

    >>> dump_nt_sorted(in_second) #doctest: +SKIP
    <http://example.org>
        <http://example.org/ns#rel> <http://example.org/b> .
    <http://example.org>
        <http://example.org/ns#rel> _:cb558f30e21ddfc05ca53108348338ade8 .
    _:cb558f30e21ddfc05ca53108348338ade8
        <http://example.org/ns#label> "B" .
é    )Úabsolute_import)Údivision)Úprint_function)ÚIsomorphicGraphÚto_isomorphicÚ
isomorphicÚto_canonical_graphÚ
graph_diffÚsimilar)ÚGraphÚConjunctiveGraphÚReadOnlyGraphAggregate)ÚBNodeÚNodeÚURIRef)Úsha256)Údatetime)Údefaultdict)	ÚSetÚDictÚTYPE_CHECKINGÚUnionÚListÚTupleÚCallableÚOptionalÚIterator)ÚHASHc                 óT   — | j         dz  dz  dz  }|| j        z  }|| j        dz  z  }|S )Né   é<   g    €„.A)ÚdaysÚsecondsÚmicroseconds)ÚtdÚresults     ú0/usr/lib/python3/dist-packages/rdflib/compare.pyÚ_total_secondsr(   u   s9   € ØŒW�r‰\˜BÑ Ñ#€FØ
ˆbŒjÑ€FØ
ˆbŒo 	Ñ)Ñ)€FØ€Mó    c                   ó   — e Zd Zd„ Zd„ ZdS )Ú_runtimec                 ó   — || _         d S ©N©Úlabel©Úselfr/   s     r'   Ú__init__z_runtime.__init__}   ó   € ØˆŒ
ˆ
ˆ
r)   c                 óB   ‡ ‡— ‰ j         €‰j        dz   ‰ _         ˆˆ fd„}|S )Nr+   c                  ó¼   •— t          j        ¦   «         } ‰| i |¤Ž}d|v r;|d         �3|d         }t          t          j        ¦   «         |z
  ¦  «        |‰j        <   |S )NÚstats)r   Únowr(   r/   )ÚargsÚkwargsÚstartr&   r6   Úfr1   s        €€r'   Ú	wrapped_fz$_runtime.__call__.<locals>.wrapped_f„   sc   ø€ Ý”L‘N”NˆEØ�Q˜Ð' Ð'Ð'ˆFØ˜&Ð Ð  V¨G¤_Ð%@Ø˜wœ�Ý$2µ8´<±>´>ÀEÑ3IÑ$JÔ$J��d”jÑ!ØˆMr)   ©r/   Ú__name__©r1   r;   r<   s   `` r'   Ú__call__z_runtime.__call__€   s@   øø€ ØŒ:ÐØœ jÑ0ˆDŒJð	ð 	ð 	ð 	ð 	ð 	ð Ðr)   N©r>   Ú
__module__Ú__qualname__r2   r@   © r)   r'   r+   r+   |   ó2   € € € € € ðð ð ðð ð ð ð r)   r+   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú_call_countc                 ó   — || _         d S r-   r.   r0   s     r'   r2   z_call_count.__init__�   r3   r)   c                 óB   ‡ ‡— ‰ j         €‰j        dz   ‰ _         ˆˆ fd„}|S )Nr+   c                  óŒ   •— d|v r8|d         �0|d         }‰j         |vr
d|‰j         <   |‰j         xx         dz  cc<    ‰| i |¤ŽS )Nr6   r   é   r.   )r8   r9   r6   r;   r1   s      €€r'   r<   z'_call_count.__call__.<locals>.wrapped_f—   sl   ø€ Ø˜&Ð Ð  V¨G¤_Ð%@Ø˜wœ�Ø”: UÐ*Ð*Ø()�E˜$œ*Ñ%Ø�d”jÐ!Ð!Ô! QÑ&Ð!Ð!Ñ!Ø�1�dÐ%˜fÐ%Ð%Ð%r)   r=   r?   s   `` r'   r@   z_call_count.__call__“   s@   øø€ ØŒ:ÐØœ jÑ0ˆDŒJð	&ð 	&ð 	&ð 	&ð 	&ð 	&ð Ðr)   NrA   rD   r)   r'   rG   rG   �   rE   r)   rG   c                   óH   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zˆ fd„Zd	d„Zd	d„Z	ˆ xZ
S )
r   a%  An implementation of the RGDA1 graph digest algorithm.

    An implementation of RGDA1 (publication below),
    a combination of Sayers & Karp's graph digest algorithm using
    sum and SHA-256 <http://www.hpl.hp.com/techreports/2003/HPL-2003-235R1.pdf>
    and traces <http://pallini.di.uniroma1.it>, an average case
    polynomial time algorithm for graph canonicalization.

    McCusker, J. P. (2015). WebSig: A Digital Signature Framework for the Web.
    Rensselaer Polytechnic Institute, Troy, NY.
    http://gradworks.umi.com/3727015.pdf
    c                 óH   •—  t          t          | ¦  «        j        di |¤Ž d S )NrD   )Úsuperr   r2   )r1   r9   Ú	__class__s     €r'   r2   zIsomorphicGraph.__init__°   s,   ø€ Ø-��o˜tÑ$Ô$Ô-Ð7Ð7°Ð7Ð7Ð7Ð7Ð7r)   c                 óÈ   — t          |t          ¦  «        sdS t          | ¦  «        t          |¦  «        k    rdS |                      ¦   «         |                     ¦   «         k    S )zGraph isomorphism testing.F)Ú
isinstancer   ÚlenÚinternal_hash©r1   Úothers     r'   Ú__eq__zIsomorphicGraph.__eq__³   sX   € å˜%¥Ñ1Ô1ð 	Ø�5Ý�‰YŒY�#˜e™*œ*Ò$Ð$Ø�5Ø×!Ò!Ñ#Ô# u×':Ò':Ñ'<Ô'<Ò<Ð<r)   c                 ó.   — |                       |¦  «         S )z#Negative graph isomorphism testing.)rV   rT   s     r'   Ú__ne__zIsomorphicGraph.__ne__»   s   € à—;’;˜uÑ%Ô%Ð%Ð%r)   c                 óR   •— t          t          | ¦  «                             ¦   «         S r-   )rN   r   Ú__hash__)r1   rO   s    €r'   rZ   zIsomorphicGraph.__hash__¿   s   ø€ Ý•_ dÑ+Ô+×4Ò4Ñ6Ô6Ð6r)   Nc                 ó.   — |                       |¬¦  «        S )z*Synonym for IsomorphicGraph.internal_hash.©r6   )rS   ©r1   r6   s     r'   Úgraph_digestzIsomorphicGraph.graph_digestÂ   s   € à×!Ò!¨Ð!Ñ.Ô.Ð.r)   c                 óH   — t          | ¦  «                             |¬¦  «        S )zÕ
        This is defined instead of __hash__ to avoid a circular recursion
        scenario with the Memory store for rdflib which requires a hash lookup
        in order to return a generator of triples.
        r\   ©Ú_TripleCanonicalizerÚto_hashr]   s     r'   rS   zIsomorphicGraph.internal_hashÆ   s#   € õ $ DÑ)Ô)×1Ò1¸Ð1Ñ>Ô>Ð>r)   r-   )r>   rB   rC   Ú__doc__r2   rV   rX   rZ   r^   rS   Ú__classcell__)rO   s   @r'   r   r   ¢   s¡   ø€ € € € € ðð ð8ð 8ð 8ð 8ð 8ð=ð =ð =ð&ð &ð &ð7ð 7ð 7ð 7ð 7ð/ð /ð /ð /ð?ð ?ð ?ð ?ð ?ð ?ð ?ð ?r)   r   .c            	       óŽ   — e Zd Z	 	 ddee         dededefd„Zd„ Z	d	„ Z
ddeeed
f                  defd„Zdd defd„Zd„ Zd„ ZdS )ÚColorrD   NÚnodesÚhashfuncÚcolorÚ
hash_cachec                 óT   — |€i }|| _         || _        || _        || _        d | _        d S r-   )Ú_hash_cacheri   rg   rh   Ú_hash_color)r1   rg   rh   ri   rj   s        r'   r2   zColor.__init__×   s:   € ð ÐØˆJØ%ˆÔØˆŒ
ØˆŒ
Ø ˆŒØˆÔÐÐr)   c                 óB   — |                       ¦   «         \  }}d|›d|›d�S )NzColor z (z nodes)©Úkey)r1   rg   ri   s      r'   Ú__str__zColor.__str__æ   s(   € Ø—x’x‘z”z‰ˆˆuˆuØ(-¨¨¨u¨u¨uÐ5Ð5r)   c                 óR   — t          | j        ¦  «        |                      ¦   «         fS r-   )rR   rg   Ú
hash_color©r1   s    r'   rp   z	Color.keyê   s   € Ý�D”J‘” §¢Ñ!2Ô!2Ð3Ð3r)   .Úreturnc                 ó&  ‡— |€| j         }|| j        v r| j        |         S d„ Št          |t          ¦  «        r ‰|¦  «        S d}|D ]9}||                      d                     ˆfd„|D ¦   «         ¦  «        ¦  «        z  }Œ:d|z  }|| j        |<   |S )Nc                 ór   — t          | t          ¦  «        r|                      ¦   «         S t          | ¦  «        S r-   )rQ   r   Ún3Ústr©Úxs    r'   Ú	stringifyz#Color.hash_color.<locals>.stringifyó   s,   € Ý˜!�TÑ"Ô"ð Ø—t’t‘v”v�å˜1‘v”v�r)   r   ú c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rD   rD   )Ú.0r{   r|   s     €r'   ú
<listcomp>z$Color.hash_color.<locals>.<listcomp>ý   s!   ø€ Ð,JÐ,JÐ,J¸a¨Y¨Y°q©\¬\Ð,JÐ,JÐ,Jr)   ú%x)ri   rl   rQ   r   rh   Újoin)r1   ri   ÚvalueÚtripleÚvalr|   s        @r'   rs   zColor.hash_colorí   sÈ   ø€ Øˆ=Ø”JˆEØ�DÔ$Ð$Ð$ØÔ# EÔ*Ð*ð	ð 	ð 	õ �e�TÑ"Ô"ð 	$Ø�9˜UÑ#Ô#Ð#ØˆØð 	Mð 	MˆFØ�T—]’] 3§8¢8Ð,JÐ,JÐ,JÐ,JÀ6Ð,JÑ,JÔ,JÑ#KÔ#KÑLÔLÑLˆEˆEØ˜%‘<ˆØ"%ˆÔ˜ÑØˆ
r)   ÚWÚgraphc           	      óð  ‡— i }| j         D ]Ø}t          | j        ¦  «        }‰j         D ]P}|ˆfd„|                     |d |f¦  «        D ¦   «         z  }|ˆfd„|                     |d |f¦  «        D ¦   «         z  }ŒQt	          |¦  «        }|                      |¦  «        }||vr"t          g | j        || j        ¬¦  «        }|||<   ||         j          	                    |¦  «         ŒÙ| 
                    ¦   «         S )Nc                 óF   •— g | ]\  }}}d |‰                      ¦   «         f‘ŒS )rK   ©rs   ©r   ÚsÚpÚor†   s       €r'   r€   z%Color.distinguish.<locals>.<listcomp>  s;   ø€ ð ð ð Ù/6¨q°!°Q�Q˜˜1Ÿ<š<™>œ>Ð*ðð ð r)   c                 óF   •— g | ]\  }}}‰                      ¦   «         |d f‘ŒS )é   rŠ   r‹   s       €r'   r€   z%Color.distinguish.<locals>.<listcomp>
  s;   ø€ ð ð ð Ù/6¨q°!°Q�Q—\’\‘^”^ Q¨Ð*ðð ð r)   ©rj   )rg   Úlistri   ÚtriplesÚtuplers   rf   rh   rl   ÚappendÚvalues)	r1   r†   r‡   ÚcolorsÚnÚ	new_colorÚnodeÚnew_hash_colorÚcs	    `       r'   ÚdistinguishzColor.distinguish  s@  ø€ Ø#%ˆØ”ð 	3ð 	3ˆAÝ/3°D´JÑ/?Ô/?ˆIØœð ð �Øð ð ð ð Ø:?¿-º-ÈÈDÐRVÈÑ:XÔ:Xðñ ô ñ �	ð ð ð ð ð Ø:?¿-º-ÈÈtÐUVÈÑ:XÔ:Xðñ ô ñ �	�	õ ˜iÑ(Ô(ˆIØ!Ÿ_š_¨YÑ7Ô7ˆNà VÐ+Ð+Ý˜"˜dœm¨YÀ4ÔCSÐTÑTÔT�Ø)*��~Ñ&Ø�>Ô"Ô(×/Ò/°Ñ2Ô2Ð2Ð2Ø�}Š}‰ŒÐr)   c                 ó2   — t          | j        ¦  «        dk    S )NrK   )rR   rg   rt   s    r'   ÚdiscretezColor.discrete  s   € Ý�4”:‰Œ !Ò#Ð#r)   c                 ó`   — t          | j        d d …         | j        | j        | j        ¬¦  «        S ©Nr‘   )rf   rg   rh   ri   rl   rt   s    r'   Úcopyz
Color.copy  s3   € ÝØŒJ�q�q�qŒM˜4œ=¨$¬*ÀÔAQð
ñ 
ô 
ð 	
r)   )rD   Nr-   )r>   rB   rC   r   r   ÚHashFuncÚColorItemTupleÚ	HashCacher2   rq   rp   r   r   Ú	ColorItemry   rs   r   r�   rŸ   r¢   rD   r)   r'   rf   rf   Ö   sò   € € € € € ð
 !#Ø $ð ð  à�DŒzð ð ð ð ð	 ð
 ð ð  ð  ð  ð6ð 6ð 6ð4ð 4ð 4ðð  ¨¨y¸#¨~Ô)>Ô ?ð È3ð ð ð ð ð*˜Wð ¨Uð ð ð ð ð($ð $ð $ð
ð 
ð 
ð 
ð 
r)   rf   r   c                   ób  — e Zd Zefdedefd„Zdee         de	fd„Z
dee         fd„Zd„ Zdee         deeeef                  fd	„Zdee         d
ee         dee         fd„Z ed¦  «        ddee         fd„¦   «         Zdee         dee         fd„Z	 ddeee                  deeeee         f                  deeee         f         fd„Z ed¦  «        ddgfdee         dee         dee         dee         fd„¦   «         Zddee         fd„Zdeeeef         deeef         fd„ZdS )ra   r‡   rh   c                 óL   ‡— || _         dt          fˆfd„}i | _        || _        d S )NrŒ   c                 óÆ   •—  ‰¦   «         }|                      t          | ¦  «                             d¦  «        ¦  «         t          |                     ¦   «         d¦  «        S )NÚutf8é   )Úupdatery   ÚencodeÚintÚ	hexdigest)rŒ   Úhrh   s     €r'   Ú	_hashfuncz0_TripleCanonicalizer.__init__.<locals>._hashfunc'  sJ   ø€ Ø�‘
”
ˆAØ�HŠH•S˜‘V”V—]’] 6Ñ*Ô*Ñ+Ô+Ð+Ý�q—{’{‘}”} bÑ)Ô)Ð)r)   )r‡   ry   rl   rh   )r1   r‡   rh   r±   s     ` r'   r2   z_TripleCanonicalizer.__init__$  sD   ø€ ØˆŒ
ð	*�ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð
 ')ˆÔØ!ˆŒˆˆr)   Úcoloringru   c                 ó<   — t          d„ |D ¦   «         ¦  «        dk    S )Nc                 ó:   — g | ]}|                      ¦   «         °|‘ŒS rD   ©rŸ   ©r   rœ   s     r'   r€   z2_TripleCanonicalizer._discrete.<locals>.<listcomp>0  s%   € Ð<Ð<Ð<˜!¨q¯zªz©|¬|Ð<�AÐ<Ð<Ð<r)   r   )rR   )r1   r²   s     r'   Ú	_discretez_TripleCanonicalizer._discrete/  s$   € ÝÐ<Ð<˜xÐ<Ñ<Ô<Ñ=Ô=ÀÒBÐBr)   c                 ó>  ‡ — t          ¦   «         }t          ¦   «         }t          t           ¦  «        ‰ _        ‰ j        D �]\  }}}t          |||g¦  «        }t          d„ |D ¦   «         ¦  «        }t	          |¦  «        dk    rÌ|||z
  z  }||z  }t          |t          ¦  «        r ‰ j        |                              |¦  «         t          |t          ¦  «        r ‰ j        |                              |¦  «         t          |t          ¦  «        r@‰ j        |                              |¦  «         ‰ j        |                              |¦  «         �Œt	          |¦  «        dk    r9t          t          |¦  «        ‰ j
        ‰ j        ¬¦  «        gˆ fd„|D ¦   «         z   S g S )a\  Finds an initial color for the graph.

        Finds an initial color of the graph by finding all blank nodes and
        non-blank nodes that are adjacent. Nodes that are not adjacent to blank
        nodes are not included, as they are a) already colored (by URI or literal)
        and b) do not factor into the color of any blank node.
        c                 ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS rD   ©rQ   r   ©r   r{   s     r'   r€   z7_TripleCanonicalizer._initial_color.<locals>.<listcomp>?  s'   € Ð>Ð>Ð>˜1­°AµuÑ)=Ô)=Ð>�QÐ>Ð>Ð>r)   r   r‘   c                 óL   •— g | ] }t          |g‰j        |‰j        ¬ ¦  «        ‘Œ!S )r‘   )rf   rh   rl   ©r   r{   r1   s     €r'   r€   z7_TripleCanonicalizer._initial_color.<locals>.<listcomp>K  sG   ø€ ð Xð Xð Xàõ �q�c˜4œ=¨!¸Ô8HÐIÑIÔIðXð Xð Xr)   )Úsetr   Ú
_neighborsr‡   rR   rQ   r   Úaddrf   r’   rh   rl   )r1   ÚbnodesÚothersrŒ   r�   rŽ   rg   Úbs   `       r'   Ú_initial_colorz#_TripleCanonicalizer._initial_color2  s   ø€ õ !™UœUˆÝ‘”ˆÝ%¥cÑ*Ô*ˆŒØ”zð 	.ñ 	.‰GˆAˆq�!Ý˜˜A˜q˜	‘N”NˆEÝÐ>Ð> Ð>Ñ>Ô>Ñ?Ô?ˆAÝ�1‰vŒv˜ŠzˆzØ˜% !™)Ñ#�Ø˜!‘�Ý˜a¥Ñ'Ô'ð .Ø”O AÔ&×*Ò*¨1Ñ-Ô-Ð-Ý˜a¥Ñ'Ô'ð .Ø”O AÔ&×*Ò*¨1Ñ-Ô-Ð-Ý˜a¥Ñ'Ô'ð .Ø”O AÔ&×*Ò*¨1Ñ-Ô-Ð-Ø”O AÔ&×*Ò*¨1Ñ-Ô-Ð-ùÝˆv‰;Œ;˜Š?ˆ?Ý�$˜v™,œ,¨¬À$ÔBRÐSÑSÔSÐTð Xð Xð Xð XàðXñ Xô Xñ ð ð
 ˆIr)   c                 ó  — t          |j        ¦  «        }|                     t          |j        ¦  «        f¦  «         |j                             |¦  «         t          |g| j        t          |¦  «        | j	        ¬¦  «        }|S r¡   )
r’   ri   r•   rR   rg   Úremoverf   rh   r”   rl   )r1   ri   Ú
individualr™   rœ   s        r'   Ú_individuatez!_TripleCanonicalizer._individuateR  s{   € Ý˜œÑ%Ô%ˆ	Ø×Ò�#˜eœkÑ*Ô*Ð,Ñ-Ô-Ð-àŒ×Ò˜:Ñ&Ô&Ð&ÝØˆL˜$œ-­¨yÑ)9Ô)9ÀdÔFVð
ñ 
ô 
ˆð ˆr)   c              #   óH   K  — d„ |D ¦   «         D ]}|j         D ]}||fV — Œ	Œd S )Nc                 ó:   — g | ]}|                      ¦   «         °|‘ŒS rD   rµ   r¶   s     r'   r€   z8_TripleCanonicalizer._get_candidates.<locals>.<listcomp>]  s%   € Ð:Ð:Ð:˜¨Q¯ZªZ©\¬\Ð:�!Ð:Ð:Ð:r)   ©rg   )r1   r²   rœ   rš   s       r'   Ú_get_candidatesz$_TripleCanonicalizer._get_candidates\  sR   è è € Ø:Ð:˜XÐ:Ñ:Ô:ð 	ð 	ˆAØœð ð �Ø˜A�g����ðð	ð 	r)   Úsequencec                 ó¼  — t          |d„ d¬¦  «        }|d d …         }t          |¦  «        dk    �r=|                      |¦  «        �s'|                     ¦   «         }|d d …         D ]ß}t          |j        ¦  «        dk    s t          |j        d         t          ¦  «        r¥t          |                     || j        ¦  «        d„ d¬¦  «        }| 	                    |¦  «         | 
                    |¦  «         	 |                     |¦  «        }|d |…         |z   ||dz   d …         z   }ŒÂ# t          $ r |dd …         |z   }Y ŒÛw xY wŒàt          |¦  «        dk    r|                      |¦  «        �¯'g }t          ¦   «         }|D ]Z}	|	                     ¦   «         }
|
|v r&||
         j         
                    |	j        ¦  «         Œ@|                     |	¦  «         |	||
<   Œ[|S )Nc                 ó*   — |                       ¦   «         S r-   ro   rz   s    r'   ú<lambda>z._TripleCanonicalizer._refine.<locals>.<lambda>b  s   € °!·%²%±'´'€ r)   T)rp   Úreverser   rK   c                 ó*   — |                       ¦   «         S r-   ro   rz   s    r'   rÐ   z._TripleCanonicalizer._refine.<locals>.<lambda>j  s   €  a§e¢e¡g¤g€ r)   )ÚsortedrR   r·   Úpoprg   rQ   r   r�   r‡   rÆ   ÚextendÚindexÚ
ValueErrorÚdictrs   r•   )r1   r²   rÍ   r†   rœ   r—   ÚsiÚcombined_colorsÚcombined_color_mapri   Ú
color_hashs              r'   Ú_refinez_TripleCanonicalizer._refinea  s  € Ý˜(Ð(9Ð(9À4ÐHÑHÔHˆØ˜A˜A˜A”;ˆÝ�(‰mŒm˜aÒÑ¨¯ª°xÑ(@Ô(@ÑØ—’‘”ˆAØ˜a˜a˜a”[ð 9ð 9�Ý�q”w‘<”< !Ò#Ð#¥z°!´'¸!´*½eÑ'DÔ'DÐ#Ý#ØŸš a¨¬Ñ4Ô4Ø-Ð-Ø $ðñ ô �Fð
 —O’O AÑ&Ô&Ð&Ø—O’O FÑ+Ô+Ð+ð9Ø%Ÿ^š^¨AÑ.Ô.˜Ø#+¨C¨R¨C¤=°6Ñ#9¸HÀRÈ!ÁVÀXÀXÔ<NÑ#N˜˜øÝ%ð 9ð 9ð 9Ø#)¨!¨"¨"¤:°Ñ#8˜˜˜ð9øøøð $õ �(‰mŒm˜aÒÐ¨¯ª°xÑ(@Ô(@Ñð  (*ˆÝ/3©v¬vÐØð 	7ð 	7ˆEØ×)Ò)Ñ+Ô+ˆJàÐ/Ð/Ð/Ø" :Ô.Ô4×;Ò;¸E¼KÑHÔHÐHÐHà×&Ò& uÑ-Ô-Ð-Ø16Ð" :Ñ.Ð.ØÐs   Ã70D(Ä(EÅEÚto_hash_runtimeNr6   c                 óº   — d}|                       |¬¦  «        D ]7}||                      d                     d„ |D ¦   «         ¦  «        ¦  «        z  }Œ8|�d|z  |d<   |S )Nr   r\   r}   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rD   )rx   r»   s     r'   r€   z0_TripleCanonicalizer.to_hash.<locals>.<listcomp>„  s    € Ð-EÐ-EÐ-E¸¨a¯dªd©f¬fÐ-EÐ-EÐ-Er)   r�   r^   )Úcanonical_triplesrh   r‚   )r1   r6   r&   r„   s       r'   rb   z_TripleCanonicalizer.to_hash€  su   € àˆØ×,Ò,°5Ð,Ñ9Ô9ð 	Hð 	HˆFØ�d—m’m C§H¢HÐ-EÐ-E¸fÐ-EÑ-EÔ-EÑ$FÔ$FÑGÔGÑGˆFˆFØÐØ$(¨6¡MˆE�.Ñ!Øˆr)   c                 ó4  — d„ |D ¦   «         }|                       |¦  «        svd„ |D ¦   «         d         }|j        d         }|                      ||¦  «        }|                     |¦  «         |                      ||g¦  «        }|                       |¦  «        ¯v|S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rD   )r¢   r¶   s     r'   r€   z;_TripleCanonicalizer._experimental_path.<locals>.<listcomp>Š  s    € Ð/Ð/Ð/ �A—F’F‘H”HÐ/Ð/Ð/r)   c                 ó:   — g | ]}|                      ¦   «         °|‘ŒS rD   rµ   r»   s     r'   r€   z;_TripleCanonicalizer._experimental_path.<locals>.<listcomp>Œ  s%   € Ð=Ð=Ð=˜1°·
²
±´Ð=�QÐ=Ð=Ð=r)   r   )r·   rg   rÈ   r•   rÝ   )r1   r²   ri   rš   r™   s        r'   Ú_experimental_pathz'_TripleCanonicalizer._experimental_path‰  s¥   € Ø/Ð/ hÐ/Ñ/Ô/ˆØ—.’. Ñ*Ô*ð 	;Ø=Ð= Ð=Ñ=Ô=¸aÔ@ˆEØ”;˜q”>ˆDØ×)Ò)¨%°Ñ6Ô6ˆIØ�OŠO˜IÑ&Ô&Ð&Ø—|’| H¨y¨kÑ:Ô:ˆHð —.’. Ñ*Ô*ð 	;ð ˆr)   Ú	coloringsÚ	groupingsc                 ó°   — |st          t          ¦  «        }t          |Ž D ]5}t          d„ |D ¦   «         ¦  «        }|D ]}|||         z  }Œ|D ]}|||<   ŒŒ6|S )Nc                 ó(   — g | ]}|j         d          ‘ŒS ©r   rË   r¶   s     r'   r€   z:_TripleCanonicalizer._create_generator.<locals>.<listcomp>›  s   € Ð/Ð/Ð/ A�Q”W˜Q”ZÐ/Ð/Ð/r)   )r   r¾   Úzip)r1   ræ   rç   ÚgroupÚgr˜   s         r'   Ú_create_generatorz&_TripleCanonicalizer._create_generator“  sŒ   € ð
 ð 	)Ý#¥CÑ(Ô(ˆIÝ˜)�_ð 	!ð 	!ˆEÝÐ/Ð/¨Ð/Ñ/Ô/Ñ0Ô0ˆAØð "ð "�Ø�Y˜q”\Ñ!��Øð !ð !�Ø �	˜!‘�ð!àÐr)   Úindividuationsr   Údepthc                 óä  ‡ — |�	d|vrd|d<   |dxx         dz  cc<   ‰                       |¦  «        }g }d }d }d }t          t          ¦  «        }	t          ¦   «         }
|D �]Œ\  }}||	v r4|	|         |
z  }t          |¦  «        dk    r|
                     |¦  «         Œ>|
                     |¦  «         g }d }|D ]3}|                     ¦   «         }|                     |¦  «         ||k    r|}Œ4‰                      ||¦  «        }|                     |¦  «         ‰                      ||g¦  «        }t          d„ |D ¦   «         ¦  «        }‰  
                    |¦  «        }t          d„ |D ¦   «         ¦  «        }|r‰                      ||g|	¦  «        }	|}|�||k     r	|g}|}|}�ŒC||k    r|�|dxx         dz  cc<   �Œ]||k    r|                     |¦  «         �Œz|�|dxx         dz  cc<   �ŒŽˆ fd„|D ¦   «         }t          |¦  «        dk    r]d }d }|D ]Q}|d         g}‰                      |||¬¦  «        }t          d„ |D ¦   «         ¦  «        }|�||k    r|g}|}|d         }ŒR||d<   |d         S )	NÚpruningsr   rK   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rD   ro   r¶   s     r'   r€   z0_TripleCanonicalizer._traces.<locals>.<listcomp>Ä  s    € Ð CÐ CÐ C¨Q §¢¡¤Ð CÐ CÐ Cr)   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rD   ro   r¶   s     r'   r€   z0_TripleCanonicalizer._traces.<locals>.<listcomp>Æ  s    € Ð%DÐ%DÐ%D°! a§e¢e¡g¤gÐ%DÐ%DÐ%Dr)   c                 ó>   •— g | ]}‰                      |¦  «        ¯|‘ŒS rD   )r·   r½   s     €r'   r€   z0_TripleCanonicalizer._traces.<locals>.<listcomp>Ú  s*   ø€ Ð&LÐ&LÐ&L¨Q¸$¿.º.ÈÑ:KÔ:KÐ&L qÐ&LÐ&LÐ&Lr)   ©r6   rð   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rD   ro   r¶   s     r'   r€   z0_TripleCanonicalizer._traces.<locals>.<listcomp>á  s    € Ð$GÐ$GÐ$G° Q§U¢U¡W¤WÐ$GÐ$GÐ$Gr)   )rÌ   r   r¾   rR   rÀ   r¢   r•   rÈ   rÝ   r”   rå   rî   Ú_traces)r1   r²   r6   rð   Ú
candidatesÚbestÚ
best_scoreÚbest_experimental_scoreÚlast_coloringÚ	generatorÚvisitedÚ	candidateri   ÚvÚcoloring_copyÚ
color_copyrœ   Úc_copyr™   Úrefined_coloringÚcolor_scoreÚexperimentalÚexperimental_scorerŸ   Ú
best_depthÚds   `                         r'   rø   z_TripleCanonicalizer._traces¢  s/  ø€ ð Ð °5Ð!8Ð!8Ø !ˆE�*ÑØˆaˆˆŒ�A‰ˆˆ‰Ø×)Ò)¨(Ñ3Ô3ˆ
Ø"$ˆØˆ
Ø"&ÐØˆÝ+6µsÑ+;Ô+;ˆ	Ý ™UœUˆØ *ð &	+ñ &	+ÑˆI�uØ˜IÐ%Ð%Ø˜iÔ(¨7Ñ2�Ý�q‘6”6˜A’:�:Ø—K’K 	Ñ*Ô*Ð*ØØ�KŠK˜	Ñ"Ô"Ð"Ø)+ˆMØˆJØð (ð (�ØŸš™œ�Ø×$Ò$ VÑ,Ô,Ð,Ø˜’:�:Ø!'�JøØ×)Ò)¨*°iÑ@Ô@ˆIØ× Ò  Ñ+Ô+Ð+Ø#Ÿ|š|¨M¸I¸;ÑGÔGÐÝÐ CÐ CÐ2BÐ CÑ CÔ CÑDÔDˆKØ×2Ò2°=ÑAÔAˆLÝ!$Ð%DÐ%D°|Ð%DÑ%DÔ%DÑ!EÔ!EÐØð Ø ×2Ò2Ø" LÐ1°9ñô �	ð )ˆMØÐ! Z°+Ò%=Ð%=Ø(Ð)�Ø(�
Ø*<Ð'Ñ'Ø˜kÒ)Ð)àÐ$Ø˜*Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%ùØ#Ð'>Ò>Ð>Ø—’Ð,Ñ-Ô-Ð-Ñ-ð Ð$Ø˜*Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%ùØ&LÐ&LÐ&LÐ&L°$Ð&LÑ&LÔ&LˆÝˆx‰=Œ=˜AÒÐØˆJØˆJØ ð &ð &�Ø˜1”X�J�Ø ŸLšL¨¸Àa˜LÑHÔH�	Ý#Ð$GÐ$GÐ6FÐ$GÑ$GÔ$GÑHÔH�ØÐ%¨°zÒ)AÐ)AØ )˜{�HØ!,�JØ!" 1¤�JøØ!ˆE�!‰HØ˜Œ{Ðr)   c              #   ó$  K  — |�t          j        ¦   «         }|                      ¦   «         }|�:t          | j        ¦  «        |d<   t          dt          |¦  «        dz
  ¦  «        |d<   |                      ||d d …         ¦  «        }|�8t          t          j        ¦   «         |z
  ¦  «        |d<   t          |¦  «        |d<   |                      |¦  «        s)dg}|  	                    |||¬¦  «        }|�|d         |d<   n|�
d|d	<   d|d<   |�t          |¦  «        |d
<   t          d„ |D ¦   «         ¦  «        }|�&t          t          j        ¦   «         |z
  ¦  «        |d<   | j        D ])}t          |                      ||¦  «        ¦  «        }|V — Œ*d S )NÚtriple_countr   rK   Úadjacent_nodesÚinitial_coloring_runtimeÚinitial_color_countrö   Ú
tree_depthrï   Úcolor_countc                 óP   — g | ]#}|j         d          |                     ¦   «         f‘Œ$S rê   )rg   rs   r¶   s     r'   r€   z:_TripleCanonicalizer.canonical_triples.<locals>.<listcomp>  s+   € ÐLÐLÐL¸a˜aœg aœj¨!¯,ª,©.¬.Ð9ÐLÐLÐLr)   Úcanonicalize_triples_runtime)r   r7   rÄ   rR   r‡   ÚmaxrÝ   r(   r·   rø   rØ   r”   Ú_canonicalize_bnodes)r1   r6   Ústart_coloringr²   rð   Úbnode_labelsr„   r&   s           r'   rá   z&_TripleCanonicalizer.canonical_triplesé  s¹  è è € ØÐÝ%œ\™^œ^ˆNØ×&Ò&Ñ(Ô(ˆØÐÝ$'¨¬
¡O¤OˆE�.Ñ!Ý&)¨!­S°©]¬]¸QÑ->Ñ&?Ô&?ˆEÐ"Ñ#Ø—<’< ¨(°1°1°1¬+Ñ6Ô6ˆØÐÝ0>Ý”‘” Ñ/ñ1ô 1ˆEÐ,Ñ-õ ,/¨x©=¬=ˆEÐ'Ñ(à�~Š~˜hÑ'Ô'ð 	$Ø�CˆEØ—|’| H°EÀ�|ÑGÔGˆHØÐ Ø&+¨A¤h��lÑ#øØÐØ&'ˆEÐ"Ñ#Ø"#ˆE�,ÑØÐÝ#& x¡=¤=ˆE�-Ñ åÐLÐLÀ8ÐLÑLÔLÑMÔMˆØÐÝ4BÝ”‘” Ñ/ñ5ô 5ˆEÐ0Ñ1ð ”jð 	ð 	ˆFÝ˜4×4Ò4°V¸\ÑJÔJÑKÔKˆFØˆLˆLˆLˆLð	ð 	r)   r„   Úlabelsc              #   ó~   K  — |D ]7}t          |t          ¦  «        rt          d||         z  ¬¦  «        V — Œ3|V — Œ8d S )Nzcb%s)rƒ   rº   )r1   r„   r  Úterms       r'   r  z)_TripleCanonicalizer._canonicalize_bnodes  sa   è è € ð ð 	ð 	ˆDÝ˜$¥Ñ&Ô&ð Ý &¨6°$¬<Ñ"7Ð8Ñ8Ô8Ð8Ð8Ð8Ð8à�
�
�
�
ð		ð 	r)   r-   ) r>   rB   rC   r   r   Ú_HashTr2   r   rf   Úboolr·   rÄ   rÈ   r   r   r   rÌ   rÝ   r+   r   ÚStatsrb   rå   r   r   rî   rG   r®   rø   rá   ry   r  rD   r)   r'   ra   ra   #  s¢  € € € € € Ø8>ð 	"ð 	"˜eð 	"¨vð 	"ð 	"ð 	"ð 	"ðC $ u¤+ð C°$ð Cð Cð Cð Cð  U¤ð ð ð ð ð@ð ð ð¨¨U¬ð ¸ÀÀtÈUÀ{ÔASÔ8Tð ð ð ð ð
  U¤ð °t¸E´{ð ÀtÈEÄ{ð ð ð ð ð> €XÐÑ Ô ðð ˜X eœ_ð ð ð ñ !Ô ðð¨4°¬;ð ¸4À¼;ð ð ð ð ð 6:ðð à˜˜UœÔ$ðð ˜D  s¨4¤y Ô1Ô2ðð 
ˆd�C˜”IˆoÔ	ð	ð ð ð ð €[Ð!Ñ"Ô"ð "&Ø˜3ð	Dð Dà�u”+ðDð ˜ŒðDð �CŒyð	Dð
 
ˆeŒðDð Dð Dñ #Ô"ðDðL ð   x°¤ð  ð  ð  ð  ðDØ˜D $¨Ð,Ô-ðØ7;¸DÀ#¸I´ðð ð ð ð ð r)   ra   c                 ó¤   — t          | t          ¦  «        r| S t          ¦   «         }t          | d¦  «        rt          | j        ¬¦  «        }|| z  }|S )NÚ
identifier)r  )rQ   r   Úhasattrr  )r‡   r&   s     r'   r   r     sW   € Ý�%�Ñ)Ô)ð ØˆÝÑÔ€FÝˆu�lÑ#Ô#ð >Ý ¨EÔ,<Ð=Ñ=Ô=ˆØ
ˆe�O€FØ€Mr)   c                 ó’   — t          | ¦  «                             ¦   «         }t          |¦  «                             ¦   «         }||k    S )a›  Compare graph for equality.

    Uses an algorithm to compute unique hashes which takes bnodes into account.

    Examples::

        >>> g1 = Graph().parse(format='n3', data='''
        ...     @prefix : <http://example.org/ns#> .
        ...     <http://example.org> :rel <http://example.org/a> .
        ...     <http://example.org> :rel <http://example.org/b> .
        ...     <http://example.org> :rel [ :label "A bnode." ] .
        ... ''')
        >>> g2 = Graph().parse(format='n3', data='''
        ...     @prefix ns: <http://example.org/ns#> .
        ...     <http://example.org> ns:rel [ ns:label "A bnode." ] .
        ...     <http://example.org> ns:rel <http://example.org/b>,
        ...             <http://example.org/a> .
        ... ''')
        >>> isomorphic(g1, g2)
        True

        >>> g3 = Graph().parse(format='n3', data='''
        ...     @prefix : <http://example.org/ns#> .
        ...     <http://example.org> :rel <http://example.org/a> .
        ...     <http://example.org> :rel <http://example.org/b> .
        ...     <http://example.org> :rel <http://example.org/c> .
        ... ''')
        >>> isomorphic(g1, g3)
        False
    r`   )Úgraph1Úgraph2Úgd1Úgd2s       r'   r   r     s@   € õ> ˜vÑ
&Ô
&×
.Ò
.Ñ
0Ô
0€CÝ
˜vÑ
&Ô
&×
.Ò
.Ñ
0Ô
0€CØ�#Š:Ðr)   Nc                 óŠ   — t          ¦   «         }|t          | ¦  «                             |¬¦  «        z  }t          |g¦  «        S )zÁCreates a canonical, read-only graph.

    Creates a canonical, read-only graph where all bnode id:s are based on
    deterministical SHA-256 checksums, correlated with the graph contents.
    r\   )r   ra   rá   r   )Úg1r6   r‡   s      r'   r	   r	   C  sA   € õ ‰GŒG€EØ	Õ! "Ñ%Ô%×7Ò7¸eÐ7ÑDÔDÑD€EÝ! 5 'Ñ*Ô*Ð*r)   c                 óf   — t          | ¦  «        }t          |¦  «        }||z  }||z
  }||z
  }|||fS )zEReturns three sets of triples: "in both", "in first" and "in second".)r	   )r'  Úg2Úcg1Úcg2Úin_bothÚin_firstÚ	in_seconds          r'   r
   r
   N  sF   € õ ˜RÑ
 Ô
 €CÝ
˜RÑ
 Ô
 €CØ�C‰i€GØ�S‰y€HØ�c‘	€IØ�X˜yÐ)Ð)r)   c                 óP   — t          d„ t          | |¦  «        D ¦   «         ¦  «        S )a@  Checks if the two graphs are "similar".

    Checks if the two graphs are "similar", by comparing sorted triples where
    all bnodes have been replaced by a singular mock bnode (the
    ``_MOCK_BNODE``).

    This is a much cheaper, but less reliable, alternative to the comparison
    algorithm in ``isomorphic``.
    c              3   ó(   K  — | ]\  }}||k    V — Œd S r-   rD   )r   Út1Út2s      r'   ú	<genexpr>zsimilar.<locals>.<genexpr>f  s*   è è € ÐIÐI™H˜R ˆr�RŠxÐIÐIÐIÐIÐIÐIr)   )ÚallÚ_squashed_graphs_triples)r'  r)  s     r'   r   r   \  s,   € õ ÐIÐIÕ(@ÀÀRÑ(HÔ(HÐIÑIÔIÑIÔIÐIr)   c              #   óª   K  — t          t          t          | ¦  «        ¦  «        t          t          |¦  «        ¦  «        ¦  «        D ]\  }}||fV — Œd S r-   )rë   rÓ   Ú_squash_graph)r'  r)  r1  r2  s       r'   r5  r5  i  s\   è è € Ý��}¨RÑ0Ô0Ñ1Ô1µ6½-ÈÑ:KÔ:KÑ3LÔ3LÑMÔMð ð ‰ˆˆRØ�"ˆfˆˆˆˆðð r)   c                 ó   — d„ | D ¦   «         S )Nc              3   ó4   K  — | ]}t          |¦  «        V — Œd S r-   )Ú_squash_bnodes)r   r„   s     r'   r3  z _squash_graph.<locals>.<genexpr>o  s*   è è € Ð7Ð7 v�N˜6Ñ"Ô"Ð7Ð7Ð7Ð7Ð7Ð7r)   rD   )r‡   s    r'   r7  r7  n  s   € Ø7Ð7°Ð7Ñ7Ô7Ð7r)   c                 ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3   óR   K  — | ]"}t          |t          ¦  «        rt          p|V — Œ#d S r-   )rQ   r   Ú_MOCK_BNODE)r   Úts     r'   r3  z!_squash_bnodes.<locals>.<genexpr>s  s6   è è € ÐMÐMÀ•*˜Q¥Ñ&Ô&Ð6­;Ð<¸1ÐMÐMÐMÐMÐMÐMr)   )r”   )r„   s    r'   r:  r:  r  s   € ÝÐMÐMÀfÐMÑMÔMÑMÔMÐMr)   r-   )8rc   Ú
__future__r   r   r   Ú__all__Úrdflib.graphr   r   r   Úrdflib.termr   r   r   Úhashlibr   r   Úcollectionsr   Útypingr   r   r   r   r   r   r   r   r   Ú_hashlibr   r(   Úobjectr+   rG   r   ry   r®   r£   r¦   r¤   r¥   r  rf   Ú_TripleTr  ra   r   r   r	   r
   r=  r   r5  r7  r:  rD   r)   r'   ú<module>rI     so  ððIð IðT 'Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %ðð ð €ð IÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð ð ØÐÐÐÐÐðð ð ðð ð ð ð ˆvñ ô ð ð&ð ð ð ð �&ñ ô ð ð&*?ð *?ð *?ð *?ð *?Ð&ñ *?ô *?ð *?ðZ �S�E˜3�JÔ€Ø�%˜˜S˜”/ 6¨5°°c°¬?Ð:Ô;€	Ø�y #�~Ô&€Ø�T˜.¨#Ð-Ô.Ô/€	ØˆS�%˜˜S˜”/Ð!Ô"€ðF
ð F
ð F
ð F
ð F
ñ F
ô F
ð F
ðR �Œ:€Ø	�"�f�*Ô	€ðoð oð oð oð o˜6ñ oô oð oðdð ð ð!ð !ð !ðH+ð +ð +ð +ð*ð *ð *ð ˆe‰gŒg€ð
Jð 
Jð 
Jðð ð ð
8ð 8ð 8ðNð Nð Nð Nð Nr)   