U
    ZÊ¹j¦T  ã                   @  sè  d Z ddlmZ dgZddlmZmZ ddlmZm	Z	m
Z
 ddlmZmZmZ ddlmZmZ ddlZddlZG d	d
„ d
ƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZeG dd„ deƒƒZG dd„ deed�ZG dd„ deed�ZG dd„ deed�ZG dd„ deed�ZG dd„ deed�Z G dd„ deed�Z!G dd „ d eed�Z"G d!d"„ d"eed�Z#G d#d$„ d$eed�Z$G d%d&„ d&eed�Z%G d'd(„ d(eed�Z&G d)d*„ d*eed�Z'G d+d,„ d,eed�Z(G d-d.„ d.eed�Z)G d/d0„ d0eed�Z*G d1d2„ d2eeed�Z+G d3d4„ d4eeed�Z,G d5d6„ d6eeed�Z-G d7d8„ d8eeed�Z.G d9d:„ d:eeed�Z/G d;d<„ d<eeed�Z0G d=d>„ d>eed�Z1G d?d@„ d@eeed�Z2G dAdB„ dBeed�Z3G dCdD„ dDeed�Z4dKdEdF„Z5dGdH„ Z6dIdJ„ Z7e 8¡  dS )Lz>Options manager for :class:`~.Poly` and public API functions. é    )ÚannotationsÚOptions)ÚBasicÚsympify)ÚGeneratorsErrorÚOptionErrorÚ	FlagError)Únumbered_symbolsÚtopological_sortÚpublic)Úhas_dupsÚis_sequenceNc                   @  sv   e Zd ZU dZdZded< dZg Zded< g Zded< g Z	ded	< g Z
ded
< edd„ ƒZedd„ ƒZedd„ ƒZdS )ÚOptionz%Base class for all kinds of options. Nz
str | NoneÚoptionFú	list[str]ÚrequiresÚexcludesÚafterÚbeforec                 C  s   d S ©N© ©Úclsr   r   úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/polys/polyoptions.pyÚdefault   s    zOption.defaultc                 C  s   d S r   r   )r   r   r   r   r   Ú
preprocess!   s    zOption.preprocessc                 C  s   d S r   r   ©r   Úoptionsr   r   r   Úpostprocess%   s    zOption.postprocess)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__Úis_Flagr   r   r   r   Úclassmethodr   r   r   r   r   r   r   r      s   


r   c                   @  s   e Zd ZdZdZdS )ÚFlagz#Base class for all kinds of flags. TN)r   r    r!   r"   r$   r   r   r   r   r&   *   s   r&   c                   @  s   e Zd ZdZedd„ ƒZdS )ÚBooleanOptionzAAn option that must have a boolean value or equivalent assigned. c                 C  s&   |dkrt |ƒS td| j|f ƒ‚d S )N)TFz/'%s' must have a boolean value assigned, got %s)Úboolr   r   )r   Úvaluer   r   r   r   3   s    zBooleanOption.preprocessN)r   r    r!   r"   r%   r   r   r   r   r   r'   0   s   r'   c                   @  s   e Zd ZdZdd„ ZdS )Ú
OptionTypez7Base type for all options that does registers options. c                   s.   t ‡ fdd„ƒ}ttˆ j|ƒ ˆ tjˆ j< d S )Nc                   s.   z| ˆ j  W S  tk
r(   ˆ  ¡  Y S X d S r   )r   ÚKeyErrorr   )Úselfr   r   r   Úgetter?   s    z#OptionType.__init__.<locals>.getter)ÚpropertyÚsetattrr   r   Ú__options__)r   ÚargsÚkwargsr-   r   r   r   Ú__init__>   s    zOptionType.__init__N)r   r    r!   r"   r3   r   r   r   r   r*   ;   s   r*   c                      sx   e Zd ZU dZdZi Zded< ddd„Zedd	„ ƒZ	i fd
d„Z
‡ fdd„Zedd„ ƒZedd„ ƒZedd„ ƒZ‡  ZS )r   aB  
    Options manager for polynomial manipulation module.

    Examples
    ========

    >>> from sympy.polys.polyoptions import Options
    >>> from sympy.polys.polyoptions import build_options

    >>> from sympy.abc import x, y, z

    >>> Options((x, y, z), {'domain': 'ZZ'})
    {'auto': False, 'domain': ZZ, 'gens': (x, y, z)}

    >>> build_options((x, y, z), {'domain': 'ZZ'})
    {'auto': False, 'domain': ZZ, 'gens': (x, y, z)}

    **Options**

    * Expand --- boolean option
    * Gens --- option
    * Wrt --- option
    * Sort --- option
    * Order --- option
    * Field --- boolean option
    * Greedy --- boolean option
    * Domain --- option
    * Split --- boolean option
    * Gaussian --- boolean option
    * Extension --- option
    * Modulus --- option
    * Symmetric --- boolean option
    * Strict --- boolean option

    **Flags**

    * Auto --- boolean flag
    * Frac --- boolean flag
    * Formal --- boolean flag
    * Polys --- boolean flag
    * Include --- boolean flag
    * All --- boolean flag
    * Gen --- flag
    * Series --- boolean flag

    Nzdict[str, type[Option]]r0   Fc                   s<  t  ˆ¡ |r$| dd¡r$tdƒ‚n|r8t |ƒ}||d< | di ¡}‡ ‡‡fdd„}||ƒ t |ƒD ]@}|ˆkrx||= qdˆ ¡ D ]"}ˆj| }	||	jkr€||=  qdq€qd||ƒ ˆ ¡ D ]b}ˆj| }	|	jD ]"}
ˆ |
¡d krÊtd||
f ƒ‚qÊ|	jD ]"}ˆ |¡d k	rôtd||f ƒ‚qôq¶ˆj	D ]}ˆj|  
ˆ¡ �q d S )	NÚgensr   z1both '*gens' and keyword argument 'gens' suppliedÚdefaultsc              	     s†   |   ¡ D ]x\}}zˆj| }W n  tk
r>   td| ƒ‚Y nX t|tƒrjˆ d ksZ|ˆ krjˆrjtd| ƒ‚|d k	r| |¡ˆ|< qd S )Nú'%s' is not a valid optionú('%s' flag is not allowed in this context)Úitemsr0   r+   r   Ú
issubclassr&   r   )r1   r   r)   r   ©Úflagsr,   Ústrictr   r   Úpreprocess_optionsŠ   s    
z,Options.__init__.<locals>.preprocess_optionsz.'%s' option is only allowed together with '%s'z-'%s' option is not allowed together with '%s')Údictr3   Úgetr   ÚpopÚkeysr0   r   r   Ú	__order__r   )r,   r4   r1   r;   r<   r5   r=   Úkeyr   r   Zrequire_optionZexclude_optionr   r:   r   r3   ~   s<    
ÿ





zOptions.__init__c                   s    | j dkrœg tƒ  }}| j ¡ D ]F\‰ }| ˆ ¡ | ‡ fdd„|jD ƒ¡ | ‡ fdd„|jD ƒ¡ q zt|t	|ƒfƒ| _ W n t
k
rš   tdƒ‚Y nX dS )z*Resolve the order of options' processing. Nc                 3  s   | ]}|ˆ fV  qd S r   r   ©Ú.0Ú_name©Únamer   r   Ú	<genexpr>¿   s     z3Options._init_dependencies_order.<locals>.<genexpr>c                 3  s   | ]}ˆ |fV  qd S r   r   rD   rG   r   r   rI   Á   s     z/cycle detected in sympy.polys options framework)rB   Úsetr0   r8   ÚappendÚupdater   r   r
   ÚlistÚ
ValueErrorÚRuntimeError)r   ZverticesÚedgesr   r   rG   r   Ú_init_dependencies_order¶   s    

ÿz Options._init_dependencies_orderc                 C  sD   t  | j¡}|  ¡ D ]\}}|||< q| ¡ D ]\}}|||< q.|S )z-Clone ``self`` and update specified options. )r>   Ú__new__Ú	__class__r8   )r,   ZupdatesÚobjr   r)   r   r   r   ÚcloneÉ   s    

zOptions.clonec                   s&   || j kr|| |< ntƒ  ||¡ d S r   )r0   ÚsuperÚ__setattr__)r,   Úattrr)   ©rS   r   r   rW   Õ   s    

zOptions.__setattr__c                 C  sF   i }|   ¡ D ]4\}}|d k	r|dkr| j| }t|tƒs|||< q|S )Nr4   )r8   r0   r9   r&   )r,   r1   r   r)   r   r   r   r   r1   Û   s    


zOptions.argsc                 C  s4   i }| j  ¡ D ] \}}t|tƒst| |ƒ||< q|S r   ©r0   r8   r9   r&   Úgetattr)r,   r   r   r   r   r   r   r   è   s
    
zOptions.optionsc                 C  s4   i }| j  ¡ D ] \}}t|tƒrt| |ƒ||< q|S r   rZ   )r,   r;   r   r   r   r   r   r;   ò   s
    
zOptions.flags)NF)r   r    r!   r"   rB   r0   r#   r3   r%   rQ   rU   rW   r.   r1   r   r;   Ú__classcell__r   r   rY   r   r   J   s   
/
8


	c                   @  s:   e Zd ZU dZdZg Zded< g Zded< edd„ ƒZ	dS )	ÚExpandz8``expand`` option to polynomial manipulation functions. Úexpandr   r   r   c                 C  s   dS ©NTr   r   r   r   r   r     s    zExpand.defaultN)
r   r    r!   r"   r   r   r#   r   r%   r   r   r   r   r   r]   ý   s   
r]   )Ú	metaclassc                   @  sF   e Zd ZU dZdZg Zded< g Zded< edd„ ƒZ	edd	„ ƒZ
d
S )ÚGensz6``gens`` option to polynomial manipulation functions. r4   r   r   r   c                 C  s   dS )Nr   r   r   r   r   r   r     s    zGens.defaultc                 C  s„   t |tƒr|f}n t|ƒdkr2t|d ƒr2|d }|dkr@d}n<t|ƒrZtdt|ƒ ƒ‚n"tdd„ |D ƒƒr|tdt|ƒ ƒ‚t|ƒS )	Né   r   r   r   zduplicated generators: %sc                 s  s   | ]}|j d kV  qdS )FN)Zis_commutative©rE   Úgenr   r   r   rI   !  s     z"Gens.preprocess.<locals>.<genexpr>znon-commutative generators: %s)	Ú
isinstancer   Úlenr   r   r   ÚstrÚanyÚtuple)r   r4   r   r   r   r     s    
zGens.preprocessN©r   r    r!   r"   r   r   r#   r   r%   r   r   r   r   r   r   ra   
  s   

ra   c                   @  sD   e Zd ZU dZdZg Zded< g Zded< e 	d¡Z
edd„ ƒZd	S )
ÚWrtz5``wrt`` option to polynomial manipulation functions. Úwrtr   r   r   z\s*,\s*|\s+c                 C  st   t |tƒrt|ƒgS t |tƒrP| ¡ }| d¡r8tdƒ‚|s@g S t| j |¡ƒS t	|dƒrhtt
t|ƒƒS tdƒ‚d S )Nú,zBad input: missing parameter.Ú__getitem__z!invalid argument for 'wrt' option)re   r   rg   ÚstripÚendswithr   rM   Ú	_re_splitÚsplitÚhasattrÚmap)r   rl   r   r   r   r   1  s    




zWrt.preprocessN)r   r    r!   r"   r   r   r#   r   ÚreÚcompilerq   r%   r   r   r   r   r   rk   '  s   

rk   c                   @  sF   e Zd ZU dZdZg Zded< g Zded< edd„ ƒZ	edd	„ ƒZ
d
S )ÚSortz6``sort`` option to polynomial manipulation functions. Úsortr   r   r   c                 C  s   g S r   r   r   r   r   r   r   J  s    zSort.defaultc                 C  sB   t |tƒrdd„ | d¡D ƒS t|dƒr6ttt|ƒƒS tdƒ‚d S )Nc                 S  s   g | ]}|  ¡ ‘qS r   )ro   rc   r   r   r   Ú
<listcomp>Q  s     z#Sort.preprocess.<locals>.<listcomp>ú>rn   z"invalid argument for 'sort' option)re   rg   rr   rs   rM   rt   r   )r   rx   r   r   r   r   N  s
    

zSort.preprocessNrj   r   r   r   r   rw   B  s   

rw   c                   @  sF   e Zd ZU dZdZg Zded< g Zded< edd„ ƒZ	edd	„ ƒZ
d
S )ÚOrderz7``order`` option to polynomial manipulation functions. Úorderr   r   r   c                 C  s
   t jjjS r   )ÚsympyÚpolysÚ	orderingsÚlexr   r   r   r   r   `  s    zOrder.defaultc                 C  s   t jj |¡S r   )r}   r~   r   Zmonomial_key)r   r|   r   r   r   r   d  s    zOrder.preprocessNrj   r   r   r   r   r{   X  s   

r{   c                   @  s,   e Zd ZU dZdZg Zded< dddgZdS )	ÚFieldz7``field`` option to polynomial manipulation functions. Úfieldr   r   Údomainrr   ÚgaussianN©r   r    r!   r"   r   r   r#   r   r   r   r   r   r�   i  s   
r�   c                   @  s2   e Zd ZU dZdZg Zded< ddddd	d
gZdS )ÚGreedyz8``greedy`` option to polynomial manipulation functions. Úgreedyr   r   rƒ   rr   r„   Ú	extensionÚmodulusÚ	symmetricNr…   r   r   r   r   r†   r  s   
r†   c                   @  s>   e Zd ZU dZdZedd„ ƒZg Zded< ddd	d
ddgZ	dS )Ú	Compositez;``composite`` option to polynomial manipulation functions. Z	compositec                 C  s   d S r   r   r   r   r   r   r   €  s    zComposite.defaultr   r   rƒ   rr   r„   rˆ   r‰   rŠ   N)
r   r    r!   r"   r   r%   r   r   r#   r   r   r   r   r   r‹   {  s   

r‹   c                   @  sŠ   e Zd ZU dZdZg Zded< ddddd	gZd
gZe	 
d¡Ze	 
d¡Ze	 
d¡Ze	 
d¡Ze	 
d¡Ze	 
d¡Zedd„ ƒZedd„ ƒZdS )ÚDomainz8``domain`` option to polynomial manipulation functions. rƒ   r   r   r‚   r‡   rr   r„   rˆ   r4   z^(R|RR)(_(\d+))?$z^(C|CC)(_(\d+))?$z^(FF|GF)\((\d+)\)$z)^(Z|ZZ|Q|QQ|ZZ_I|QQ_I|R|RR|C|CC)\[(.+)\]$z^(Z|ZZ|Q|QQ)\((.+)\)$z^(Q|QQ)\<(.+)\>$c                 C  sÆ  t |tjjjƒr|S t|dƒr&| ¡ S t |tƒ�r¶|dkrDtjjjS |dkrVtjjj	S |dkrhtjjj
S |dkrztjjjS |dkrŒtjjjS | j |¡}|d k	rÒ| ¡ \}}}|d krÀtjjjS tjj t|ƒ¡S | j |¡}|d k	�r| ¡ \}}}|d k�r
tjjjS tjj t|ƒ¡S | j |¡}|d k	�rLtjj t| ¡ d ƒ¡S | j |¡}|d k	�r| ¡ \}}ttt| d¡ƒƒ}|dk�rœtjjjj|Ž S |dk�r¶tjjj	j|Ž S |d	k�rÐtjjjj|Ž S |dk�rêtjjj
j|Ž S |dk�rtjjjj|Ž S tjjjj|Ž S | j |¡}|d k	�rt| ¡ \}}ttt| d¡ƒƒ}|dk�rdtjjjj|Ž S tjjj	j|Ž S | j  |¡}|d k	�r¶ttt| ¡ d  d¡ƒƒ}tjjj	j!|Ž S t"d
| ƒ‚d S )NÚ	to_domain)ÚZÚZZ)ÚQÚQQÚZZ_IÚQQ_IÚEXrb   rm   )ÚRÚRRz-expected a valid domain specification, got %s)#re   r}   r~   ÚdomainsrŒ   rs   r�   rg   r�   r‘   r’   r“   r”   Ú_re_realfieldÚmatchÚgroupsr–   Z	RealFieldÚintÚ_re_complexfieldÚCCZComplexFieldÚ_re_finitefieldÚFFÚ_re_polynomialrM   rt   r   rr   Z	poly_ringÚ_re_fractionZ
frac_fieldÚ_re_algebraicÚalgebraic_fieldr   )r   rƒ   ÚrÚ_ÚprecZgroundr4   r   r   r   r   ™  sr    



















zDomain.preprocessc                 C  st   d|kr>d|kr>|d j r>t|d jƒt|d ƒ@ r>tdƒ‚n2d|ksN|d spd|krp|d tjjjkrptdƒ‚d S )Nr4   rƒ   z/ground domain and generators interfere togetherz>you have to provide generators because EX domain was requested)Zis_CompositerJ   Úsymbolsr   r}   r~   r—   r”   r   r   r   r   r   ð  s    ÿÿÿÿzDomain.postprocessN)r   r    r!   r"   r   r   r#   r   r   ru   rv   r˜   rœ   rž   r    r¡   r¢   r%   r   r   r   r   r   r   rŒ   ˆ  s   







VrŒ   c                   @  s@   e Zd ZU dZdZg Zded< ddddd	d
dgZedd„ ƒZ	dS )ÚSplitz7``split`` option to polynomial manipulation functions. rr   r   r   r‚   r‡   rƒ   r„   rˆ   r‰   rŠ   c                 C  s   d|krt dƒ‚d S )Nrr   z%'split' option is not implemented yet)ÚNotImplementedErrorr   r   r   r   r     s    zSplit.postprocessN©
r   r    r!   r"   r   r   r#   r   r%   r   r   r   r   r   r¨   û  s   

 ÿr¨   c                   @  s@   e Zd ZU dZdZg Zded< ddddd	d
dgZedd„ ƒZ	dS )ÚGaussianz:``gaussian`` option to polynomial manipulation functions. r„   r   r   r‚   r‡   rƒ   rr   rˆ   r‰   rŠ   c                 C  s0   d|kr,|d dkr,t jjj|d< t |¡ d S )Nr„   Trƒ   )r}   r~   r—   r“   Ú	Extensionr   r   r   r   r   r     s    zGaussian.postprocessNrª   r   r   r   r   r«   
  s   

 ÿr«   c                   @  sJ   e Zd ZU dZdZg Zded< ddddd	d
gZedd„ ƒZ	edd„ ƒZ
dS )r¬   z;``extension`` option to polynomial manipulation functions. rˆ   r   r   r‡   rƒ   rr   r„   r‰   rŠ   c                 C  sN   |dkrt |ƒS |dkr"tdƒ‚n(t|dƒs4|h}n|s>d }nt|ƒ}|S d S )Nrb   r   z.'False' is an invalid argument for 'extension'Ú__iter__)r(   r   rs   rJ   )r   rˆ   r   r   r   r   #  s    

zExtension.preprocessc                 C  s0   d|kr,|d dk	r,t jjjj|d Ž |d< d S )Nrˆ   Trƒ   )r}   r~   r—   r‘   r£   r   r   r   r   r   4  s    
ÿzExtension.postprocessN©r   r    r!   r"   r   r   r#   r   r%   r   r   r   r   r   r   r¬     s   

ÿ
r¬   c                   @  sH   e Zd ZU dZdZg Zded< ddddd	gZed
d„ ƒZ	edd„ ƒZ
dS )ÚModulusz9``modulus`` option to polynomial manipulation functions. r‰   r   r   r‡   rr   rƒ   r„   rˆ   c                 C  s.   t |ƒ}|jr|dkrt|ƒS td| ƒ‚d S )Nr   z)'modulus' must a positive integer, got %s)r   Z
is_Integerr›   r   )r   r‰   r   r   r   r   C  s    ÿzModulus.preprocessc                 C  s4   d|kr0|d }|  dd¡}tjj ||¡|d< d S )Nr‰   rŠ   Trƒ   )r?   r}   r~   r—   rŸ   )r   r   r‰   rŠ   r   r   r   r   M  s    zModulus.postprocessNr®   r   r   r   r   r¯   ;  s   

	r¯   c                   @  s(   e Zd ZdZdZdgZdddddgZd	S )
Ú	Symmetricz;``symmetric`` option to polynomial manipulation functions. rŠ   r‰   r‡   rƒ   rr   r„   rˆ   N)r   r    r!   r"   r   r   r   r   r   r   r   r°   U  s   r°   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚStrictz8``strict`` option to polynomial manipulation functions. r<   c                 C  s   dS r_   r   r   r   r   r   r   c  s    zStrict.defaultN©r   r    r!   r"   r   r%   r   r   r   r   r   r±   ^  s   r±   c                   @  s8   e Zd ZdZdZddddgZedd„ ƒZed	d
„ ƒZdS )ÚAutoz4``auto`` flag to polynomial manipulation functions. Úautor‚   rƒ   rˆ   r„   c                 C  s   dS r_   r   r   r   r   r   r   o  s    zAuto.defaultc                 C  s$   d|ksd|kr d|kr d|d< d S )Nrƒ   r‚   r´   Fr   r   r   r   r   r   s  s    zAuto.postprocessN)	r   r    r!   r"   r   r   r%   r   r   r   r   r   r   r³   h  s   
r³   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚFracz6``auto`` option to polynomial manipulation functions. Úfracc                 C  s   dS ©NFr   r   r   r   r   r   ~  s    zFrac.defaultNr²   r   r   r   r   rµ   y  s   rµ   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚFormalz6``formal`` flag to polynomial manipulation functions. Zformalc                 C  s   dS r·   r   r   r   r   r   r   ˆ  s    zFormal.defaultNr²   r   r   r   r   r¸   ƒ  s   r¸   c                   @  s   e Zd ZdZdZdS )ÚPolysz5``polys`` flag to polynomial manipulation functions. r~   N)r   r    r!   r"   r   r   r   r   r   r¹   �  s   r¹   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚIncludez7``include`` flag to polynomial manipulation functions. Úincludec                 C  s   dS r·   r   r   r   r   r   r   ˜  s    zInclude.defaultNr²   r   r   r   r   rº   “  s   rº   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚAllz3``all`` flag to polynomial manipulation functions. Úallc                 C  s   dS r·   r   r   r   r   r   r   ¢  s    zAll.defaultNr²   r   r   r   r   r¼   �  s   r¼   c                   @  s,   e Zd ZdZdZedd„ ƒZedd„ ƒZdS )ÚGenz3``gen`` flag to polynomial manipulation functions. rd   c                 C  s   dS )Nr   r   r   r   r   r   r   ¬  s    zGen.defaultc                 C  s   t |ttfƒr|S tdƒ‚d S )Nz!invalid argument for 'gen' option)re   r   r›   r   )r   rd   r   r   r   r   °  s    zGen.preprocessN©r   r    r!   r"   r   r%   r   r   r   r   r   r   r¾   §  s   
r¾   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚSeriesz6``series`` flag to polynomial manipulation functions. Zseriesc                 C  s   dS r·   r   r   r   r   r   r   ½  s    zSeries.defaultNr²   r   r   r   r   rÀ   ¸  s   rÀ   c                   @  s,   e Zd ZdZdZedd„ ƒZedd„ ƒZdS )ÚSymbolsz7``symbols`` flag to polynomial manipulation functions. r§   c                 C  s   t ddd�S )NÚsrb   )Ústart)r	   r   r   r   r   r   Ç  s    zSymbols.defaultc                 C  s"   t |dƒrt|ƒS td| ƒ‚d S )Nr­   z2expected an iterator or iterable container, got %s)rs   Úiterr   )r   r§   r   r   r   r   Ë  s    
zSymbols.preprocessNr¿   r   r   r   r   rÁ   Â  s   
rÁ   c                   @  s    e Zd ZdZdZedd„ ƒZdS )ÚMethodz6``method`` flag to polynomial manipulation functions. Úmethodc                 C  s"   t |tƒr| ¡ S td| ƒ‚d S )Nzexpected a string, got %s)re   rg   Úlowerr   )r   rÆ   r   r   r   r   Ø  s    
zMethod.preprocessN)r   r    r!   r"   r   r%   r   r   r   r   r   rÅ   Ó  s   rÅ   c                 C  s@   |dkrd|  } }t |ƒdks*d|ks*| r4t| |ƒS |d S dS )z9Construct options from keyword arguments or ... options. Nr   rb   Úopt)rf   r   )r4   r1   r   r   r   Úbuild_optionsà  s
    

rÉ   c              	   C  s`   t |ƒ}|  ¡ D ]J}z$tj| jr6||kr6td| ƒ‚W q tk
rX   td| ƒ‚Y qX qdS )aÎ  
    Allow specified flags to be used in the given context.

    Examples
    ========

    >>> from sympy.polys.polyoptions import allowed_flags
    >>> from sympy.polys.domains import ZZ

    >>> allowed_flags({'domain': ZZ}, [])

    >>> allowed_flags({'domain': ZZ, 'frac': True}, [])
    Traceback (most recent call last):
    ...
    FlagError: 'frac' flag is not allowed in this context

    >>> allowed_flags({'domain': ZZ, 'frac': True}, ['frac'])

    r7   r6   N)rJ   rA   r   r0   r$   r   r+   r   )r1   r;   Úargr   r   r   Úallowed_flagsë  s    ÿrË   c                 K  s   d| krt | ƒ} || d< | S )z$Update options with default values. r5   )r>   )r   r5   r   r   r   Úset_defaults
  s    rÌ   )N)9r"   Ú
__future__r   Ú__all__Z
sympy.corer   r   Zsympy.polys.polyerrorsr   r   r   Zsympy.utilitiesr	   r
   r   Zsympy.utilities.iterablesr   r   Zsympy.polysr}   ru   r   r&   r'   Útyper*   r>   r   r]   ra   rk   rw   r{   r�   r†   r‹   rŒ   r¨   r«   r¬   r¯   r°   r±   r³   rµ   r¸   r¹   rº   r¼   r¾   rÀ   rÁ   rÅ   rÉ   rË   rÌ   rQ   r   r   r   r   Ú<module>   sX    3		s!	






