Ë
    iKêjÄ  ã            
       óÎ  — U d dl 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
mZmZmZ d dlmZmZmZ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 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* e
rd dl+m,Z, e-eeddf   e.e   e/e   f   Z0ee1d<    G d„ de«      Z2 e3«       Z4e3e5   e1d<    edd¬«       G d„ d«      «       Z6dededede7de8f
d„Z9 edd¬«       G d„ d«      «       Z: edd¬«       G d„ d«      «       Z;d Z<ee5   e1d!<   d"e5d#e5d$e5de5fd%„Z=dedede5fd&„Z>d'e?d(e?dee?ddf   fd)„Z@dededeeddf   fd*„ZA edd¬«       G d+„ d,«      «       ZB G d-„ d.«      ZC G d/„ d0e"«      ZDy)1é    N)Ú	GeneratorÚSet)Ú	dataclassÚfield)ÚRandom)ÚTYPE_CHECKINGÚFinalÚ	TypeAliasÚcast)ÚFlakyReplayÚFlakyStrategyDefinitionÚHypothesisExceptionÚStopTest)Úfloats)	ÚBooleanConstraintsÚBytesConstraintsÚChoiceConstraintsTÚChoiceTÚChoiceTypeTÚFloatConstraintsÚIntegerConstraintsÚStringConstraintsÚchoice_from_index)ÚConjectureDataÚDataObserverÚStatus)ÚInterestingOrigin)Úcount_between_floatsÚfloat_to_intÚint_to_floatÚsign_aware_lte)ÚRepresentationPrinterÚChildrenCacheValueTc                   ó   — e Zd Zy)ÚPreviouslyUnseenBehaviourN)Ú__name__Ú
__module__Ú__qualname__© ó    úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/hypothesis/internal/conjecture/datatree.pyr%   r%   4   s   „ Ør*   r%   ÚEMPTYT)ÚslotsÚfrozenc                   ó0   — e Zd ZU dZded<   dddeddfd	„Zy)
ÚKilledzæRepresents a transition to part of the tree which has been marked as
    "killed", meaning we want to treat it as not worth exploring, so it will
    be treated as if it were completely explored for the purposes of
    exhaustion.ÚTreeNodeÚ	next_nodeÚpr"   ÚcycleÚreturnNc                 ó2   — |du sJ ‚|j                  d«       y )NFr0   )Útext©Úselfr3   r4   s      r+   Ú_repr_pretty_zKilled._repr_pretty_D   s   € Ø˜‰~Ðˆ~Ø	�‰ˆxÕr*   )r&   r'   r(   Ú__doc__Ú__annotations__Úboolr:   r)   r*   r+   r0   r0   ;   s*   … ñð
 ÓðÐ6ð ¸tð Èô r*   r0   Úchoice_typeÚvalueÚconstraintsÚforcedr5   c                ó&   — |rdnd}| › d|›|› d|› �S )Nz	 [forced]Ú ú r)   )r>   r?   r@   rA   Úforced_markers        r+   Ú_node_prettyrF   I   s(   € ñ $*‘K¨r€MØˆ]˜!˜E˜9 ] O°1°[°MÐBÐBr*   Fc                   óv   — e Zd ZU dZeed<   eed<    ed¬«      Ze	e
df   ed<   edefd	„«       Zd
ddeddfd„Zy)ÚBranchzSRepresents a transition where multiple choices can be made as to what
    to drawn.r@   r>   F)Úreprr1   Úchildrenr5   c                 óT   — t        | j                  | j                  «      }|dkD  sJ ‚|S )Nr   )Úcompute_max_childrenr>   r@   )r9   Úmax_childrens     r+   rM   zBranch.max_children]   s.   € ä+¨D×,<Ñ,<¸d×>NÑ>NÓOˆØ˜aÒÐÐØÐr*   r3   r"   r4   Nc           	      óˆ  — |du sJ ‚t        | j                  j                  «       «      D ]Š  \  }\  }}|dkD  r|j                  «        |j	                  t        | j                  || j                  d¬«      «       |j                  d«      5  |j                  «        |j                  |«       d d d «       ŒŒ y # 1 sw Y   Œ—xY w)NFr   ©rA   é   )
Ú	enumeraterJ   ÚitemsÚbreak_r7   rF   r>   r@   ÚindentÚpretty)r9   r3   r4   Úir?   Úchilds         r+   r:   zBranch._repr_pretty_c   s©   € Ø˜‰~Ðˆ~Ü!*¨4¯=©=×+>Ñ+>Ó+@Ó!Aò 	 ÑˆA‰~��uØ�1ŠuØ—‘”
Ø�F‰FÜ˜T×-Ñ-¨u°d×6FÑ6FÈuÔUôð —‘˜!“ñ  Ø—‘”
Ø—‘˜”÷ ð  ñ	 ÷ ð  ús   Â"B8Â8C	)r&   r'   r(   r;   r   r<   r   r   rJ   Údictr   ÚpropertyÚintrM   r=   r:   r)   r*   r+   rH   rH   T   sb   … ñð $Ó#ØÓÙ*/°UÔ*;€Hˆd�7˜JÐ&Ñ'Ó;àð˜cò ó ðð

 Ð6ð 
 ¸tð 
 Èô 
 r*   rH   c                   ó@   — e Zd ZU dZeed<   edz  ed<   dddeddfd	„Zy)
Ú
Conclusionz,Represents a transition to a finished state.ÚstatusNÚinteresting_originr3   r"   r4   r5   c                 óØ   — |du sJ ‚| j                   }|€dn2d|j                  j                  › d|j                  › d|j                  › �}|j                  d| j                  ›|› d�«       y )NFrC   z, z at ú:zConclusion (ú))r^   Úexc_typer&   ÚfilenameÚlinenor7   r]   )r9   r3   r4   ÚoÚorigins        r+   r:   zConclusion._repr_pretty_w   sn   € Ø˜‰~Ðˆ~Ø×#Ñ#ˆð �)‰B 2 a§j¡j×&9Ñ&9Ð%:¸$¸q¿z¹z¸lÈ!ÈAÏHÉHÈ:Ð!Vð 	ð 	
�‰�˜dŸk™k˜_¨V¨H°AÐ6Õ7r*   )	r&   r'   r(   r;   r   r<   r   r=   r:   r)   r*   r+   r\   r\   p   s0   … á6àƒNØ)¨DÑ0Ó0ð8Ð6ð 8¸tð 8Èô 8r*   r\   i€–˜ Ú!MAX_CHILDREN_EFFECTIVELY_INFINITEÚalphabet_sizeÚmin_sizeÚmax_sizec                 óâ   ‡ — ‰ dk(  ry‰ dk(  r||z
  dz   S |t        j                  ‰ «      z  }|t        j                  t        «      kD  rt        S ˆ fd„} ||«       ||dz
  «      z
   |d«      z  S )Nr   é   c                 ó   •— ‰| dz   z  dz
  S ©Nrl   r)   )Únrh   s    €r+   ÚSz"_count_distinct_strings.<locals>.S¼   s   ø€ Ø  Q¡Ñ'¨!Ñ+Ð+r*   )ÚmathÚlogrg   )rh   ri   rj   Úlog_max_sized_childrenrp   s   `    r+   Ú_count_distinct_stringsrt   š   s}   ø€ ð ˜ÒàØ	˜!Ò	à˜(Ñ" QÑ&Ð&ð "*¬D¯H©H°]Ó,CÑ!CÐØ!¤D§H¡HÔ-NÓ$OÒOÜ4Ð4ô,ñ ˆh‹K™!˜H q™L›/Ñ)©a°«dÑ2Ð2r*   c                 óB  — | dk(  rBt        t        |«      }|d   }|d   }|€
|€ddz  dz
  S |�
|�||z
  dz   S |d u |d u k7  sJ ‚ddz  S | dk(  r!t        t        |«      }|d	   }|d
k  s|dk\  ryy| dk(  r$t        t        |«      }t	        d|d   |d   ¬«      S | dk(  r6t        t
        |«      }|d   }|d   }|d   }t	        t        |«      ||¬«      S | dk(  r¼t        t        |«      }|d   }|d   }	|d   }
t        ||	«      }t        |t        j                  |
«       «      }t        |	t        j                  |
«      «      }||kD  r|S |t        ||«      z  }t        |d«      rt        d|	«      r|dz  }t        |d«      rt        d|	«      r|dz  }|S t        d| › �«      ‚)NÚintegerÚ	min_valueÚ	max_valuerP   é€   rl   é   Úbooleanr3   g      ð;g      ð?Úbytesé   ri   rj   )rh   ri   rj   ÚstringÚ	intervalsÚfloatÚsmallest_nonzero_magnitudeç       €ç        zunhandled choice_type )r   r   r   r   rt   r   Úlenr   r   ÚmaxÚfltÚ	next_downÚminr!   ÚNotImplementedError)r>   r@   rw   rx   r3   ri   rj   r   Úmin_value_fÚmax_value_fr�   ÚcountÚ	min_pointÚ	max_points                 r+   rL   rL   Â   s  € ð �iÒÜÔ-¨{Ó;ˆØ Ñ,ˆ	Ø Ñ,ˆ	àÐ Ð!2à�c‘6˜A‘:ÐØÐ  YÐ%:à˜yÑ(¨1Ñ,Ð,ð ˜TÐ! y°DÐ'8Ò9Ð9Ð9Ø�#‰vˆØ	˜	Ò	!ÜÔ-¨{Ó;ˆØ˜Ñˆà�
Š?˜a NÒ3ØØØ	˜Ò	ÜÔ+¨[Ó9ˆÜ&ØØ  Ñ,Ø  Ñ,ô
ð 	
ð
 
˜Ò	 ÜÔ,¨kÓ:ˆØ˜zÑ*ˆØ˜zÑ*ˆØ Ñ,ˆ	ä&Ü˜i›.°8Àhô
ð 	
ð 
˜Ò	ÜÔ+¨[Ó9ˆØ! +Ñ.ˆØ! +Ñ.ˆØ%0Ð1MÑ%NÐ"ä$ [°+Ó>ˆô ˜¤c§m¡mÐ4NÓ&OÐ%OÓPˆ	Ü˜¤S§]¡]Ð3MÓ%NÓOˆ	à�yÒ àˆLàÔ% i°Ó;Ñ;ˆÜ˜+ tÔ,´ÀÀkÔ1Rà�Q‰JˆEÜ˜+ sÔ+´¸sÀKÔ0Pà�Q‰JˆEØˆä
Ð 6°{°mÐDÓ
EÐEr*   ÚaÚbc              #   ór   K  — t        t        | «      t        |«      dz   «      D ]  }t        |«      –— Œ y ­wrn   )Úranger   r    )r�   r�   ro   s      r+   Ú_floats_betweenr“     s3   è ø€ Ü”< “?¤L°£O°aÑ$7Ó8ò ˆÜ˜1‹oÓñùs   ‚57c              #   óT  K  — | dk7  r*t        t        | |«      «      D ]  }t        || |«      –— Œ y t        t        |«      }|d   }|d   }|d   }t        |d«      rt        d|«      rd–— t        |d«      rt        d|«      rd–— t        j                  |«      rat        j                  |«      r"t        || «      }t        ||«      E d {  –—†  y t        | |«      E d {  –—†  t        ||«      E d {  –—†  y t        ||«      }t        ||«      E d {  –—†  y 7 ŒP7 Œ<7 Œ*7 Œ­w)Nr€   rw   rx   r�   r‚   rƒ   )r’   rL   r   r   r   r!   r†   Úis_negativerˆ   r“   r…   )r>   r@   Úindexrw   rx   r�   rŽ   r�   s           r+   Úall_childrenr—     s7  è ø€ ð �gÒÜÔ/°¸[ÓIÓJò 	EˆEÜ# E¨;¸ÓDÓDñ	Eô Ô+¨[Ó9ˆð   Ñ,ˆ	Ø Ñ,ˆ	Ø%0Ð1MÑ%NÐ"ô ˜) TÔ*¬~¸dÀIÔ/NØŠJÜ˜) SÔ)¬n¸SÀ)Ô.LØŠIä�?‰?˜9Ô%Ü�‰˜yÔ)ä 	Ð,FÐ+FÓG�	ô +¨9°iÓ@×@Ñ@ô +Ð,FÐ+FÈ	ÓR×RÐRÜ*Ð+EÀyÓQ×QÑQô ˜IÐ'AÓBˆIÜ& y°)Ó<×<Ñ<ð Aøð SøØQøð =úsH   ‚CD(ÃD ÃD(Ã%D"Ã&D(Ã9D$Ã: D(ÄD&ÄD(Ä"D(Ä$D(Ä&D(c                   óF  — e Zd ZU dZ ee¬«      Zee   ed<    ee¬«      Z	ee
   ed<    ee¬«      Zee   ed<    edd¬«      Zee   dz  ed	<   dZeez  ez  dz  ed
<    edd¬«      Zeed<   edee   fd„«       Zdeddfd„Zddœdededdfd„Zdefd„Zdddeddfd„Zy)r1   u¡	  
    A node, or collection of directly descended nodes, in a DataTree.

    We store the DataTree as a radix tree (https://en.wikipedia.org/wiki/Radix_tree),
    which means that nodes that are the only child of their parent are collapsed
    into their parent to save space.

    Conceptually, you can unfold a single TreeNode storing n values in its lists
    into a sequence of n nodes, each a child of the last. In other words,
    (constraints[i], values[i], choice_types[i]) corresponds to the single node at index
    i.

    Note that if a TreeNode represents a choice (i.e. the nodes cannot be compacted
    via the radix tree definition), then its lists will be empty and it will
    store a `Branch` representing that choce in its `transition`.

    Examples
    --------

    Consider sequentially drawing a boolean, then an integer.

            data.draw_boolean()
            data.draw_integer(1, 3)

    If we draw True and then 2, the tree may conceptually look like this.

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
                      â”‚ root â”‚
                      â””â”€â”€â”¬â”€â”€â”€â”˜
                      â”Œâ”€â”€â”´â”€â”€â”€â”�
                      â”‚ True â”‚
                      â””â”€â”€â”¬â”€â”€â”€â”˜
                      â”Œâ”€â”€â”´â”€â”€â”€â”�
                      â”‚  2   â”‚
                      â””â”€â”€â”€â”€â”€â”€â”˜

    But since 2 is the only child of True, we will compact these nodes and store
    them as a single TreeNode.

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
                      â”‚ root â”‚
                      â””â”€â”€â”¬â”€â”€â”€â”˜
                    â”Œâ”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”�
                    â”‚ [True, 2] â”‚
                    â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜

    If we then draw True and then 3, True will have multiple children and we
    can no longer store this compacted representation. We would call split_at(0)
    on the [True, 2] node to indicate that we need to add a choice at 0-index
    node (True).

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
                      â”‚ root â”‚
                      â””â”€â”€â”¬â”€â”€â”€â”˜
                      â”Œâ”€â”€â”´â”€â”€â”€â”�
                    â”Œâ”€â”¤ True â”œâ”€â”�
                    â”‚ â””â”€â”€â”€â”€â”€â”€â”˜ â”‚
                  â”Œâ”€â”´â”€â”�      â”Œâ”€â”´â”€â”�
                  â”‚ 2 â”‚      â”‚ 3 â”‚
                  â””â”€â”€â”€â”˜      â””â”€â”€â”€â”˜
    )Údefault_factoryr@   ÚvaluesÚchoice_typesNF)ÚdefaultÚinitÚ_TreeNode__forcedÚ
transitionÚis_exhaustedr5   c                 ó>   — | j                   st        S | j                   S ©N)rž   r,   ©r9   s    r+   rA   zTreeNode.forced§  s   € à�}Š}ÜˆLØ�}‰}Ðr*   rV   c                 ó¶   — d|cxk  rt        | j                  «      k  sJ ‚ J ‚| j                  €t        «       | _        | j                  j	                  |«       y)z:
        Note that the draw at node i was forced.
        r   N)r„   rš   rž   ÚsetÚadd)r9   rV   s     r+   Úmark_forcedzTreeNode.mark_forced­  sK   € ð �AÔ(œ˜DŸK™KÓ(Ò(Ð(Ñ(Ð(Ð(Ø�=‰=Ð Ü›EˆDŒMØ�‰×Ñ˜!Õr*   ©Ú	new_valuer©   c          	      ó   — || j                   v r9t        j                  d| j                  |   › d| j                  |   ›d|›d�«      ‚| j
                  rJ ‚| j                  |   }t        | j                  |dz   d | j                  |dz   d | j                  |dz   d | j                  ¬«      }t        | j                  |   | j                  |   ||i¬«      | _        | j                  �P| j                  D �ch c]  }||kD  sŒ	||z
  dz
  ’Œ c}|_
        | j                  D �ch c]
  }||k  sŒ	|’Œ c}| _
        |j                  «        | j                  |d…= | j                  |d…= | j                  |d…= t        | j                  «      t        | j                  «      cxk(  rt        | j                  «      cxk(  r|k(  sJ ‚ J ‚yc c}w c c}w )	zÇ
        Splits the tree so that it can incorporate a decision at the draw call
        corresponding to the node at position i.

        Raises FlakyStrategyDefinition if node i was forced.
        úThe z value was forced to z+ in the first run, but the second run drew z.
rl   N)r›   r@   rš   rŸ   )r@   r>   rJ   )rA   r   Úwith_detailr›   rš   r    r1   r@   rŸ   rH   rž   Úcheck_exhaustedr„   )r9   rV   r©   ÚkeyrW   Újs         r+   Úsplit_atzTreeNode.split_at¶  s¾  € ð �—‘ÑÜ)×5Ñ5Ø�t×(Ñ(¨Ñ+Ð,Ð,AØ—;‘;˜q‘>Ð$ð %Ø!�} Cð)óð ð ×$Ò$Ð$Ð$à�k‰k˜!‰nˆäØ×*Ñ*¨1¨q©5¨7Ð3Ø×(Ñ(¨¨Q©¨Ð1Ø—;‘;˜q 1™u˜wÐ'Ø—‘ô	
ˆô !Ø×(Ñ(¨Ñ+Ø×)Ñ)¨!Ñ,Ø˜5�\ô
ˆŒð
 �=‰=Ð$Ø15·±ÖH¨AÀ!ÀaÃ%˜a !™e a›iÒHˆEŒNØ(,¯©Ö? 1¸¸Q»šQÒ?ˆDŒMØ×ÑÔØ×Ñ˜a™bÐ!Ø�K‰K˜™ˆOØ×Ñ˜Q™RÐ Ü�4—;‘;Ó¤3 t×'7Ñ'7Ó#8ÔW¼CÀ×@QÑ@QÓ<RÔWÐVWÒWÐWÑWÐWÑWùò IùÚ?s   Ã7
GÄ
GÄ"
GÄ-Gc                 óä  — | j                   sÙ| j                  �Ít        | j                  «      t        | j                  «      k(  r¢t        | j                  t        t        f«      rd| _         | j                   S t        | j                  j                  «      | j                  j                  k(  r9t        d„ | j                  j                  j	                  «       D «       «      | _         | j                   S )aX  
        Recalculates is_exhausted if necessary, and then returns it.

        A node is exhausted if:
        - Its transition is Conclusion or Killed
        - It has the maximum number of children (i.e. we have found all of its
          possible children), and all its children are exhausted

        Therefore, we only need to compute this for a node when:
        - We first create it in split_at
        - We set its transition to either Conclusion or Killed
          (TreeRecordingObserver.conclude_test or TreeRecordingObserver.kill_branch)
        - We exhaust any of its children
        Tc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr¢   ©r    ©Ú.0Úvs     r+   ú	<genexpr>z+TreeNode.check_exhausted.<locals>.<genexpr>  s   è ø€ ò (Ø'(�A—N•Nñ(ùs   ‚)r    rŸ   r„   rA   rš   Ú
isinstancer\   r0   rJ   rM   Úallr£   s    r+   r­   zTreeNode.check_exhaustedÝ  s¼   € ð$ ×!Ò!ð —‘Ð+ô �D—K‘KÓ ¤C¨¯©Ó$4Ò4ä˜$Ÿ/™/¬J¼Ð+?Ô@Ø$(�Ô!ð
 × Ñ Ð ô	 �T—_‘_×-Ñ-Ó.°$·/±/×2NÑ2NÒNÜ$'ñ (Ø,0¯O©O×,DÑ,D×,KÑ,KÓ,Mô(ó %�Ô!ð × Ñ Ð r*   r3   r"   r4   c                 óz  — |du sJ ‚d}t        t        | j                  | j                  | j                  d¬«      «      D ]g  \  }\  }}}|j                  |«      5  |dkD  r|j                  «        |j                  t        ||||| j                  v ¬«      «       d d d «       |dz  }Œi |j                  |«      5  t        | j                  «      dkD  r|j                  «        | j                  �|j                  | j                  «       n|j                  d«       d d d «       y # 1 sw Y   ŒŒxY w# 1 sw Y   y xY w)NFr   T©ÚstrictrO   rP   Úunknown)rQ   Úzipr›   r@   rš   rT   rS   r7   rF   rA   r„   rŸ   rU   )r9   r3   r4   rT   rV   r>   r@   r?   s           r+   r:   zTreeNode._repr_pretty_	  s  € Ø˜‰~Ðˆ~ØˆÜ4=Ü�×!Ñ! 4×#3Ñ#3°T·[±[ÈÔNó5
ò 	Ñ0ˆAÑ0�˜[¨%ð —‘˜&Ó!ñ Ø�q’5Ø—H‘H”JØ—‘Ü Ø# U¨KÀÀTÇ[Á[Ð@Pôô÷ð �a‰K‰Fð	ð �X‰X�fÓñ 	"Ü�4—;‘;Ó !Ò#Ø—‘”
Ø�‰Ð*Ø—‘˜Ÿ™Õ)à—‘�yÔ!÷	"ð 	"÷ð ú÷	"ð 	"ús   ÁA D%Â:A"D1Ä%D.	Ä1D:)r&   r'   r(   r;   r   Úlistr@   r   r<   rš   r   r›   r   rž   r¥   rZ   rŸ   rH   r\   r0   r    r=   rY   r   rA   r§   Úobjectr°   r­   r:   r)   r*   r+   r1   r1   I  s  … ñ<ñ@ -2À$Ô,G€K�Ð(Ñ)ÓGÙ!°$Ô7€FˆD�‰MÓ7Ù&+¸DÔ&A€L�$�{Ñ#ÓAñ !&¨d¸Ô ?€Hˆc�#‰h˜‰oÓ?ð 7;€J�˜Ñ# fÑ,¨tÑ3Ó:ñ  u°5Ô9€L�$Ó9àð˜˜C™ò ó ðð
˜Sð  Tó ð 7;ò %X˜#ð %X¨Vð %X¸tó %XðN*! ó *!ðX"Ð6ð "¸tð "Èô "r*   r1   c            
       óà   — e Zd ZdZdd„Zedefd„«       Zdede	e
df   fd„Zd	„ Zd
eddfd„Zd„ Zdededede
fd„Zdedede
defd„Zdedede
dede
f
d„Zdedede
de
ddf
d„Zdddeddfd„Zy)ÚDataTreeuË  
    A DataTree tracks the structured history of draws in some test function,
    across multiple ConjectureData objects.

    This information is used by ConjectureRunner to generate novel prefixes of
    this tree (see generate_novel_prefix). A novel prefix is a sequence of draws
    which the tree has not seen before, and therefore the ConjectureRunner has
    not generated as an input to the test function before.

    DataTree tracks the following:

    - Drawn choices in the choice sequence
      - ConjectureData.draw_integer()
      - ConjectureData.draw_float()
      - ConjectureData.draw_string()
      - ConjectureData.draw_boolean()
      - ConjectureData.draw_bytes()
    - Test conclusions (with some Status, e.g. Status.VALID)
      - ConjectureData.conclude_test()

    A DataTree is â€” surprise â€” a *tree*. A node in this tree is either a choice draw
    with some value, a test conclusion with some Status, or a special `Killed` value,
    which denotes that further draws may exist beyond this node but should not be
    considered worth exploring when generating novel prefixes. A node is a leaf
    iff it is a conclusion or Killed.

    A branch from node A to node B indicates that we have previously seen some
    sequence (a, b) of draws, where a and b are the values in nodes A and B.
    Similar intuition holds for conclusion and Killed nodes.

    Examples
    --------

    To see how a DataTree gets built through successive sets of draws, consider
    the following code that calls through to some ConjecutreData object `data`.
    The first call can be either True or False, and the second call can be any
    integer in the range [1, 3].

        data.draw_boolean()
        data.draw_integer(1, 3)

    To start, the corresponding DataTree object is completely empty.

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
                      â”‚ root â”‚
                      â””â”€â”€â”€â”€â”€â”€â”˜

    We happen to draw True and then 2 in the above code. The tree tracks this.
    (2 also connects to a child Conclusion node with Status.VALID since it's the
    final draw in the code. I'll omit Conclusion nodes in diagrams for brevity.)

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
                      â”‚ root â”‚
                      â””â”€â”€â”¬â”€â”€â”€â”˜
                      â”Œâ”€â”€â”´â”€â”€â”€â”�
                      â”‚ True â”‚
                      â””â”€â”€â”¬â”€â”€â”€â”˜
                      â”Œâ”€â”€â”´â”€â”€â”€â”�
                      â”‚  2   â”‚
                      â””â”€â”€â”€â”€â”€â”€â”˜

    This is a very boring tree so far! But now we happen to draw False and
    then 1. This causes a split in the tree. Remember, DataTree tracks history
    over all invocations of a function, not just one. The end goal is to know
    what invocations haven't been tried yet, after all.

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
                  â”Œâ”€â”€â”€â”¤ root â”œâ”€â”€â”€â”�
                  â”‚   â””â”€â”€â”€â”€â”€â”€â”˜   â”‚
               â”Œâ”€â”€â”´â”€â”€â”€â”�        â”Œâ”€â”´â”€â”€â”€â”€â”€â”�
               â”‚ True â”‚        â”‚ False â”‚
               â””â”€â”€â”¬â”€â”€â”€â”˜        â””â”€â”€â”¬â”€â”€â”€â”€â”˜
                â”Œâ”€â”´â”€â”�           â”Œâ”€â”´â”€â”�
                â”‚ 2 â”‚           â”‚ 1 â”‚
                â””â”€â”€â”€â”˜           â””â”€â”€â”€â”˜

    If we were to ask DataTree for a novel prefix at this point, it might
    generate any of (True, 1), (True, 3), (False, 2), or (False, 3).

    Note that the novel prefix stops as soon as it generates a novel node. For
    instance, if we had generated a novel prefix back when the tree was only
    root -> True -> 2, we could have gotten any of (True, 1), (True, 3), or
    (False). But we could *not* have gotten (False, n), because both False and
    n were novel at that point, and we stop at the first novel node â€” False.

    I won't belabor this example. Here's what the tree looks like when fully
    explored:

                      â”Œâ”€â”€â”€â”€â”€â”€â”�
               â”Œâ”€â”€â”€â”€â”€â”€â”¤ root â”œâ”€â”€â”€â”€â”€â”€â”�
               â”‚      â””â”€â”€â”€â”€â”€â”€â”˜      â”‚
            â”Œâ”€â”€â”´â”€â”€â”€â”�              â”Œâ”€â”´â”€â”€â”€â”€â”€â”�
         â”Œâ”€â”€â”¤ True â”œâ”€â”€â”�       â”Œâ”€â”€â”€â”¤ False â”œâ”€â”€â”�
         â”‚  â””â”€â”€â”¬â”€â”€â”€â”˜  â”‚       â”‚   â””â”€â”€â”¬â”€â”€â”€â”€â”˜  â”‚
       â”Œâ”€â”´â”€â”� â”Œâ”€â”´â”€â”�  â”Œâ”€â”´â”€â”�   â”Œâ”€â”´â”€â”�  â”Œâ”€â”´â”€â”�   â”Œâ”€â”´â”€â”�
       â”‚ 1 â”‚ â”‚ 2 â”‚  â”‚ 3 â”‚   â”‚ 1 â”‚  â”‚ 2 â”‚   â”‚ 3 â”‚
       â””â”€â”€â”€â”˜ â””â”€â”€â”€â”˜  â””â”€â”€â”€â”˜   â””â”€â”€â”€â”˜  â””â”€â”€â”€â”˜   â””â”€â”€â”€â”˜

    You could imagine much more complicated trees than this arising in practice,
    and indeed they do. In particular, the tree need not be balanced or 'nice'
    like the tree above. For instance,

        b = data.draw_boolean()
        if b:
            data.draw_integer(1, 3)

    results in a tree with the entire right part lopped off, and False leading
    straight to a conclusion node with Status.VALID. As another example,

        n = data.draw_integers()
        assume(n >= 3)
        data.draw_string()

    results in a tree with the 0, 1, and 2 nodes leading straight to a
    conclusion node with Status.INVALID, and the rest branching off into all
    the possibilities of draw_string.

    Notes
    -----

    The above examples are slightly simplified and are intended to convey
    intuition. In practice, there are some implementation details to be aware
    of.

    - In draw nodes, we store the constraints used in addition to the value drawn.
      E.g. the node corresponding to data.draw_float(min_value=1.0, max_value=1.5)
      would store {"min_value": 1.0, "max_value": 1.5, ...} (default values for
      other constraints omitted).

      The constraints parameters have the potential to change both the range of
      possible outputs of a node, and the probability distribution within that
      range, so we need to use these when drawing in DataTree as well. We draw
      values using these constraints when (1) generating a novel value for a node
      and (2) choosing a random child when traversing the tree.

    - For space efficiency, rather than tracking the full tree structure, we
      store DataTree as a radix tree. This is conceptually equivalent (radix
      trees can always be "unfolded" to the full tree) but it means the internal
      representation may differ in practice.

      See TreeNode for more information.
    r5   Nc                 ó0   — t        «       | _        i | _        y r¢   )r1   ÚrootÚ_children_cacher£   s    r+   Ú__init__zDataTree.__init__²  s   € Ü&›jˆŒ	ØCEˆÕr*   c                 ó.   — | j                   j                  S )zr
        Returns True if every node is exhausted, and therefore the tree has
        been fully explored.
        )rÄ   r    r£   s    r+   r    zDataTree.is_exhausted¶  s   € ð �y‰y×%Ñ%Ð%r*   Úrandom.c           	      óÐ  ‡— | j                   rJ ‚g Šdt        dt        ddfˆfd„}| j                  }	 |j                   rJ ‚t	        t        |j                  |j                  |j                  d¬«      «      D ]œ  \  }\  }}}||j                  v r
 |||«       Œ"d}	 |d	k  r	 | j                  |||¬
«      }	n| j                  ||t        |«      |¬«      }	|	|k7  r
 |||	«       n$|dz  }| j                  |||	t        |«      ¬«       Œlt        ‰«      c S  t!        |j"                  t$        t&        f«      rJ ‚|j"                  €t        ‰«      S |j"                  }
t!        |
t(        «      sJ ‚d}	 |d	k  r*	 | j                  |
j*                  |
j                  |¬
«      }	n2| j                  |
j*                  |
j                  t        |
«      |¬«      }		 |
j,                  |	   }|j                   s ||
j*                  |	«       |}nŒ|dz  }| j                  |
j*                  |
j                  |	t        |
«      ¬«       |dk7  sNt1        |
j,                  «      |
j2                  k  s,t5        d„ |
j,                  j                  «       D «       «      sJ ‚�Œ�Œ^# t        $ r	 |dz  }Y �Œw xY w# t        $ r	 |dz  }Y �ŒHw xY w# t.        $ r!  ||
j*                  |	«       t        ‰«      cY S w xY w)aA  Generate a short random string that (after rewriting) is not
        a prefix of any choice sequence previously added to the tree.

        The resulting prefix is essentially arbitrary - it would be nice
        for it to be uniform at random, but previous attempts to do that
        have proven too expensive.
        r>   Úchoicer5   Nc                 ól   •— | dk(  rt        |t        «      sJ ‚t        |«      }‰j                  |«       y )Nr€   )r¸   rZ   r    Úappend)r>   rÊ   Úprefixs     €r+   Úappend_choicez5DataTree.generate_novel_prefix.<locals>.append_choiceÉ  s1   ø€ Ø˜gÒ%Ü! &¬#Ô.Ð.Ð.Ü% fÓ-�Ø�M‰M˜&Õ!r*   Tr»   r   é
   ©rÈ   rl   )r®   rÈ   )rW   r®   iè  c              3   ó6   K  — | ]  }|j                    –— Œ y ­wr¢   r³   r´   s     r+   r·   z1DataTree.generate_novel_prefix.<locals>.<genexpr>+  s   è ø€ ÒP°!˜qŸ~™~Ô-ÑPùs   ‚)r    r   r   rÄ   rQ   r¾   r›   r@   rš   rA   Ú_drawr   Ú_draw_from_cacheÚidÚ_reject_childÚtupler¸   rŸ   r\   r0   rH   r>   rJ   ÚKeyErrorr„   rM   Úany)r9   rÈ   rÎ   Úcurrent_noderV   r>   r@   r?   ÚattemptsÚ
node_valueÚbranchrW   rÍ   s               @r+   Úgenerate_novel_prefixzDataTree.generate_novel_prefix¾  s@  ø€ ð ×$Ò$Ð$Ð$Øˆð	"¤{ð 	"¼Gð 	"Èõ 	"ð —y‘yˆØØ#×0Ò0Ð0Ð0Ü8AÜØ ×-Ñ-Ø ×,Ñ,Ø ×'Ñ'Øô	ó9ò ,)Ñ4�Ñ4�K ¨eð ˜×+Ñ+Ñ+Ù! +¨uÕ5à �HØØ# rš>ð	)Ø-1¯Z©ZØ$/°ÀVð .8ó ."¡
ð *.×)>Ñ)>Ø +Ø +Ü$& |Ó$4Ø'-ð	 *?ó *˜Jð &¨Ò.Ù)¨+°zÔBØ!Ø  A™˜Ø×*Ñ*Ø'Ø'Ø",Ü " <Ó 0ð	 +ô ð1 ô@ ! ›=Ò(ðY,)ô\ " ,×"9Ñ"9¼JÌÐ;OÔPÐPÐPØ×&Ñ&Ð.Ü˜V“}Ð$Ø!×,Ñ,ˆFÜ˜f¤fÔ-Ð-Ð-àˆHØØ˜r’>ð!Ø%)§Z¡ZØ"×.Ñ.°×0BÑ0BÈ6ð &0ó &™
ð "&×!6Ñ!6Ø×*Ñ*Ø×*Ñ*Ü˜v›JØ%ð	 "7ó "�Jð)Ø"ŸO™O¨JÑ7�Eð ×)Ò)Ù! &×"4Ñ"4°jÔAØ#(�LØØ˜A‘�Ø×"Ñ"Ø×&Ñ&Ø×&Ñ&Ø$Ü˜6›
ð	 #ô ð  Ò$Ü˜6Ÿ?™?Ó+¨f×.AÑ.AÒAÜÑP°v·±×7MÑ7MÓ7OÔPÔPððQñE ño øô( $,ò )ð !)¨A¡ Ú (ð)ûôR $ò !Ø  A™˜Ú ð!ûô  ò )Ù! &×"4Ñ"4°jÔAÜ  ›=Ò(ð)ús6   Â"JÅ6(J& ÇJ; ÊJ#Ê"J#Ê&J8Ê7J8Ê;'K%Ë$K%c                 ó¦   — t        j                  |«      }	 | j                  |«       |j                  |j                  fS # t
        $ r |dfcY S w xY w)a  Use previously seen ConjectureData objects to return a tuple of
        the rewritten choice sequence and the status we would get from running
        that with the test function. If the status cannot be predicted
        from the existing values it will be None.N)r   Úfor_choicesÚsimulate_test_functionÚchoicesr]   r%   )r9   rá   Údatas      r+   ÚrewritezDataTree.rewrite.  sS   € ô
 ×)Ñ)¨'Ó2ˆð	#Ø×'Ñ'¨Ô-Ø—L‘L $§+¡+Ð.Ð.øÜ(ò 	#Ø˜T�?Ò"ð	#ús   —(A  Á AÁArâ   c                 óv  ‡— | j                   }dddœˆfd„
}	 	 t        t        |j                  |j                  |j
                  d¬«      «      D ]/  \  }\  }}} |||||j                  v r|nd¬«      }||k7  sŒ+t        ‚ t        |j                  t        «      r3|j                  }	‰j                  |	j                  |	j                  «       nÄ|j                  €t        ‚t        |j                  t        «      rL ||j                  j                  |j                  j                  «      }	 |j                  j                   |   }nLt        |j                  t$        «      sJ ‚‰j&                  j)                  «        |j                  j*                  }�Œ{# t"        $ r}
t        |
‚d}
~
ww xY w# t,        $ r Y yw xY w)zöRun a simulated version of the test function recorded by
        this tree. Note that this does not currently call ``stop_span``
        or ``start_span`` as these are not currently recorded in the
        tree. This will likely change in future.NT)rA   Úconvert_forcedc                ó†   •— | dk(  r|�|rt        |«      }t        ‰d| › �«      } |di |¤d|i¤Ž}| dk(  rt        |«      }|S )Nr€   Údraw_rA   r)   )r    Úgetattrr   )r>   r@   rA   rå   Ú	draw_funcr?   râ   s         €r+   Údrawz-DataTree.simulate_test_function.<locals>.drawA  sX   ø€ Ø˜gÒ%¨&Ð*<ÁÜ% fÓ-�ä ¨¨k¨]Ð&;Ó<ˆIÙÑ; Ñ;°FÒ;ˆEà˜gÒ%Ü$ UÓ+�ØˆLr*   r»   rO   )rÄ   rQ   r¾   r›   r@   rš   rA   r%   r¸   rŸ   r\   Úconclude_testr]   r^   rH   r>   rJ   r×   r0   ÚobserverÚkill_branchr2   r   )r9   râ   Únoderê   rV   r>   r@   Úpreviousr¶   ÚtÚerrs    `         r+   rà   zDataTree.simulate_test_function:  s…  ø€ ð
 �y‰yˆà59È$ö 		ð	ØÜ?HÜ˜×)Ñ)¨4×+;Ñ+;¸T¿[¹[ÐQUÔVó@ò 	8Ñ;�AÑ;˜ [°(ñ Ø#Ø#Ø+,°·±Ñ+;™xÀô�Að
 ˜H“}Ü7Ð7ð	8ô ˜dŸo™o¬zÔ:ØŸ™�AØ×&Ñ& q§x¡x°×1EÑ1EÕFØ—_‘_Ð,Ü3Ð3Ü §¡´Ô8Ù˜TŸ_™_×8Ñ8¸$¿/¹/×:UÑ:UÓV�AðAØ#Ÿ™×7Ñ7¸Ñ:™ô & d§o¡o´vÔ>Ð>Ð>Ø—M‘M×-Ñ-Ô/ØŸ?™?×4Ñ4�Dñ3 øô( $ò AÜ7¸SÐ@ûðAûô ò 	Ùð	ús>   ˜A!F, Á:B1F, Ä,F ÅAF, Æ	F)ÆF$Æ$F)Æ)F, Æ,	F8Æ7F8c                 ó   — t        | «      S r¢   )ÚTreeRecordingObserverr£   s    r+   Únew_observerzDataTree.new_observerj  s   € Ü$ TÓ*Ð*r*   r>   r@   c                ól   — ddl m}  ||||¬«      }|dk(  rt        |t        «      sJ ‚t	        |«      }|S )Nr   )Údraw_choicerÐ   r€   )Ú#hypothesis.internal.conjecture.datarö   r¸   r€   r   )r9   r>   r@   rÈ   rö   r?   s         r+   rÒ   zDataTree._drawm  s?   € õ 	Dá˜K¨¸VÔDˆð ˜'Ò!Ü˜e¤UÔ+Ð+Ð+Ü  Ó'ˆEØˆr*   r®   c                ó�   — || j                   vr*t        ||«      }g }t        «       }|||f| j                   |<   | j                   |   S r¢   )rÅ   r—   r¥   )r9   r>   r@   r®   Ú	generatorrJ   Úrejecteds          r+   Ú_get_children_cachezDataTree._get_children_cache„  sR   € ð �d×*Ñ*Ñ*Ü$ [°+Ó>ˆIØ&(ˆHÜ%(£UˆHØ)2°H¸hÐ(GˆD× Ñ  Ñ%à×#Ñ# CÑ(Ð(r*   c                ó  — | j                  |||¬«      \  }}}t        |«      dk  rO|D ]J  }|dk(  rt        |t        «      sJ ‚t	        |«      }||v rŒ*|j                  |«       t        |«      dk\  sŒJ n |j                  |«      S )N©r®   éd   r€   )rû   r„   r¸   r€   r   rÌ   rÊ   )	r9   r>   r@   r®   rÈ   rù   rJ   rú   r¶   s	            r+   rÓ   zDataTree._draw_from_cache˜  sœ   € ð )-×(@Ñ(@Ø˜¨#ð )Aó )
Ñ%ˆ	�8˜Xô ˆx‹=˜3ÒØò �Ø 'Ò)Ü% a¬Ô/Ð/Ð/Ü$ Q›�AØ˜‘=ØØ—‘ Ô"Ü�x“= CÓ'Ùðð �}‰}˜XÓ&Ð&r*   rW   c                ó‚   — | j                  |||¬«      \  }}}|j                  |«       ||v r|j                  |«       y y )Nrý   )rû   r¦   Úremove)r9   r>   r@   rW   r®   Ú
_generatorrJ   rú   s           r+   rÕ   zDataTree._reject_child¶  sQ   € ð *.×)AÑ)AØ˜¨#ð *Bó *
Ñ&ˆ
�H˜hð 	�‰�UÔð" �HÑØ�O‰O˜EÕ"ð r*   r3   r"   r4   c                 óF   — |du sJ ‚|j                  | j                  «       y )NF)rU   rÄ   r8   s      r+   r:   zDataTree._repr_pretty_Õ  s   € Ø˜‰~Ðˆ~Ø	�‰�—‘Õr*   ©r5   N)r&   r'   r(   r;   rÆ   rY   r=   r    r   rÖ   r   rÝ   rã   r   rà   rô   r   r   rÒ   r#   rû   rÓ   rÕ   r:   r)   r*   r+   rÂ   rÂ   "  s=  „ ñMó^Fð ð&˜dò &ó ð&ðn¨Fð n°u¸WÀc¸\Ñ7Jó nò`
#ð.¨>ð .¸dó .ò`+ðà ðð (ðð
 ðð 
óð.)Ø&ð)Ø5Gð)ØQXð)à	ó)ð('à ð'ð (ð'ð
 ð'ð ð'ð 
ó'ð<#à ð#ð (ð#ð
 ð#ð ð#ð 
ó#ð>Ð6ð ¸tð Èô r*   rÂ   c            
       óÖ   — e Zd Zdefd„Zdedededdfd„Zde	dede
ddfd	„Zdedededdfd
„Zdedededdfd„Zdedededdfd„Zdededededdf
d„Zdd„Zdededz  ddfd„Zdd„Zy)ró   Útreec                 óˆ   — |j                   | _        |j                   | _        d| _        | j                  g| _        d| _        y )Nr   F)rÄ   Ú_rootÚ_current_nodeÚ_index_in_current_nodeÚ_trailÚkilled)r9   r  s     r+   rÆ   zTreeRecordingObserver.__init__Û  s:   € ð —Y‘YˆŒ
Ø'+§y¡yˆÔØ+,ˆÔ#Ø'+×'9Ñ'9Ð&:ˆŒØ!ˆ�r*   r?   Ú
was_forcedr@   r5   Nc                ó.   — | j                  d|||¬«       y )Nrv   ©r  r@   ©Ú
draw_value©r9   r?   r  r@   s       r+   Údraw_integerz"TreeRecordingObserver.draw_integerå  ó   € ð 	�‰Ø�u¨Àð 	õ 	
r*   c                ó.   — | j                  d|||¬«       y )Nr€   r  r  r  s       r+   Ú
draw_floatz TreeRecordingObserver.draw_floatì  ó   € ð 	�‰˜ °:È;ˆÕWr*   c                ó.   — | j                  d|||¬«       y )Nr~   r  r  r  s       r+   Údraw_stringz!TreeRecordingObserver.draw_stringñ  s   € ð 	�‰˜ %°JÈKˆÕXr*   c                ó.   — | j                  d|||¬«       y )Nr|   r  r  r  s       r+   Ú
draw_bytesz TreeRecordingObserver.draw_bytesö  r  r*   c                ó.   — | j                  d|||¬«       y )Nr{   r  r  r  s       r+   Údraw_booleanz"TreeRecordingObserver.draw_booleanû  r  r*   r>   c                óœ  — | j                   }| xj                   dz  c_         | j                  }t        |t        «      rt	        |«      }t        |j                  «      t        |j                  «      cxk(  rt        |j                  «      k(  sJ ‚ J ‚|t        |j                  «      k  �r||j                  |   k7  s||j                  |   k7  r2t        j                  |j                  |   |j                  |   ||«      ‚|r'||j                  vrt        j                  d|› d�«      ‚||j                  |   k7  �r|j                  ||¬«       |t        |j                  «      k(  sJ ‚t        «       }t        |j                  t         «      sJ ‚||j                  j"                  |<   || _        d| _         �n›|j                  }|€Ì|j                  j%                  |«       |j                  j%                  |«       |j                  j%                  |«       |r|j'                  |«       t)        ||«      dk(  �r|�s|j                  ||¬«       t        |j                  t         «      sJ ‚|j                  j"                  |   | _        d| _         nÁt        |t*        «      r4|j,                  t.        j0                  k7  sJ ‚t        j                  d«      ‚t        |t         «      sJ |«       ‚||j2                  k7  s||j                  k7  r,t        j                  |j2                  |j                  ||«      ‚	 |j"                  |   | _        d| _         | j8                  d   | j                  ur&| j8                  j%                  | j                  «       y y # t4        $ r, |j"                  j7                  |t        «       «      | _        Y Œ}w xY w)Nrl   r«   zK value was forced to a specific value but was not forced on the first run.
r¨   r   z2The second run drew more data than the first run.
éÿÿÿÿ)r	  r  r¸   r€   r   r„   r@   rš   r›   r   Úfrom_mismatchrA   r¬   r°   r1   rŸ   rH   rJ   rÌ   r§   rL   r\   r]   r   ÚOVERRUNr>   r×   Ú
setdefaultr
  )	r9   r>   r?   r  r@   rV   rî   Únew_nodeÚtranss	            r+   r  z TreeRecordingObserver.draw_value  sV  € ð ×'Ñ'ˆØ×#Ò# qÑ(Õ#Ø×!Ñ!ˆä�eœUÔ#Ü  Ó'ˆEä�4×#Ñ#Ó$¬¨D¯K©KÓ(8ÔR¼CÀ×@QÑ@QÓ<RÒRÐRÑRÐRÐRØŒs�4—;‘;ÓÓà˜t×0Ñ0°Ñ3Ò3Ø $×"2Ñ"2°1Ñ"5Ò5ä-×;Ñ;Ø×%Ñ% aÑ(Ø×$Ñ$ QÑ'ØØó	ð ñ ˜a t§{¡{Ñ2Ü-×9Ñ9Ø˜;˜-ð (=ð >óð ð ˜Ÿ™ A™Ó&Ø—‘˜a¨5�Ô1ØœC §¡Ó,Ò,Ð,Ð,Ü#›:�Ü! $§/¡/´6Ô:Ð:Ð:Ø2:�—‘×(Ñ(¨Ñ/Ø%-�Ô"Ø./�Ö+à—O‘OˆEØˆ}Ø×!Ñ!×(Ñ(¨Ô5Ø× Ñ ×'Ñ'¨Ô4Ø—‘×"Ñ" 5Ô)ÙØ×$Ñ$ QÔ'ô$ )¨°kÓBÀaÓGÚ&à—M‘M !¨u�MÔ5Ü% d§o¡o´vÔ>Ð>Ð>Ø)-¯©×)AÑ)AÀ%Ñ)H�DÔ&Ø23�DÕ/Ü˜E¤:Ô.Ø—|‘|¤v§~¡~Ò5Ð5Ð5ô .×9Ñ9ØIóð ô " %¬Ô0Ð7°%Ó7Ð0Ø %×"3Ñ"3Ò3°{Àe×FWÑFWÒ7WÜ1×?Ñ?Ø×)Ñ)Ø×)Ñ)Ø#Ø#ó	ð ðVØ).¯©¸Ñ)>�DÔ&ð /0�Ô+Ø�;‰;�r‰? $×"4Ñ"4Ñ4Ø�K‰K×Ñ˜t×1Ñ1Õ2ð 5øô  ò VØ).¯©×)BÑ)BÀ5Ì(Ë*Ó)U�DÖ&ðVús   Ì9N Î2OÏ
Oc                 óT  — | j                   ryd| _         | j                  t        | j                  j                  «      k  s:| j                  j
                  �9t        | j                  j
                  t        «      st        j                  d«      ‚| j                  j
                  €2t        t        «       «      | j                  _        | j                  «        | j                  j
                  j                  | _        d| _        | j                  j                  | j                  «       y)z5Mark this part of the tree as not worth re-exploring.NTú^The second run stopped drawing earlier than the first run, which continued to draw more data.
r   )r  r	  r„   r  rš   rŸ   r¸   r0   r   r¬   r1   Ú(_TreeRecordingObserver__update_exhaustedr2   r
  rÌ   r£   s    r+   rí   z!TreeRecordingObserver.kill_branchh  sá   € à�;Š;ØàˆŒà×&Ñ&¬¨T×-?Ñ-?×-FÑ-FÓ)GÒGØ×Ñ×)Ñ)Ð5Ü˜t×1Ñ1×<Ñ<¼fÔEä)×5Ñ5ð7óð ð
 ×Ñ×(Ñ(Ð0Ü,2´8³:Ó,>ˆD×ÑÔ)Ø×#Ñ#Ô%à!×/Ñ/×:Ñ:×DÑDˆÔØ&'ˆÔ#Ø�‰×Ñ˜4×-Ñ-Õ.r*   r]   r^   c           
      ó²  — |t         j                  k(  ry| j                  }| j                  }|t	        |j
                  «      k  st        |j                  t        «      rt        j                  d«      ‚t        ||«      }|j                  �Û|j                  |k7  rÌt        |j                  t        «      r¹|j                  j                  t         j                  k7  s|j                  t         j                  k7  ru|j                  j                  }|j                  }t!        d|j                  j                  j"                  › d|› d|j                  j"                  › d|› �||f«      ‚||_        || j$                  d   u sJ ‚|j'                  «        t	        |j
                  «      dkD  s|j'                  «       sJ ‚| j(                  s| j+                  «        yy)zvSays that ``status`` occurred at node ``node``. This updates the
        node if necessary and checks for consistency.Nr%  z9Inconsistent results from replaying a test case!
  last: z from z	
  this: r  r   )r   r   r	  r  r„   rš   r¸   rŸ   rH   r   r¬   r\   r]   ÚINTERESTINGÚVALIDr^   r   Únamer
  r­   r  r&  )r9   r]   r^   rV   rî   Únew_transitionÚ
old_originÚ
new_origins           r+   rë   z#TreeRecordingObserver.conclude_test€  s˜  € ð
 ”V—^‘^Ò#ØØ×'Ñ'ˆØ×!Ñ!ˆàŒs�4—;‘;ÓÒ¤:¨d¯o©o¼vÔ#FÜ)×5Ñ5ð7óð ô
 $ FÐ,>Ó?ˆà�?‰?Ð&¨4¯?©?¸nÒ+Lô ˜$Ÿ/™/¬:Ô6Ø—‘×&Ñ&¬&×*<Ñ*<Ò<Ø!×(Ñ(¬F¯L©LÒ8à!Ÿ_™_×?Ñ?�
Ø+×>Ñ>�
Ü!ðØ#Ÿ™×5Ñ5×:Ñ:Ð;¸6À*Àð NØ-×4Ñ4×9Ñ9Ð:¸&ÀÀðNð   Ð,ó	ð ð -ˆDŒOà�t—{‘{ 2‘Ñ&Ð&Ð&Ø×ÑÔÜ�4—;‘;Ó !Ò# t×';Ñ';Ô'=Ð=Ð=à�{Š{Ø×#Ñ#Õ%ð r*   c                 ó\   — t        | j                  «      D ]  }|j                  «       rŒ y  y r¢   )Úreversedr
  r­   )r9   rð   s     r+   Ú__update_exhaustedz(TreeRecordingObserver.__update_exhausted¬  s+   € Ü˜$Ÿ+™+Ó&ò 	ˆAð
 ×$Ñ$Õ&Ùñ	r*   r  )r&   r'   r(   rÂ   rÆ   rZ   r=   r   r  r€   r   r  Ústrr   r  r|   r   r  r   r  r   r   r   r  rí   r   r   rë   r&  r)   r*   r+   ró   ró   Ú  s?  „ ð"˜Xó "ð
Øð
Ø)-ð
Ø<Nð
à	ó
ðXØðXØ+/ðXØ>NðXà	óXð
YØðYØ)-ðYØ<MðYà	óYð
XØðXØ+/ðXØ>NðXà	óXð

Øð
Ø*.ð
Ø=Oð
à	ó
ðd3à ðd3ð ðd3ð
 ðd3ð (ðd3ð 
ód3óL/ð0*&Øð*&Ø2CÀdÑ2Jð*&à	ó*&ôXr*   ró   )Erq   Úcollections.abcr   r   Údataclassesr   r   rÈ   r   Útypingr   r	   r
   r   Úhypothesis.errorsr   r   r   r   Úhypothesis.internalr   r†   Ú%hypothesis.internal.conjecture.choicer   r   r   r   r   r   r   r   r   r÷   r   r   r   Úhypothesis.internal.escalationr   Úhypothesis.internal.floatsr   r   r    r!   Úhypothesis.vendor.prettyr"   rÖ   r¿   r¥   r#   r<   r%   Ú	frozensetr,   rZ   r0   r=   r1  rF   rH   r\   rg   rt   rL   r€   r“   r—   r1   rÂ   ró   r)   r*   r+   ú<module>r<     s'  ðô ß *ß (Ý ß 8Ó 8÷ó õ .÷
÷ 
õ 
÷ UÑ TÝ <÷ó ñ Ý>à!&Øˆg�t˜TÐ!Ñ" D¨¡M°3°w±<Ð?ñ"Ð �Yó ô
	Ð 3ô 	ñ "›€€y��~Ó #ñ �˜dÔ#÷
ð 
ó $ð
ðCØðCàðCð $ðCð
 ðCð 	óCñ �˜eÔ$÷ ð  ó %ð ñ6 �˜dÔ#÷8ð 8ó $ð8ðL 1;Ð ! 5¨¡:Ó :ð%3¨cð %3¸Sð %3ÈCð %3ÐTWó %3ðPLFØðLFØ+=ðLFàóLFðn�uð  ð ¨9°U¸DÀ$Ð5FÑ+Gó ð
(=Øð(=Ø+=ð(=àˆw˜˜dÐ"Ñ#ó(=ñV �˜eÔ$÷U"ð U"ó %ðU"÷puñ uôpY˜Lõ Yr*   