U
    9%eT                     @  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/Darija-Ai-API/env/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                   sD  t  |r$|ddr$tdn|r8t |}||d< |di } fdd}|| t | D ]D\}}|kr||= qh D ]"}	j|	 }
||
jkr||=  qhqqh||  D ]b}	j|	 }
|
j	D ]"}|d krtd|	|f q|
jD ]"}|d k	rtd|	|f qq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   popr8   keysr0   r   r   	__order__r   )r,   r4   r1   r;   r<   r5   r=   keyr)   r   r   Zrequire_optionZexclude_optionr   r:   r   r3   ~   s<    






zOptions.__init__c                 C  s   | j dkrg t  }}| j D ]F\}}|| |jD ]}|||f q8|jD ]}|||f qRq zt|t	|f| _ W n t
k
r   tdY nX dS )z*Resolve the order of options' processing. Nz/cycle detected in sympy.polys options framework)rB   setr0   r8   appendr   addr   r
   list
ValueErrorRuntimeError)r   Zverticesedgesnamer   _namer   r   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)   rO   r   r   rS      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   rV   )r,   r;   r   r   r   r   r   r;      s
    
zOptions.flags)NF)r   r    r!   r"   rB   r0   r#   r3   r%   rM   rQ   rS   r.   r1   r   r;   __classcell__r   r   rU   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   rY      s   
rY   )	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.0genr   r   r   	<genexpr>#  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   r]     s   

r]   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)rc   r   re   stripendswithr   rG   	_re_splitsplithasattrmap)r   rj   r   r   r   r   3  s    




zWrt.preprocessN)r   r    r!   r"   r   r   r#   r   recompilero   r%   r   r   r   r   r   ri   )  s   

ri   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   L  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   )rm   r_   r   r   r   
<listcomp>S  s     z#Sort.preprocess.<locals>.<listcomp>>rl   z"invalid argument for 'sort' option)rc   re   rp   rq   rG   rr   r   )r   rv   r   r   r   r   P  s
    

zSort.preprocessNrh   r   r   r   r   ru   D  s   

ru   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   b  s    zOrder.defaultc                 C  s   t jj|S r   )r{   r|   r}   Zmonomial_key)r   rz   r   r   r   r   f  s    zOrder.preprocessNrh   r   r   r   r   ry   Z  s   

ry   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   domainrp   gaussianNr   r    r!   r"   r   r   r#   r   r   r   r   r   r   k  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   rp   r   	extensionmodulus	symmetricNr   r   r   r   r   r   t  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   rp   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   rp   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rtjjjS | j|}|d k	r| \}}}|d krt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rtjjjj| S |dkrtjjj	j| S |d	krtjjjj| S |dkrt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	rt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EXr^   rk   )RRRz-expected a valid domain specification, got %s)#rc   r{   r|   domainsr   rq   r   re   r   r   r   r   r   _re_realfieldmatchgroupsr   Z	RealFieldint_re_complexfieldCCZComplexField_re_finitefieldFF_re_polynomialrG   rr   r   rp   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_CompositerD   symbolsr   r{   r|   r   r   r   r   r   r   r     s    zDomain.postprocessN)r   r    r!   r"   r   r   r#   r   r   rs   rt   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. rp   r   r   r   r   r   r   r   r   r   c                 C  s   d|krt dd S )Nrp   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   rp   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   rp   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 )Nr^   r   z.'False' is an invalid argument for 'extension'__iter__)r(   r   rq   rD   )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   6  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   rp   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   E  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   O  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   rp   r   r   N)r   r    r!   r"   r   r   r   r   r   r   r   r   W  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   e  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   q  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   u  s    zAuto.postprocessN)	r   r    r!   r"   r   r   r%   r   r   r   r   r   r   r   j  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   {  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. ra   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)rc   r   r   r   )r   ra   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sr^   )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)rq   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)rc   re   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   r^   opt)rd   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)rD   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{   rs   r   r&   r'   typer*   r>   r   rY   r]   ri   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   r   r   r   r   <module>   sX    5		s!	






