
    EdU                        d Z dgZddlmZmZ ddl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mZmZ ddlmZmZ dd	lZdd	lZ G d
 d          Z G d de          Z G d de          Z G d de          Ze G d de                      Z G d dee          Z  G d dee          Z! G d dee          Z" G d dee          Z# G d dee          Z$ G d dee          Z% G d  d!ee          Z& G d" d#ee          Z' G d$ d%ee          Z( G d& d'ee          Z) G d( d)ee          Z* G d* d+ee          Z+ G d, d-ee          Z, G d. d/ee          Z- G d0 d1ee          Z. G d2 d3eee          Z/ G d4 d5eee          Z0 G d6 d7eee          Z1 G d8 d9eee          Z2 G d: d;eee          Z3 G d< d=eee          Z4 G d> d?ee          Z5 G d@ dAeee          Z6 G dB dCee          Z7 G dD dEee          Z8dIdFZ9dG Z:dH Z;e<                                 d	S )Jz>Options manager for :class:`~.Poly` and public API functions. Options    )DictType)ListOptional)Basicsympify)GeneratorsErrorOptionError	FlagError)numbered_symbolstopological_sortpublic)has_dupsis_sequenceNc                   l    e Zd ZdZdZdZg Zg Zg Zg Z	e
d             Ze
d             Ze
d             ZdS )Optionz%Base class for all kinds of options. NFc                     d S N clss    7lib/python3.11/site-packages/sympy/polys/polyoptions.pydefaultzOption.default       t    c                     d S r   r   )r   options     r   
preprocesszOption.preprocess#   r   r   c                     d S r   r   r   optionss     r   postprocesszOption.postprocess'   s    r   )__name__
__module____qualname____doc__r   is_Flagrequiresexcludesafterbeforeclassmethodr   r   r#   r   r   r   r   r      s        //FGHHEF  [   [   [  r   r   c                       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        --GGGr   r/   c                   (    e Zd ZdZed             ZdS )BooleanOptionzAAn option that must have a boolean value or equivalent assigned. c                 \    |dv rt          |          S t          d| j        d|          )N)TF'z*' must have a boolean value assigned, got )boolr   r   )r   values     r   r   zBooleanOption.preprocess5   s?    M! 	g;;+SVS]S]S]_d_defffr   N)r$   r%   r&   r'   r-   r   r   r   r   r1   r1   2   s8        KKg g [g g gr   r1   c                       e Zd ZdZd ZdS )
OptionTypez7Base type for all options that does registers options. c                      t            fd            }t          t           j        |            t          j         j        <   d S )Nc                 h    	 | j                  S # t          $ r                                 cY S w xY wr   )r   KeyErrorr   )selfr   s    r   getterz#OptionType.__init__.<locals>.getterA   sD    %CJ'' % % %{{}}$$$%s    11)propertysetattrr   r   __options__)r   argskwargsr<   s   `   r   __init__zOptionType.__init__@   sQ    		% 	% 	% 	% 
	% 	V,,,*-CJ'''r   N)r$   r%   r&   r'   rB   r   r   r   r7   r7   =   s)        AA	. 	. 	. 	. 	.r   r7   c                        e Zd ZdZdZi ZddZed             Zi fdZ	 fdZ
ed             Zed	             Zed
             Z x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           	      R    t                                           |r%|                    dd          rt          d          |rt          |          }||d<   |                    di           } fd} ||           t          |                                          D ]?\  }}| v r||=                                  D ]}	 j        |	         }
||
j        v r||=  n@ ||                                            D ]y}	 j        |	         }
|
j	        D ]-}                     |          t          d|	d|d          .|
j        D ]-}                     |          t          d|	d|d          .z j
        D ]"}	 j        |	                                         #d S )	Ngensr   z1both '*gens' and keyword argument 'gens' supplieddefaultsc                 ,   |                                  D ]}\  }}	 j        |         }n # t          $ r t          d|z            w xY wt	          |t
                    r|vrrt          d|z            ||                    |          |<   ~d S )N'%s' is not a valid option('%s' flag is not allowed in this context)itemsr?   r:   r   
issubclassr/   r   )r@   r   r5   r   flagsr;   stricts       r   preprocess_optionsz,Options.__init__.<locals>.preprocess_options   s    !% 9 9M*62CC M M M%&BV&KLLLM c4(( c ce(; c! c"-.X[a.a"b"bb 9#&>>%#8#8DL9 9s	   *Ar3   z(' option is only allowed together with 'z'' option is not allowed together with ')dictrB   getr   poprJ   keysr?   r*   r)   	__order__r#   )r;   rE   r@   rL   rM   rF   rN   keyr5   r   r   require_optionexclude_options   `  ``        r   rB   zOptions.__init__   sO   d 	 DHHVR(( 	 CE E E 	 ::DDL88J++	9 	9 	9 	9 	9 	9 	9 	4   x....00 		 		JCd{ SMM"iikk  F*62Ccl* $SM 	8$$$iikk 		r 		rF"6*C"%, s s88N++ s%+Z`Z`Z`bpbpbp&qrrrs #&, r r88N++ r%+Y_Y_Y_aoaoao&pqqqrr n 	7 	7FV$006666	7 	7r   c                    | j         g t                      }}| j                                        D ]\\  }}|                    |           |j        D ]}|                    ||f           |j        D ]}|                    ||f           ]	 t          |t          |          f          | _         dS # t          $ r t          d          w xY wdS )z*Resolve the order of options' processing. Nz/cycle detected in sympy.polys options framework)rS   setr?   rJ   appendr+   addr,   r   list
ValueErrorRuntimeError)r   verticesedgesnamer   _names         r   _init_dependencies_orderz Options._init_dependencies_order   s    = 	G #%%eH # 5 5 7 7 - -f%%%#\ - -EIIudm,,,,#] - -EIItUm,,,,-G 0(DKK1H I I G G G"EG G GG	G 	Gs   #B4 4Cc                     t                               | j                  }|                                 D ]
\  }}|||<   |                                D ]
\  }}|||<   |S )z-Clone ``self`` and update specified options. )rO   __new__	__class__rJ   )r;   updatesobjr   r5   s        r   clonezOptions.clone   sf    ll4>**!ZZ\\ 	  	 MFECKK$]]__ 	  	 MFECKK
r   c                 l    || j         v r|| |<   d S t                                          ||           d S r   )r?   super__setattr__)r;   attrr5   re   s      r   rk   zOptions.__setattr__   s@    4## 	-DJJJGGe,,,,,r   c                     i }|                                  D ]4\  }}|-|dk    r'| j        |         }t          |t                    s|||<   5|S )NrE   )rJ   r?   rK   r/   )r;   r@   r   r5   r   s        r   r@   zOptions.args   sd    !ZZ\\ 	) 	)MFE )Vv%5 )&v.!#t,, )#(DLr   c                     i }| j                                         D ]-\  }}t          |t                    st	          | |          ||<   .|S r   r?   rJ   rK   r/   getattr)r;   r"   r   r   s       r   r"   zOptions.options   sT    +1133 	8 	8KFCc4(( 8")$"7"7r   c                     i }| j                                         D ]-\  }}t          |t                    rt	          | |          ||<   .|S r   ro   )r;   rL   r   r   s       r   rL   zOptions.flags   sT    +1133 	6 	6KFC#t$$ 6 'f 5 5fr   NF)r$   r%   r&   r'   rS   r?   rB   r-   rb   rh   rk   r=   r@   r"   rL   __classcell__)re   s   @r   r   r   L   s        - -^ IK67 67 67 67p G G [G(  
 
 
 
- - - - - 
 
 X
   X   X    r   c                   4    e Zd ZdZdZg Zg Zed             ZdS )Expandz8``expand`` option to polynomial manipulation functions. expandc                     dS NTr   r   s    r   r   zExpand.default	  r   r   N)	r$   r%   r&   r'   r   r)   r*   r-   r   r   r   r   ru   ru     sB        BBFHH  [  r   ru   )	metaclassc                   J    e Zd ZdZdZg Zg Zed             Zed             Z	dS )Gensz6``gens`` option to polynomial manipulation functions. rE   c                     dS )Nr   r   r   s    r   r   zGens.default  s    rr   c                    t          |t                    r|f}n0t          |          dk    rt          |d                   r|d         }|dk    rd}nft	          |          rt          dt          |          z            t          d |D                       rt          dt          |          z            t          |          S )N   r   r   r   zduplicated generators: %sc              3   (   K   | ]}|j         d u V  dS )FN)is_commutative.0gens     r   	<genexpr>z"Gens.preprocess.<locals>.<genexpr>%  s*      ==#u,======r   znon-commutative generators: %s)	
isinstancer   lenr   r   r
   stranytuple)r   rE   s     r   r   zGens.preprocess  s    dE"" 	7DDYY!^ 	DG 4 4 	7D7? 	PDDd^^ 	P!"=D		"IJJJ======= 	P!"BSYY"NOOOT{{r   N
r$   r%   r&   r'   r   r)   r*   r-   r   r   r   r   r   r{   r{     s]        @@FHH  [   [  r   r{   c                   T    e Zd ZdZdZg Zg Z ej        d          Z	e
d             ZdS )Wrtz5``wrt`` option to polynomial manipulation functions. wrtz\s*,\s*|\s+c                    t          |t                    rt          |          gS t          |t                    r`|                                }|                    d          rt          d          |sg S d | j                            |          D             S t          |d          r"t          t          t          |                    S t          d          )N,zBad input: missing parameter.c                     g | ]}|S r   r   r   s     r   
<listcomp>z"Wrt.preprocess.<locals>.<listcomp>?  s    >>>SS>>>r   __getitem__z!invalid argument for 'wrt' option)r   r   r   stripendswithr   	_re_splitsplithasattrr[   map)r   r   s     r   r   zWrt.preprocess5  s    c5!! 	CHH:S!! 
	C))++C||C   C!"ABBB 	>>CM$7$7$<$<>>>>S-(( 	CC&&&ABBBr   N)r$   r%   r&   r'   r   r)   r*   recompiler   r-   r   r   r   r   r   r   +  sX        ??FHH
>**IC C [C C Cr   r   c                   J    e Zd ZdZdZg Zg Zed             Zed             Z	dS )Sortz6``sort`` option to polynomial manipulation functions. sortc                     g S r   r   r   s    r   r   zSort.defaultN  s    	r   c                     t          |t                    rd |                    d          D             S t          |d          r"t	          t          t          |                    S t          d          )Nc                 6    g | ]}|                                 S r   )r   r   s     r   r   z#Sort.preprocess.<locals>.<listcomp>U  s     ===SSYY[[===r   >r   z"invalid argument for 'sort' option)r   r   r   r   r[   r   r   )r   r   s     r   r   zSort.preprocessR  sk    dC   	D==DJJsOO====T=)) 	DC'''BCCCr   Nr   r   r   r   r   r   F  sb        @@FHH  [ D D [D D Dr   r   c                   J    e Zd ZdZdZg Zg Zed             Zed             Z	dS )Orderz7``order`` option to polynomial manipulation functions. orderc                 .    t           j        j        j        S r   )sympypolys	orderingslexr   s    r   r   zOrder.defaultd  s    {$((r   c                 J    t           j        j                            |          S r   )r   r   r   monomial_key)r   r   s     r   r   zOrder.preprocessh  s    {$11%888r   Nr   r   r   r   r   r   \  s]        AAFHH) ) [) 9 9 [9 9 9r   r   c                   "    e Zd ZdZdZg Zg dZdS )Fieldz7``field`` option to polynomial manipulation functions. field)domainr   gaussianNr$   r%   r&   r'   r   r)   r*   r   r   r   r   r   m  s)        AAFH...HHHr   r   c                   "    e Zd ZdZdZg Zg dZdS )Greedyz8``greedy`` option to polynomial manipulation functions. greedyr   r   r   	extensionmodulus	symmetricNr   r   r   r   r   r   v  s)        BBFHSSSHHHr   r   c                   8    e Zd ZdZdZed             Zg Zg dZdS )	Compositez;``composite`` option to polynomial manipulation functions. 	compositec                     d S r   r   r   s    r   r   zComposite.default  r   r   r   N)	r$   r%   r&   r'   r   r-   r   r)   r*   r   r   r   r   r     sD        EEF  [ HSSSHHHr   r   c                      e Zd ZdZdZg Zg dZdgZ ej	        d          Z
 ej	        d          Z ej	        d          Z ej	        d          Z ej	        d	          Z ej	        d
          Zed             Zed             ZdS )Domainz8``domain`` option to polynomial manipulation functions. r   )r   r   r   r   r   rE   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                 j	   t          |t          j        j        j                  r|S t          |d          r|                                S t          |t                    rB|dv rt          j        j        j        S |dv rt          j        j        j	        S |dk    rt          j        j        j
        S |dk    rt          j        j        j        S |dk    rt          j        j        j        S | j                            |          }|a|                                \  }}}|t          j        j        j        S t          j        j                            t%          |                    S | j                            |          }|a|                                \  }}}|t          j        j        j        S t          j        j                            t%          |                    S | j                            |          }|It          j        j                            t%          |                                d                             S | j                            |          }||                                \  }}t3          t5          t6          |                    d                              }|dv rt          j        j        j        j        | S |dv rt          j        j        j	        j        | S |d	v 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                            |          }||                                \  }}t3          t5          t6          |                    d                              }|dv rt          j        j        j        j        | S t          j        j        j	        j        | S | j                             |          }|jt3          t5          t6          |                                d                             d                              }t          j        j        j	        j!        | S tE          d
|z            )N	to_domain)ZZZ)QQQZZ_IQQ_IEXr~   r   )RRRz-expected a valid domain specification, got %s)#r   r   r   domainsr   r   r   r   r   r   r   r   r   _re_realfieldmatchgroupsr   	RealFieldint_re_complexfieldCCComplexField_re_finitefieldFF_re_polynomialr[   r   r	   r   	poly_ring_re_fraction
frac_field_re_algebraicalgebraic_fieldr   )r   r   r_precgroundrE   s          r   r   zDomain.preprocess  s   fek1899 Q	EMV[)) O	E##%%%$$ M	E$ .{*--$ .{*-- 0{*// 0{*//~ .{*--!''//A DXXZZ
1d D ;.11 ;.88TCCC$**622A GXXZZ
1d G ;.11 ;.;;CIIFFF#))&11A B{*--c!((**Q-.@.@AAA"((00A C xxzzCC99::[( C ;.1;TBB{* 	C ;.1;TBB{* C ;.1;TBBv% C ;.3=tDDv% C ;.3=tDD ;.1;TBB &&v..A D xxzzCC99::[( D ;.1<dCC ;.1<dCC!''//A ECA)<)<S)A)ABBCC{*-=tDDIFRSSSr   c                 4   d|v rPd|v rL|d         j         r?t          |d         j                  t          |d                   z  rt          d          d|vs|d         s5d|v r/|d         t          j        j        j        k    rt          d          d S d S d S )NrE   r   z/ground domain and generators interfere togetherz>you have to provide generators because EX domain was requested)is_CompositerX   symbolsr
   r   r   r   r   r!   s     r   r#   zDomain.postprocess  s    W 	dW!4 	d9J9W 	dWX&.//#gfo2F2FF	d!AC C CG# 	d76? 	dG#	d(/(9U[=P=S(S	d!"bccc	d 	d 	d 	d 	d 	dr   N)r$   r%   r&   r'   r   r)   r*   r+   r   r   r   r   r   r   r   r   r-   r   r#   r   r   r   r   r     s        BBFHDDDHHEBJ344M!rz"677 bj!677ORZ LMMN2:677LBJ233MTT TT [TTl d d [d d dr   r   c                   8    e Zd ZdZdZg Zg dZed             ZdS )Splitz7``split`` option to polynomial manipulation functions. r   )r   r   r   r   r   r   r   c                 ,    d|v rt          d          d S )Nr   z%'split' option is not implemented yet)NotImplementedErrorr!   s     r   r#   zSplit.postprocess  s+    g 	O%&MNNN	O 	Or   N	r$   r%   r&   r'   r   r)   r*   r-   r#   r   r   r   r   r     sU        AAFH     H O O [O O Or   r   c                   8    e Zd ZdZdZg Zg dZed             ZdS )Gaussianz:``gaussian`` option to polynomial manipulation functions. r   )r   r   r   r   r   r   r   c                     d|v r?|d         du r7t           j        j        j        |d<   t                              |           d S d S d S )Nr   Tr   )r   r   r   r   	Extensionr#   r!   s     r   r#   zGaussian.postprocess  s`      	+WZ%8D%@ 	+ % 3 8GH!!'*****	+ 	+ 	+ 	+r   Nr   r   r   r   r   r     sP        DDFH     H + + [+ + +r   r   c                   N    e Zd ZdZdZg Zg dZed             Zed             Z	dS )r   z;``extension`` option to polynomial manipulation functions. r   )r   r   r   r   r   r   c                     |dk    rt          |          S |dk    rt          d          t          |d          s|h}n|sd }nt          |          }|S )Nr~   r   z.'False' is an invalid argument for 'extension'__iter__)r4   r   r   rX   )r   r   s     r   r   zExtension.preprocess'  sp    > 		??"!^ 	NOOO9j11 /&K		  / $II #IIr   c                 v    d|v r2|d         dur*t          j        j        j        j        |d          |d<   d S d S d S )Nr   Tr   )r   r   r   r   r   r!   s     r   r#   zExtension.postprocess8  s\    '! 	'gk&:$&F 	' % 3 6 F%!'GH	' 	' 	' 	'r   N
r$   r%   r&   r'   r   r)   r*   r-   r   r#   r   r   r   r   r     sk        EEFH  H   [  ' ' [' ' 'r   r   c                   N    e Zd ZdZdZg Zg dZed             Zed             Z	dS )Modulusz9``modulus`` option to polynomial manipulation functions. r   )r   r   r   r   r   c                 |    t          |          }|j        r|dk    rt          |          S t          d|z            )Nr   z)'modulus' must a positive integer, got %s)r	   
is_Integerr   r   )r   r   s     r   r   zModulus.preprocessG  sP    '"" 	G'A+ 	Gw<<;gEG G Gr   c                     d|v rH|d         }|                     dd          }t          j        j                            ||          |d<   d S d S )Nr   r   Tr   )rP   r   r   r   r   )r   r"   r   r   s       r   r#   zModulus.postprocessQ  s^     	Ki(GK66I % 3 6 6w	 J JGH	K 	Kr   Nr   r   r   r   r   r   ?  sk        CCFHEEEHG G [G K K [K K Kr   r   c                   $    e Zd ZdZdZdgZg dZdS )	Symmetricz;``symmetric`` option to polynomial manipulation functions. r   r   )r   r   r   r   r   Nr   r   r   r   r   r   Y  s+        EEF{HEEEHHHr   r   c                   ,    e Zd ZdZdZed             ZdS )Strictz8``strict`` option to polynomial manipulation functions. rM   c                     dS rx   r   r   s    r   r   zStrict.defaultg  r   r   Nr$   r%   r&   r'   r   r-   r   r   r   r   r   r   b  s8        BBF  [  r   r   c                   J    e Zd ZdZdZg dZed             Zed             ZdS )Autoz4``auto`` flag to polynomial manipulation functions. auto)r   r   r   r   c                     dS rx   r   r   s    r   r   zAuto.defaults  r   r   c                 0    d|v sd|v rd|vrd|d<   d S d S d S )Nr   r   r   Fr   r!   s     r   r#   zAuto.postprocessw  sH     	$7g#5 	$6;P 	$#GFOOO	$ 	$ 	$ 	$r   N)	r$   r%   r&   r'   r   r+   r-   r   r#   r   r   r   r   r   l  s^        >>F888E  [ $ $ [$ $ $r   r   c                   ,    e Zd ZdZdZed             ZdS )Fracz6``auto`` option to polynomial manipulation functions. fracc                     dS rr   r   r   s    r   r   zFrac.default      ur   Nr   r   r   r   r  r  }  s8        @@F  [  r   r  c                   ,    e Zd ZdZdZed             ZdS )Formalz6``formal`` flag to polynomial manipulation functions. formalc                     dS rr   r   r   s    r   r   zFormal.default  r  r   Nr   r   r   r   r  r    8        @@F  [  r   r  c                       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        ??FFFr   r  c                   ,    e Zd ZdZdZed             ZdS )Includez7``include`` flag to polynomial manipulation functions. includec                     dS rr   r   r   s    r   r   zInclude.default  r  r   Nr   r   r   r   r  r    s8        AAF  [  r   r  c                   ,    e Zd ZdZdZed             ZdS )Allz3``all`` flag to polynomial manipulation functions. allc                     dS rr   r   r   s    r   r   zAll.default  r  r   Nr   r   r   r   r  r    s8        ==F  [  r   r  c                   B    e Zd ZdZdZed             Zed             ZdS )Genz3``gen`` flag to polynomial manipulation functions. r   c                     dS )Nr   r   r   s    r   r   zGen.default  s    qr   c                 \    t          |t          t          f          r|S t          d          )Nz!invalid argument for 'gen' option)r   r   r   r   )r   r   s     r   r   zGen.preprocess  s-    cE3<(( 	CJABBBr   Nr$   r%   r&   r'   r   r-   r   r   r   r   r   r  r    sX        ==F  [ C C [C C Cr   r  c                   ,    e Zd ZdZdZed             ZdS )Seriesz6``series`` flag to polynomial manipulation functions. seriesc                     dS rr   r   r   s    r   r   zSeries.default  r  r   Nr   r   r   r   r  r    r	  r   r  c                   B    e Zd ZdZdZed             Zed             ZdS )Symbolsz7``symbols`` flag to polynomial manipulation functions. r   c                 $    t          dd          S )Nsr~   )start)r   r   s    r   r   zSymbols.default  s    1----r   c                 d    t          |d          rt          |          S t          d|z            )Nr   z2expected an iterator or iterable container, got %s)r   iterr   )r   r   s     r   r   zSymbols.preprocess  s6    7J'' 	^== RU\\]]]r   Nr  r   r   r   r  r    sX        AAF. . [. ^ ^ [^ ^ ^r   r  c                   ,    e Zd ZdZdZed             ZdS )Methodz6``method`` flag to polynomial manipulation functions. methodc                 x    t          |t                    r|                                S t          d|z            )Nzexpected a string, got %s)r   r   lowerr   )r   r&  s     r   r   zMethod.preprocess  s7    fc"" 	D<<>>!9FBCCCr   N)r$   r%   r&   r'   r   r-   r   r   r   r   r%  r%    s=        @@FD D [D D Dr   r%  c                 p    |d| }} t          |          dk    sd|vs| rt          | |          S |d         S )z9Construct options from keyword arguments or ... options. Nr   r~   opt)r   r   )rE   r@   s     r   build_optionsr+    sR     d
4yyA~ d* d tT"""E{r   c                     t          |          }|                                 D ]P}	 t          j        |         j        r||vrt          d|z            1# t          $ r t          d|z            w xY 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'])

    rI   rH   N)rX   rR   r   r?   r(   r   r:   r   )r@   rL   args      r   allowed_flagsr.    s    ( JJEyy{{ B B	B"3'/ FCu4D F>DF F F 	B 	B 	B:S@AAA	BB Bs   -AA2c                 6    d| vrt          |           } || d<   | S )z$Update options with default values. rF   )rO   )r"   rF   s     r   set_defaultsr0    s)      'w--&
Nr   r   )=r'   __all__typingr   tDictr   r   r   
sympy.corer   r	   sympy.polys.polyerrorsr
   r   r   sympy.utilitiesr   r   r   sympy.utilities.iterablesr   r   sympy.polysr   r   r   r/   r1   typer7   rO   r   ru   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r%  r+  r.  r0  rb   r   r   r   <module>r:     sF   D D + & & & & & & & & ! ! ! ! ! ! ! ! % % % % % % % % J J J J J J J J J J F F F F F F F F F F ; ; ; ; ; ; ; ;     				       4    6   g g g g gF g g g. . . . . . . . q q q q qd q q qh
 
 
 
 
]j 
 
 
 
    6Z    :C C C C C&J C C C C6D D D D D6Z D D D D,9 9 9 9 9Fj 9 9 9 9"/ / / / /MZ / / / /T T T T T]j T T T T
T 
T 
T 
T 
T 
T 
T 
T 
Tpd pd pd pd pdVz pd pd pd pdfO O O O OMZ O O O O+ + + + +}
 + + + + ' ' ' ' '* ' ' ' 'BK K K K Kf
 K K K K4F F F F F F F F F    ]j    $ $ $ $ $=$* $ $ $ $"    =$*        ]DJ        M4:        mTZ        -    C C C C C$* C C C C"    ]DJ    ^ ^ ^ ^ ^dj ^ ^ ^ ^"
D 
D 
D 
D 
DTZ 
D 
D 
D 
D   B B B>        " " " " "r   