o
    ¡ØÆhT  ã                   @   s>  d Z ddlmZ ddlZddlZddlZddlZddlmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! g d¢Z"d*dd„Z#d*d	d
„Z$d+dd„Z%G dd„ dƒZ&d,dd„Z'd-dd„Z(d.dd„Z)d/dd„Z*dd„ Z+d0d d!„Z,d1d"d#„Z-d$d%„ Z.d*d&d'„Z/d(d)„ Z0dS )2z.
Useful utilities for working with bitarrays.
é    )Úabsolute_importN)ÚbitarrayÚ
bits2bytes)ÚzerosÚonesÚcount_nÚparityÚ_ssqiÚxor_indicesÚ	count_andÚcount_orÚ	count_xorÚany_andÚsubsetÚcorrespond_allÚbyteswapÚ	serializeÚdeserializeÚba2hexÚhex2baÚba2baseÚbase2baÚ	sc_encodeÚ	sc_decodeÚ	vl_encodeÚ	vl_decodeÚcanonical_decode)#r   r   ÚurandomÚrandom_kÚrandom_pÚ
gen_primesÚpprintÚstripr   r   Úsum_indicesr
   r   r   r   r   r   r   r   Ú	intervalsr   r   r   r   Úba2intÚint2bar   r   r   r   r   r   Úhuffman_codeÚcanonical_huffmanr   c                 C   s"   t t t| ƒ¡|ƒ}|| d…= |S )zdurandom(n, /, endian=None) -> bitarray

Return random bitarray of length `n` (uses `os.urandom()`).
N)r   Úosr   r   )Ú__lengthÚendianÚa© r-   úZ/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/bitarray/util.pyr   -   s   
r   c                 C   sJ   t jdd… dk rtdƒ‚t| |ƒ}t|tƒs tdt|ƒj ƒ‚| 	|¡S )a  random_k(n, /, k, endian=None) -> bitarray

Return (pseudo-) random bitarray of length `n` with `k` elements
set to one.  Mathematically equivalent to setting (in a bitarray of
length `n`) all bits at indices `random.sample(range(n), k)` to one.
The random bitarrays are reproducible when giving Python's `random.seed()`
with a specific seed value.

This function requires Python 3.9 or higher, as it depends on the standard
library function `random.randbytes()`.  Raises `NotImplementedError`
when Python version is too low.
Né   )é   é	   z6bitarray.util.random_k() requires Python 3.9 or higherúint expected, got '%s')
ÚsysÚversion_infoÚNotImplementedErrorÚ_RandomÚ
isinstanceÚintÚ	TypeErrorÚtypeÚ__name__r   )Ú__nÚkr+   Úrr-   r-   r.   r   7   s   


r   ç      à?c                 C   s.   t jdd… dk rtdƒ‚t| |ƒ}| |¡S )aD  random_p(n, /, p=0.5, endian=None) -> bitarray

Return (pseudo-) random bitarray of length `n`, where each bit has
probability `p` of being one (independent of any other bits).  Mathematically
equivalent to `bitarray((random() < p for _ in range(n)), endian)`, but much
faster for large `n`.  The random bitarrays are reproducible when giving
Python's `random.seed()` with a specific seed value.

This function requires Python 3.12 or higher, as it depends on the standard
library function `random.binomialvariate()`.  Raises `NotImplementedError`
when Python version is too low.
Nr/   )r0   é   z7bitarray.util.random_p() requires Python 3.12 or higher)r3   r4   r5   r6   r   )r<   Úpr+   r>   r-   r-   r.   r   N   s   

r   c                   @   sN   e Zd ZdZde> ZdZddd„Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )r6   é   é   g{®Gáz„?r   Nc                 C   s   || _ t|ƒ| _|| _d S ©N)Únr   Únbytesr+   )ÚselfrE   r+   r-   r-   r.   Ú__init__r   s   

z_Random.__init__c                 C   s$   t t | j¡| jƒ}|| jd…= |S )zV
        Return bitarray with each bit having probability p = 1/2 of being 1.
        N)r   ÚrandomÚ	randbytesrF   r+   rE   )rG   r,   r-   r-   r.   Úrandom_halfw   s   z_Random.random_halfc                 C   sV   d|  k r| j k sn td| j |f ƒ‚t|jddd�dƒ}|| d¡d | j… S )zö
        Return bitarray containing operator sequence.
        Each item represents a bitwise operation:   0: AND   1: OR
        After applying the sequence (see .combine_half()), we
        obtain a bitarray with probability  q = i / K
        r   z0 < i < %d, got i = %dr/   Úlittle©Ú	byteorderrC   )ÚKÚ
ValueErrorr   Úto_bytesÚindexÚM)rG   Úir,   r-   r-   r.   Úop_seq€   s   z_Random.op_seqc                 C   s4   |   ¡ }|D ]}|r||   ¡ O }q||   ¡ M }q|S )zm
        Combine random bitarrays with probability 1/2
        according to given operator sequence.
        )rK   )rG   Úseqr,   r=   r-   r-   r.   Úcombine_halfŽ   s   z_Random.combine_halfc           	      C   sˆ  | j }|dks||kr%|dkrt|| jƒS ||krt|| jƒS td| ƒ‚||d kr8|  || ¡}| ¡  |S |dk sE|| j d| k rHd}n|| }|dd|  t 	|¡ 8 }t
|| jd  ƒ}|dk rpt|| jƒ}| }n|  |  |¡¡}| ¡ | }tj}|dk r£t| ƒD ]}||ƒ}|| rœ||ƒ}|| s”d||< qŠ|S |dkrÂt|ƒD ]}||ƒ}|| s½||ƒ}|| rµd||< q«|S )	Nr   z&k must be in range 0 <= k <= n, got %sr/   é   r0   gš™™™™™É?gš™™™™™Ù?rC   )rE   r   r+   r   rP   r   ÚinvertrO   ÚmathÚsqrtr8   rW   rU   ÚcountrI   Ú	randrangeÚrange)	rG   r=   rE   r,   rT   rA   Údiffr]   Ú_r-   r-   r.   r   ›   sL   ÿ
ùÿ
z_Random.random_kc                    s¨  ˆ dksˆ dksˆ dkr0ˆ dkrt | j| jƒS ˆ dkr|  ¡ S ˆ dkr*t| j| jƒS tdˆ  ƒ‚| jdk rEt‡ fdd„t| jƒD ƒ| jƒS ˆ dkrV|  dˆ  ¡}| 	¡  |S ˆ | j
k re|  t | jˆ ¡¡S tˆ | j ƒ}ˆ | jd  |d kr{|d7 }|  |¡}|| j }| jd	k r©| jt|ƒd
t|ˆ kƒ  kr©t‡ fdd„t| jƒD ƒ| jƒS |  |¡}|ˆ k rÃˆ | d|  }||  |¡O }|S |ˆ krÒˆ | }||  |¡M }|S )Ng        r?   ç      ð?z*p must be in range 0.0 <= p <= 1.0, got %srX   c                 3   ó   � | ]	}t   ¡ ˆ k V  qd S rD   ©rI   ©Ú.0r`   ©rA   r-   r.   Ú	<genexpr>Ø   ó   € z#_Random.random_p.<locals>.<genexpr>rC   éd   r0   c                 3   rb   rD   rc   rd   rf   r-   r.   rg   î   rh   )r   rE   r+   rK   r   rP   r   r^   r   rY   ÚSMALL_Pr   rI   Úbinomialvariater8   rO   rU   rF   ÚlenÚboolrW   )rG   rA   r,   rT   rV   ÚqÚxr-   rf   r.   r   Ë   sH   
ÿ


(ÿ
üz_Random.random_p)r   N)r;   Ú
__module__Ú__qualname__rS   rO   rj   rH   rK   rU   rW   r   r   r-   r-   r-   r.   r6   a   s    	
	0r6   Fc              	   C   s@  t | ƒ}|dk rtdƒ‚|r+td|ƒ}d|ddd…< d|ddd…< d|ddd	…< d
}ntd|ƒ}dD ]	}d|dd|…< q2d}||t|ƒ d t|ƒ 9 }t||ƒ|dd…< ||d…= |r‚| ddt t |d ¡d ƒ¡D ]}d| d }d||| d d|…< ql|S | ddt t |¡d ƒ¡D ]}d||| dd| …< q�|S )a_  gen_primes(n, /, endian=None, odd=False) -> bitarray

Generate a bitarray of length `n` in which active indices are prime numbers.
By default (`odd=False`), active indices correspond to prime numbers directly.
When `odd=True`, only odd prime numbers are represented in the resulting
bitarray `a`, and `a[i]` corresponds to `2*i+1` being prime or not.
r   zbitarray length must be >= 0éi   rC   Nr0   r/   é   é   Ú01110110éÒ   )r/   r0   rs   rt   Ú00110101rB   ra   é   )r8   rP   r   rl   r   ÚsearchrZ   r[   )r<   r+   ÚoddrE   r,   ÚfrT   Újr-   r-   r.   r    ý   s0   


$ þr    rC   c                 C   sV  |dvr
t d| ƒ‚d}t| ƒ|krt| |ƒS |d }||d  d }|d| d  d }t| ƒ| d | }| j}d}t|ƒD ]h}	t| ƒ|	| |	d | … }
td	| j|
d
�}|rn|	|d krn|jrgt|ƒ}d|| d	…< | 	¡ }|r¨||	 }||kr~|nt|ƒ}|dkr�||| | 7 }q@||kr•|nt|dƒ}||| d|  | | 7 }q@|S )z³sum_indices(a, /, mode=1) -> int

Return sum of indices of all active bits in bitarray `a`.
Equivalent to `sum(i for i, v in enumerate(a) if v)`.
`mode=2` sums square of indices.
)rC   r/   zunexpected mode %ri   rB   rC   r/   r0   r   N)Úbuffer)
rP   rl   r	   Úpadbitsr^   Ú
memoryviewr   r+   Úreadonlyr\   )Ú__aÚmoderE   ÚmÚo1Úo2Únblocksr~   ÚsmrT   ÚvÚblockr=   ÚyÚz1Úz2r-   r-   r.   r#   &  s8   
€r#   rB   é   éP   c                 C   s’  |du rt j}t| tƒsddl}|j| |||d� dS t|ƒ}|dk r'tdƒ‚t|ƒ}|dk r3tdƒ‚t|ƒ}||krAtd| ƒ‚|| |d  }|| }|dkrW|| d }t| ƒj}t	|ƒd	 t	| ƒ t	| ƒ|  |k}	|	rsd
}
n| rxd}
nd}
| 
d||
f ¡ t| ƒD ]-\}}|	rœ|| dkrœ| 
d|d  ¡ || dkr­|| dkr­| 
d¡ | 
t|ƒ¡ q‡|	r¼| 
d¡ | 
d|
 ¡ | ¡  dS )a  pprint(bitarray, /, stream=None, group=8, indent=4, width=80)

Pretty-print bitarray object to `stream`, defaults is `sys.stdout`.
By default, bits are grouped in bytes (8 bits), and 64 bits per line.
Non-bitarray objects are printed using `pprint.pprint()`.
Nr   )ÚstreamÚindentÚwidthrC   zgroup must be >= 1zindent must be >= 0zwidth must be > %d (indent)r/   r�   z'''ú'Ú z%s(%sz
%sÚ Ú
z%s)
)r3   Ústdoutr7   r   r!   r8   rP   r:   r;   rl   ÚwriteÚ	enumerateÚstrÚflush)r�   r�   Úgroupr�   r‘   Ú_pprintÚgplÚeplÚ	type_nameÚ	multilineÚquotesrT   Úbr-   r-   r.   r!   S  sJ   

$

r!   Úrightc                 C   s„   t |tƒstdt| ƒj ƒ‚|dvrtd| ƒ‚|dkrdn|  d¡}|dkr-| dd… S |d	kr3dn| jddd
�d }| ||… S )z¸strip(bitarray, /, mode='right') -> bitarray

Return a new bitarray with zeros stripped from left, right or both ends.
Allowed values for mode are the strings: `left`, `right`, `both`
zstr expected for mode, got '%s')Úleftr£   Úbothz.mode must be 'left', 'right' or 'both', got %rr£   NrC   éÿÿÿÿr   r¤   ©r£   )r7   r™   r9   r:   r;   rP   Úfind)r�   r‚   ÚstartÚstopr-   r-   r.   r"   ‰  s   
ÿÿr"   c                 c   sŒ   � z| d }W n
 t y   Y dS w t| ƒ}d}||k rD|}z	|  | |¡}W n ty2   |}Y nw t|ƒ||fV  | }||k sdS dS )z÷intervals(bitarray, /) -> iterator

Compute all uninterrupted intervals of 1s and 0s, and return an
iterator over tuples `(value, start, stop)`.  The intervals are guaranteed
to be in order, and their size is always non-zero (`stop - start > 0`).
r   N)Ú
IndexErrorrl   rR   rP   r8   )r�   ÚvaluerE   rª   r©   r-   r-   r.   r$   �  s$   €ÿÿør$   c                 C   s–   t | tƒstdt| ƒj ƒ‚t| ƒ}|dkrtdƒ‚| jr1t| j| j	ƒ}| j	dkr-| | n||  } t
j|  ¡ | j	d�}|rI||d ? rI|d|> 8 }|S )zÓba2int(bitarray, /, signed=False) -> int

Convert the given bitarray to an integer.
The bit-endianness of the bitarray is respected.
`signed` indicates whether two's complement is used to represent the integer.
zbitarray expected, got '%s'r   znon-empty bitarray expectedrL   rM   rC   )r7   r   r9   r:   r;   rl   rP   r~   r   r+   r8   Ú
from_bytesÚtobytes)r�   ÚsignedÚlengthÚpadÚresr-   r-   r.   r%   ¶  s   
r%   c           	      C   sˆ  t | tƒstdt| ƒj ƒ‚|dur#t |tƒstdƒ‚|dkr#tdƒ‚|rT|du r-tdƒ‚d|d > }| |   kr>|k sIn td| || f ƒ‚| dk rS| d|> 7 } n|rd| |? rdtd	d|> | f ƒ‚td|ƒ}| jt	|  
¡ ƒ|jd
�}| |¡ |jdk}|du r“|r�t||rŒdƒS dƒS |d S t|ƒ|kr¨|r¡|d|… S || d… S t|ƒ|kr°|S t|t|ƒ |jƒ}|rÀ|| S || S )aÎ  int2ba(int, /, length=None, endian=None, signed=False) -> bitarray

Convert the given integer to a bitarray (with given bit-endianness,
and no leading (big-endian) / trailing (little-endian) zeros), unless
the `length` of the bitarray is provided.  An `OverflowError` is raised
if the integer is not representable with the given number of bits.
`signed` determines whether two's complement is used to represent the integer,
and requires `length` to be provided.
r2   Nz"int expected for argument 'length'r   zlength must be > 0z!signed requires argument 'length'rC   z+signed integer not in range(%d, %d), got %dz,unsigned integer not in range(0, %d), got %drM   rL   r£   r¤   Ú0)r7   r8   r9   r:   r;   rP   ÚOverflowErrorr   rQ   r   Ú
bit_lengthr+   Ú	frombytesr"   rl   r   )	Ú__ir°   r+   r¯   rƒ   r,   r¢   Úler±   r-   r-   r.   r&   Î  sD   



ÿ€
ÿ


 r&   c           	      C   s®   ddl m}m} G dd„ dtƒ}g }|  ¡ D ]\}}|ƒ }||_||_|||ƒ qt|ƒdkrS|ƒ }||ƒ||ƒf|_|jd j|jd j |_|||ƒ t|ƒdks/|d S )z„_huffman_tree(dict, /) -> Node

Given a dict mapping symbols to their frequency, construct a Huffman tree
and return its root node.
r   )ÚheappushÚheappopc                   @   s   e Zd ZdZdd„ ZdS )z_huffman_tree.<locals>.NodezË
        There are to tyes of Node instances (both have 'freq' attribute):
          * leaf node: has 'symbol' attribute
          * parent node: has 'child' attribute (tuple with both children)
        c                 S   s   | j |j k S rD   )Úfreq)rG   Úotherr-   r-   r.   Ú__lt__  s   z"_huffman_tree.<locals>.Node.__lt__N)r;   rp   rq   Ú__doc__r½   r-   r-   r-   r.   ÚNode  s    r¿   rC   )	Úheapqr¹   rº   ÚobjectÚitemsÚsymbolr»   rl   Úchild)	Ú
__freq_mapr¹   rº   r¿   ÚminheapÚsymr{   ÚleafÚparentr-   r-   r.   Ú_huffman_treeÿ  s   

ú	rÊ   c                    s‚   t | tƒstdt| ƒj ƒ‚t| ƒdk r+t| ƒdkrtdƒ‚t| ƒd }|td|ƒiS i ‰ td|ƒf‡ ‡fdd„	‰ˆt	| ƒƒ ˆ S )a:  huffman_code(dict, /, endian=None) -> dict

Given a frequency map, a dictionary mapping symbols to their frequency,
calculate the Huffman code, i.e. a dict mapping those symbols to
bitarrays (with given bit-endianness).  Note that the symbols are not limited
to being strings.  Symbols may be any hashable object.
údict expected, got '%s'r/   r   ú*cannot create Huffman code with no symbolsr³   c                    sN   z|ˆ | j < W d S  ty&   ˆ| jd |d ƒ ˆ| jd |d ƒ Y d S w )Nr   r³   rC   Ú1©rÃ   ÚAttributeErrorrÄ   )ÚndÚprefix©ÚresultÚtraverser-   r.   rÔ   ?  s   þzhuffman_code.<locals>.traverse)
r7   Údictr9   r:   r;   rl   rP   Úlistr   rÊ   )rÅ   r+   rÇ   r-   rÒ   r.   r'   &  s   
r'   c           	         s2  t | tƒstdt| ƒj ƒ‚t| ƒdk r1t| ƒdkrtdƒ‚t| ƒd }|tddƒiddg|gfS i ‰ d‡ ‡fdd	„	‰ˆt	| ƒƒ t
ˆ  ¡ d
d„ d�}|d d }i }|d dg }d}t|ƒD ].\}\}}t||dƒ||< ||  d7  < |d t|ƒk rŽ|d7 }|||d  d | K }q`||dd„ |D ƒfS )a¡  canonical_huffman(dict, /) -> tuple

Given a frequency map, a dictionary mapping symbols to their frequency,
calculate the canonical Huffman code.  Returns a tuple containing:

0. the canonical Huffman code as a dict mapping symbols to bitarrays
1. a list containing the number of symbols of each code length
2. a list of symbols in canonical order

Note: the two lists may be used as input for `canonical_decode()`.
rË   r/   r   rÌ   r³   ÚbigrC   c                    sN   z|ˆ | j < W d S  ty&   ˆ| jd |d ƒ ˆ| jd |d ƒ Y d S w )Nr   rC   rÎ   )rÐ   r°   ©Úcode_lengthrÔ   r-   r.   rÔ   b  s   þz#canonical_huffman.<locals>.traversec                 S   s   | d S )NrC   r-   )Úitemr-   r-   r.   Ú<lambda>p  s    z#canonical_huffman.<locals>.<lambda>)Úkeyr¦   c                 S   s   g | ]}|d  ‘qS ©r   r-   )re   rÚ   r-   r-   r.   Ú
<listcomp>~  s    z%canonical_huffman.<locals>.<listcomp>NrÝ   )r7   rÕ   r9   r:   r;   rl   rP   rÖ   r   rÊ   ÚsortedrÂ   r˜   r&   )	rÅ   rÇ   ÚtableÚmaxbitsÚcodedictr\   ÚcoderT   r°   r-   rØ   r.   r(   J  s.   
	€r(   rD   )r?   N)NF)rC   )NrB   r�   rŽ   r§   )F)NNF)1r¾   Ú
__future__r   r)   r3   rZ   rI   r   r   Úbitarray._utilr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__all__r   r   r   r6   r    r#   r!   r"   r$   r%   r&   rÊ   r'   r(   r-   r-   r-   r.   Ú<module>   s0   h



 

)
-
6

1
'$