B
    [hR                 @   s0  d Z ddlmZmZ dgZddlmZmZmZ ddl	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 dd	lZdd	lZG d
d de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eZ!G dd deeeZ"G dd deeeZ#G dd deeeZ$G dd deeeZ%G dd deeeZ&G dd  d eeeZ'G d!d" d"eeeZ(G d#d$ d$eeeZ)G d%d& d&eeeZ*G d'd( d(eeeZ+G d)d* d*eeeZ,G d+d, d,eeeZ-G d-d. d.eeeZ.G d/d0 d0eeeZ/G d1d2 d2eeeeZ0G d3d4 d4eeeeZ1G d5d6 d6eeeeZ2G d7d8 d8eeeeZ3G d9d: d:eeeeZ4G d;d< d<eeeeZ5G d=d> d>eeeZ6G d?d@ d@eeeeZ7G dAdB dBeeeZ8G dCdD dDeeeZ9dKdEdFZ:dGdH Z;dIdJ Z<e =  d	S )Lz<Options manager for :class:`Poly` and public API functions.     )print_functiondivisionOptions)SBasicsympify)string_typeswith_metaclass)numbered_symbolstopological_sortpublic)has_dups)GeneratorsErrorOptionError	FlagErrorNc               @   sL   e Zd ZdZdZdZg Zg Zg Zg Z	e
dd Ze
dd Ze
dd	 ZdS )
Optionz%Base class for all kinds of options. NFc             C   s   d S )N )clsr   r   6lib/python3.7/site-packages/sympy/polys/polyoptions.pydefault   s    zOption.defaultc             C   s   d S )Nr   )r   optionr   r   r   
preprocess"   s    zOption.preprocessc             C   s   d S )Nr   )r   optionsr   r   r   postprocess&   s    zOption.postprocess)__name__
__module____qualname____doc__r   is_Flagrequiresexcludesafterbefore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   4   s    zBooleanOption.preprocessN)r   r   r   r   r#   r   r   r   r   r   r%   1   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(   y
|  j  S  tk
r"     S X d S )N)r   KeyErrorr   )self)r   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   r1   r   r   r   r   r(   <   s   r(   c                   sn   e Zd ZdZdZi Z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

    NFc                s^  t  |r$|ddr$tdn|r8t |}||d< |di } fdd}|| xVt | D ]F\}}|kr||= qjx, D ] }	j|	 }
||
jkr||= P qW qjW || xz D ]n}	j|	 }
x,|
j	D ]"}|d krtd|	|f qW x0|
jD ]&}|d k	r
td|	|f q
W qW x j
D ]}	j|	  q@W d S )	Ngensr   z1both '*gens' and keyword argument 'gens' supplieddefaultsc          	      s   x|   D ]x\}}yj| }W n  tk
r@   td| Y nX t|trl d ks\| krlrltd| |d k	r
|||< q
W d S )Nz'%s' is not a valid optionz('%s' flag is not allowed in this context)itemsr.   r)   r   
issubclassr$   r   )r/   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')dictr1   getr   popr4   keysr.   r    r   	__order__r   )r*   r2   r/   r6   r7   r3   r8   keyr'   r   r   Zrequire_optionZexclude_optionr   )r6   r*   r7   r   r1      s:    




zOptions.__init__c             C   s   | j dkrg tg  }}x\| j D ]N\}}|| x|jD ]}|||f q>W x|jD ]}|||f q\W q$W y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)r=   setr.   r4   appendr!   addr"   r   list
ValueErrorRuntimeError)r   ZverticesZedgesnamer   _namer   r   r   _init_dependencies_order   s    

z Options._init_dependencies_orderc             C   sL   t | j}x|  D ]\}}|||< qW x| D ]\}}|||< q4W |S )z-Clone ``self`` and update specified options. )r9   __new__	__class__r4   )r*   Zupdatesobjr   r'   r   r   r   clone   s    zOptions.clonec                s*   || j kr|| |< ntt| || d S )N)r.   superr   __setattr__)r*   attrr'   )rI   r   r   rM      s    

zOptions.__setattr__c             C   sJ   i }x@|   D ]4\}}|d k	r|dkr| j| }t|ts|||< qW |S )Nr2   )r4   r.   r5   r$   )r*   r/   r   r'   r   r   r   r   r/      s    

zOptions.argsc             C   s8   i }x.| j  D ] \}}t|tst| |||< qW |S )N)r.   r4   r5   r$   getattr)r*   r   r   r   r   r   r   r      s
    
zOptions.optionsc             C   s8   i }x.| j  D ] \}}t|trt| |||< qW |S )N)r.   r4   r5   r$   rO   )r*   r6   r   r   r   r   r   r6      s
    
zOptions.flags)NF)r   r   r   r   r=   r.   r1   r#   rG   rK   rM   r,   r/   r   r6   __classcell__r   r   )rI   r   r   K   s   /
8
c               @   s(   e Zd ZdZdZg Zg Zedd ZdS )Expandz8``expand`` option to polynomial manipulation functions. expandc             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   rQ      s
   rQ   c               @   s4   e Zd ZdZdZg Zg Zedd Zedd Z	dS )Gensz6``gens`` option to polynomial manipulation functions. r2   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r4t|d dr4|d }|dkrBd}n<t|r\tdt| n"tdd |D r~td	t| t|S )
N   r   __iter__)Nr   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   lenhasattrr   r   stranytuple)r   r2   r   r   r   r     s    
zGens.preprocessN)
r   r   r   r   r   r   r    r#   r   r   r   r   r   r   rS     s   rS   c               @   s2   e Zd ZdZdZg Zg ZedZ	e
dd ZdS )Wrtz5``wrt`` option to polynomial manipulation functions. wrtz\s*,\s*|\s+c             C   sz   t |trt|gS t |trV| }|dr8td|s@g S dd | j|D S t|drnt	t
t|S tdd S )N,zBad input: missing parameter.c             S   s   g | ]}|qS r   r   )rV   rW   r   r   r   
<listcomp>>  s    z"Wrt.preprocess.<locals>.<listcomp>__getitem__z!invalid argument for 'wrt' option)rY   r   r\   stripendswithr   	_re_splitsplitr[   rB   map)r   r`   r   r   r   r   4  s    




zWrt.preprocessN)r   r   r   r   r   r   r    recompilerf   r#   r   r   r   r   r   r_   *  s   
r_   c               @   s4   e Zd ZdZdZg Zg Zedd Zedd Z	dS )Sortz6``sort`` option to polynomial manipulation functions. sortc             C   s   g S )Nr   )r   r   r   r   r   M  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   )rd   )rV   rW   r   r   r   rb   T  s    z#Sort.preprocess.<locals>.<listcomp>>rc   z"invalid argument for 'sort' option)rY   r\   rg   r[   rB   rh   r   )r   rl   r   r   r   r   Q  s
    

zSort.preprocessN)
r   r   r   r   r   r   r    r#   r   r   r   r   r   r   rk   E  s   rk   c               @   s4   e Zd ZdZdZg Zg Zedd Zedd Z	dS )Orderz7``order`` option to polynomial manipulation functions. orderc             C   s
   t jjjS )N)sympypolys	orderingsZlex)r   r   r   r   r   c  s    zOrder.defaultc             C   s   t jj|S )N)rp   rq   rr   Zmonomial_key)r   ro   r   r   r   r   g  s    zOrder.preprocessN)
r   r   r   r   r   r   r    r#   r   r   r   r   r   r   rn   [  s   rn   c               @   s"   e Zd ZdZdZg ZdddgZdS )Fieldz7``field`` option to polynomial manipulation functions. fielddomainrg   gaussianN)r   r   r   r   r   r   r    r   r   r   r   rs   l  s   rs   c               @   s(   e Zd ZdZdZg ZddddddgZd	S )
Greedyz8``greedy`` option to polynomial manipulation functions. greedyru   rg   rv   	extensionmodulus	symmetricN)r   r   r   r   r   r   r    r   r   r   r   rw   u  s   rw   c               @   s4   e Zd ZdZdZedd Zg Zddddd	d
gZdS )	Compositez;``composite`` option to polynomial manipulation functions. Z	compositec             C   s   d S )Nr   )r   r   r   r   r     s    zComposite.defaultru   rg   rv   ry   rz   r{   N)	r   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g Z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. ru   rt   rx   rg   rv   ry   r2   z^(R|RR)(_(\d+))?$z^(C|CC)(_(\d+))?$z^(FF|GF)\((\d+)\)$z^(Z|ZZ|Q|QQ)\[(.+)\]$z^(Z|ZZ|Q|QQ)\((.+)\)$z^(Q|QQ)\<(.+)\>$c             C   s8  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 | j|}|d k	r| \}}}|d krtjjjS tjjt|S | j|}|d k	 r| \}}}|d krtjjjS tjjt|S | j|}|d k	r&tjjt| d S | j|}|d k	r| \}}ttt|d}|dkrvtjjjj| S tjjj	j| S | j|}|d k	r| \}}ttt|d}|dkrt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EXrT   ra   z-expected a valid domain specification, got %s)!rY   rp   rq   domainsr}   r[   r~   r   r   r   r   _re_realfieldmatchgroupsZRRZ	RealFieldint_re_complexfieldZCCZComplexField_re_finitefieldFF_re_polynomialrB   rh   r   rg   Z	poly_ring_re_fractionZ
frac_field_re_algebraicalgebraic_fieldr   )r   ru   r_ZprecZgroundr2   r   r   r   r     sZ    












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 )Nr2   ru   z/ground domain and generators interfere togetherz>you have to provide generators because EX domain was requested)Zis_Compositer?   symbolsr   rp   rq   r   r   )r   r   r   r   r   r     s    zDomain.postprocessN)r   r   r   r   r   r   r    r!   ri   rj   r   r   r   r   r   r   r#   r   r   r   r   r   r   r}     s   





Ir}   c               @   s6   e Zd ZdZdZg Zddddddd	gZed
d ZdS )Splitz7``split`` option to polynomial manipulation functions. rg   rt   rx   ru   rv   ry   rz   r{   c             C   s   d|krt dd S )Nrg   z%'split' option is not implemented yet)NotImplementedError)r   r   r   r   r   r     s    zSplit.postprocessN)	r   r   r   r   r   r   r    r#   r   r   r   r   r   r     s   
r   c               @   s6   e Zd ZdZdZg Zddddddd	gZed
d ZdS )Gaussianz:``gaussian`` option to polynomial manipulation functions. rv   rt   rx   ru   rg   ry   rz   r{   c             C   s2   d|kr.|d dkr.t tjg|d< t| d S )Nrv   Try   )r?   r   ZImaginaryUnit	Extensionr   )r   r   r   r   r   r     s    zGaussian.postprocessN)	r   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g Z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. ry   rx   ru   rg   rv   rz   r{   c             C   sR   |dkrt |S |dkr"tdn,t|ds8t|g}n|sBd }nt|}|S d S )NrT   r   z.'False' is an invalid argument for 'extension'rU   )r&   r   r[   r?   )r   ry   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 )Nry   Tru   )rp   rq   r   r   r   )r   r   r   r   r   r   )  s    
zExtension.postprocessN)
r   r   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g ZdddddgZedd	 Zed
d Z	dS )Modulusz9``modulus`` option to polynomial manipulation functions. rz   rx   rg   ru   rv   ry   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   rz   r   r   r   r   8  s
    zModulus.preprocessc             C   s4   d|kr0|d }| dd}tjj|||d< d S )Nrz   r{   Tru   )r:   rp   rq   r   r   )r   r   rz   r{   r   r   r   r   B  s    zModulus.postprocessN)
r   r   r   r   r   r   r    r#   r   r   r   r   r   r   r   0  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{   rz   rx   ru   rg   rv   ry   N)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 )Strictz8``strict`` option to polynomial manipulation functions. r7   c             C   s   dS )NTr   )r   r   r   r   r   X  s    zStrict.defaultN)r   r   r   r   r   r#   r   r   r   r   r   r   S  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. autort   ru   ry   rv   c             C   s   dS )NTr   )r   r   r   r   r   d  s    zAuto.defaultc             C   s$   d|ksd|kr d|kr d|d< d S )Nru   rt   r   Fr   )r   r   r   r   r   r   h  s    zAuto.postprocessN)	r   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 )Fracz6``auto`` option to polynomial manipulation functions. Zfracc             C   s   dS )NFr   )r   r   r   r   r   s  s    zFrac.defaultN)r   r   r   r   r   r#   r   r   r   r   r   r   n  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 )NFr   )r   r   r   r   r   }  s    zFormal.defaultN)r   r   r   r   r   r#   r   r   r   r   r   r   x  s   r   c               @   s   e Zd ZdZdZdS )Polysz5``polys`` flag to polynomial manipulation functions. rq   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. Zincludec             C   s   dS )NFr   )r   r   r   r   r     s    zInclude.defaultN)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 )Allz3``all`` flag to polynomial manipulation functions. allc             C   s   dS )NFr   )r   r   r   r   r     s    zAll.defaultN)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edd ZdS )Genz3``gen`` flag to polynomial manipulation functions. rW   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)rY   r   r   r   )r   rW   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 )NFr   )r   r   r   r   r     s    zSeries.defaultN)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edd ZdS )Symbolsz7``symbols`` flag to polynomial manipulation functions. r   c             C   s   t dddS )NsrT   )start)r
   )r   r   r   r   r     s    zSymbols.defaultc             C   s"   t |drt|S td| d S )NrU   z2expected an iterator or iterable container, got %s)r[   iterr   )r   r   r   r   r   r     s    
zSymbols.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 )Methodz6``method`` flag to polynomial manipulation functions. methodc             C   s"   t |tr| S td| d S )Nzexpected a string, got %s)rY   r\   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   rT   Zopt)rZ   r   )r2   r/   r   r   r   build_options  s
    

r   c          	   C   sd   t |}xV|  D ]J}y$tj| jr8||kr8td| W q tk
rZ   td| Y qX qW 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'])

    z('%s' flag is not allowed in this contextz'%s' is not a valid optionN)r?   r<   r   r.   r   r   r)   r   )r/   r6   argr   r   r   allowed_flags  s    r   c             K   s   d| krt | } || d< | S )z$Update options with default values. r3   )r9   )r   r3   r   r   r   set_defaults  s    r   )N)>r   Z
__future__r   r   __all__Z
sympy.corer   r   r   Zsympy.core.compatibilityr   r	   Zsympy.utilitiesr
   r   r   Zsympy.utilities.iterablesr   Zsympy.polys.polyerrorsr   r   r   Zsympy.polysrp   ri   objectr   r$   r%   typer(   r9   r   rQ   rS   r_   rk   rn   rs   rw   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r   <module>   sZ    5		e!	






