U
    ZÊ¹jóI  ã                   @   sÚ  d Z ddlmZmZmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ edƒZedƒZ edƒZ!edƒZ"edƒZ#edƒZ$G dd„ deƒZ%G dd„ deƒZ&dd„ 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+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/ƒ Z0d(d)„ Z1e1d*ƒZ2d\d,d+d+d-œd.d/„Z3d0d1„ Z4d2d3„ Z5d]d4d5„Z6d^d6d7„Z7d_d8d9„Z8d`d:d;„Z9dad<d=„Z:dbd>d?„Z;G d@dA„ dAeƒZ<G dBdC„ dCeƒZ=G dDdE„ dEeƒZ>G dFdG„ dGe>ƒZ?G dHdI„ dIe>ƒZ@G dJdK„ dKe>ƒZAG dLdM„ dMe>ƒZBG dNdO„ dOe>ƒZCG dPdQ„ dQe?ƒZDG dRdS„ dSeƒZEG dTdU„ dUeEƒZFG dVdW„ dWeEƒZGG dXdY„ dYeeƒZHG dZd[„ d[eeƒZId+S )cz¬
AST nodes specific to Fortran.

The functions defined in this module allows the user to express functions such as ``dsign``
as a SymPy function for symbolic manipulation.
é    )	Ú	AttributeÚ	CodeBlockÚFunctionCallÚNodeÚnoneÚStringÚTokenÚ	_mk_TupleÚVariable)ÚBasic©ÚTuple)ÚExpr)ÚFunction)ÚFloatÚInteger)ÚStr)Úsympify©ÚtrueÚfalse)ÚiterableÚpureÚ	elementalÚ	intent_inÚ
intent_outÚintent_inoutÚallocatablec                   @   s(   e Zd ZdZd ZZeZedd„ ƒZ	dS )ÚProgramaf   Represents a 'program' block in Fortran.

    Examples
    ========

    >>> from sympy.codegen.ast import Print
    >>> from sympy.codegen.fnodes import Program
    >>> prog = Program('myprogram', [Print([42])])
    >>> from sympy import fcode
    >>> print(fcode(prog, source_format='free'))
    program myprogram
        print *, 42
    end program

    )ÚnameÚbodyc                 C   s   t | Ž S ©N©r   ©r    © r$   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/codegen/fnodes.pyÚ<lambda>3   ó    zProgram.<lambda>N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__Ú_fieldsr   Ú_construct_nameÚstaticmethodÚ_construct_bodyr$   r$   r$   r%   r   !   s   r   c                   @   s    e Zd ZdZd ZZeZeZdS )Ú
use_renameaÊ   Represents a renaming in a use statement in Fortran.

    Examples
    ========

    >>> from sympy.codegen.fnodes import use_rename, use
    >>> from sympy import fcode
    >>> ren = use_rename("thingy", "convolution2d")
    >>> print(fcode(ren, source_format='free'))
    thingy => convolution2d
    >>> full = use('signallib', only=['snr', ren])
    >>> print(fcode(full, source_format='free'))
    use signallib, only: snr, thingy => convolution2d

    )ÚlocalÚoriginalN)	r(   r)   r*   r+   r,   r-   r   Z_construct_localZ_construct_originalr$   r$   r$   r%   r1   6   s   r1   c                 C   s   t | dƒr| jS t| ƒS d S )Nr   )Úhasattrr   r   ©Úargr$   r$   r%   Ú_nameJ   s    
r7   c                   @   sB   e Zd ZdZd ZZeedœZee	ƒZ
edd„ ƒZedd„ ƒZdS )ÚuseaÑ   Represents a use statement in Fortran.

    Examples
    ========

    >>> from sympy.codegen.fnodes import use
    >>> from sympy import fcode
    >>> fcode(use('signallib'), source_format='free')
    'use signallib'
    >>> fcode(use('signallib', [('metric', 'snr')]), source_format='free')
    'use signallib, metric => snr'
    >>> fcode(use('signallib', only=['snr', 'convolution2d']), source_format='free')
    'use signallib, only: snr, convolution2d'

    )Ú	namespaceÚrenameÚonly)r:   r;   c                 C   s   t dd„ | D ƒŽ S )Nc                 S   s"   g | ]}t |tƒr|nt|Ž ‘qS r$   )Ú
isinstancer1   ©Ú.0r6   r$   r$   r%   Ú
<listcomp>c   s     ú use.<lambda>.<locals>.<listcomp>r   ©Úargsr$   r$   r%   r&   c   r'   zuse.<lambda>c                 C   s   t dd„ | D ƒŽ S )Nc                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r$   )r<   r1   r7   r=   r$   r$   r%   r?   d   s     r@   r   rA   r$   r$   r%   r&   d   r'   N)r(   r)   r*   r+   r,   r-   r   Údefaultsr/   r7   Z_construct_namespaceZ_construct_renameZ_construct_onlyr$   r$   r$   r%   r8   P   s   
r8   c                   @   s>   e Zd ZdZd ZZdeƒ iZeZ	e
dd„ ƒZedd„ ƒZdS )	ÚModulea\   Represents a module in Fortran.

    Examples
    ========

    >>> from sympy.codegen.fnodes import Module
    >>> from sympy import fcode
    >>> print(fcode(Module('signallib', ['implicit none'], []), source_format='free'))
    module signallib
    implicit none
    <BLANKLINE>
    contains
    <BLANKLINE>
    <BLANKLINE>
    end module

    )r   ÚdeclarationsZdefinitionsrE   c                 C   s   dd„ |D ƒ}t |Ž S )Nc                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r$   )r<   Ústrr   r=   r$   r$   r%   r?      s     z2Module._construct_declarations.<locals>.<listcomp>r"   )ÚclsrB   r$   r$   r%   Ú_construct_declarations}   s    zModule._construct_declarationsc                 C   s   t | Ž S r!   r"   r5   r$   r$   r%   r&   ‚   r'   zModule.<lambda>N)r(   r)   r*   r+   r,   r-   r   rC   r   r.   ÚclassmethodrH   r/   Z_construct_definitionsr$   r$   r$   r%   rD   g   s   

rD   c                   @   s:   e Zd ZdZdZeej ZeZe	dd„ ƒZ
edd„ ƒZdS )Ú
Subroutineaê   Represents a subroutine in Fortran.

    Examples
    ========

    >>> from sympy import fcode, symbols
    >>> from sympy.codegen.ast import Print
    >>> from sympy.codegen.fnodes import Subroutine
    >>> x, y = symbols('x y', real=True)
    >>> sub = Subroutine('mysub', [x, y], [Print([x**2 + y**2, x*y])])
    >>> print(fcode(sub, source_format='free', standard=2003))
    subroutine mysub(x, y)
    real*8 :: x
    real*8 :: y
    print *, x**2 + y**2, x*y
    end subroutine

    )r   Ú
parametersr    c                 C   s   t ttj| ƒŽ S r!   )r   Úmapr
   Údeduced)Úparamsr$   r$   r%   r&   ›   r'   zSubroutine.<lambda>c                 C   s   t |tƒr|S t|Ž S d S r!   )r<   r   )rG   Zitrr$   r$   r%   r0   �   s    
zSubroutine._construct_bodyN)r(   r)   r*   r+   r,   r   r-   r   r.   r/   Z_construct_parametersrI   r0   r$   r$   r$   r%   rJ   …   s   
rJ   c                   @   s(   e Zd ZdZd ZZeeƒZee	ƒZ
dS )ÚSubroutineCallzü Represents a call to a subroutine in Fortran.

    Examples
    ========

    >>> from sympy.codegen.fnodes import SubroutineCall
    >>> from sympy import fcode
    >>> fcode(SubroutineCall('mysub', 'x y'.split()))
    '       call mysub(x, y)'

    )r   Zsubroutine_argsN)r(   r)   r*   r+   r,   r-   r/   r7   r.   r	   Z_construct_subroutine_argsr$   r$   r$   r%   rO   ¤   s   rO   c                   @   s^   e Zd ZdZd ZZedƒedœZe	dd„ ƒZ
e	eƒZe	eƒZe	eƒZe	eƒZe	dd„ ƒZdS )	ÚDoa�   Represents a Do loop in in Fortran.

    Examples
    ========

    >>> from sympy import fcode, symbols
    >>> from sympy.codegen.ast import aug_assign, Print
    >>> from sympy.codegen.fnodes import Do
    >>> i, n = symbols('i n', integer=True)
    >>> r = symbols('r', real=True)
    >>> body = [aug_assign(r, '+', 1/i), Print([i, r])]
    >>> do1 = Do(body, i, 1, n)
    >>> print(fcode(do1, source_format='free'))
    do i = 1, n
        r = r + 1d0/i
        print *, i, r
    end do
    >>> do2 = Do(body, i, 1, n, 2)
    >>> print(fcode(do2, source_format='free'))
    do i = 1, n, 2
        r = r + 1d0/i
        print *, i, r
    end do

    )r    ÚcounterÚfirstÚlastÚstepÚ
concurrenté   )rT   rU   c                 C   s   t | Ž S r!   r"   r#   r$   r$   r%   r&   Ò   r'   zDo.<lambda>c                 C   s   | rt S tS r!   r   r5   r$   r$   r%   r&   ×   r'   N)r(   r)   r*   r+   r,   r-   r   r   rC   r/   r0   r   Ú_construct_counterÚ_construct_firstÚ_construct_lastÚ_construct_stepZ_construct_concurrentr$   r$   r$   r%   rP   µ   s   rP   c                   @   s    e Zd ZdZd ZZeeƒZdS )ÚArrayConstructoraT   Represents an array constructor.

    Examples
    ========

    >>> from sympy import fcode
    >>> from sympy.codegen.fnodes import ArrayConstructor
    >>> ac = ArrayConstructor([1, 2, 3])
    >>> fcode(ac, standard=95, source_format='free')
    '(/1, 2, 3/)'
    >>> fcode(ac, standard=2003, source_format='free')
    '[1, 2, 3]'

    )ÚelementsN)	r(   r)   r*   r+   r,   r-   r/   r	   Z_construct_elementsr$   r$   r$   r%   r[   Ú   s   r[   c                   @   sL   e Zd ZdZd ZZdedƒiZee	ƒZ
ee	ƒZee	ƒZee	ƒZee	ƒZdS )ÚImpliedDoLoopaÉ   Represents an implied do loop in Fortran.

    Examples
    ========

    >>> from sympy import Symbol, fcode
    >>> from sympy.codegen.fnodes import ImpliedDoLoop, ArrayConstructor
    >>> i = Symbol('i', integer=True)
    >>> idl = ImpliedDoLoop(i**3, i, -3, 3, 2)  # -27, -1, 1, 27
    >>> ac = ArrayConstructor([-28, idl, 28]) # -28, -27, -1, 1, 27, 28
    >>> fcode(ac, standard=2003, source_format='free')
    '[-28, (i**3, i = -3, 3, 2), 28]'

    )ÚexprrQ   rR   rS   rT   rT   rV   N)r(   r)   r*   r+   r,   r-   r   rC   r/   r   Ú_construct_exprrW   rX   rY   rZ   r$   r$   r$   r%   r]   í   s   r]   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚExtentaC   Represents a dimension extent.

    Examples
    ========

    >>> from sympy.codegen.fnodes import Extent
    >>> e = Extent(-3, 3)  # -3, -2, -1, 0, 1, 2, 3
    >>> from sympy import fcode
    >>> fcode(e, source_format='free')
    '-3:3'
    >>> from sympy.codegen.ast import Variable, real
    >>> from sympy.codegen.fnodes import dimension, intent_out
    >>> dim = dimension(e, e)
    >>> arr = Variable('x', real, attrs=[dim, intent_out])
    >>> fcode(arr.as_Declaration(), source_format='free', standard=2003)
    'real*8, dimension(-3:3, -3:3), intent(out) :: x'

    c                 G   sd   t |ƒdkr*|\}}t | t|ƒt|ƒ¡S t |ƒdksNt |ƒdkrX|d dkrXt | ¡S tdƒ‚d S )Né   r   rV   )ú:Nz5Expected 0 or 2 args (or one argument == None or ':'))Úlenr   Ú__new__r   Ú
ValueError)rG   rB   ÚlowÚhighr$   r$   r%   rd     s    $
zExtent.__new__c                 C   s(   t | jƒdkrdS d dd„ | jD ƒ¡S )Nr   rb   c                 s   s   | ]}t |ƒV  qd S r!   )rF   r=   r$   r$   r%   Ú	<genexpr>$  s     z#Extent._sympystr.<locals>.<genexpr>)rc   rB   Újoin)ÚselfÚprinterr$   r$   r%   Ú	_sympystr!  s    zExtent._sympystrN)r(   r)   r*   r+   rd   rl   r$   r$   r$   r%   r`     s   	r`   c                  G   s¬   t | ƒdkrtdƒ‚g }| D ]p}t|tƒr6| |¡ qt|tƒrf|dkrV| tƒ ¡ qŒ| t|ƒ¡ qt|ƒr~| t|Ž ¡ q| t|ƒ¡ qt | ƒdkr¢tdƒ‚t	d|ƒS )aú   Creates a 'dimension' Attribute with (up to 7) extents.

    Examples
    ========

    >>> from sympy import fcode
    >>> from sympy.codegen.fnodes import dimension, intent_in
    >>> dim = dimension('2', ':')  # 2 rows, runtime determined number of columns
    >>> from sympy.codegen.ast import Variable, integer
    >>> arr = Variable('a', integer, attrs=[dim, intent_in])
    >>> fcode(arr.as_Declaration(), source_format='free', standard=2003)
    'integer*4, dimension(2, :), intent(in) :: a'

    é   z0Fortran only supports up to 7 dimensional arraysrb   r   zNeed at least one dimensionÚ	dimension)
rc   re   r<   r`   ÚappendrF   r   r   r   r   )rB   rK   r6   r$   r$   r%   rn   )  s     

rn   Ú*Nr$   )ÚattrsÚvalueÚtypec                C   sœ   t |tƒr*t|jƒdkr2tdt|ƒ ƒ‚nt|Ž }t|ƒ|g }|dk	rp|ttt	fkrfttt	dœ| }| 
|¡ |dkrˆtj| ||d�S t| |||d�S dS )aë   Convenience function for creating a Variable instance for a Fortran array.

    Parameters
    ==========

    symbol : symbol
    dim : Attribute or iterable
        If dim is an ``Attribute`` it need to have the name 'dimension'. If it is
        not an ``Attribute``, then it is passed to :func:`dimension` as ``*dim``
    intent : str
        One of: 'in', 'out', 'inout' or None
    \*\*kwargs:
        Keyword arguments for ``Variable`` ('type' & 'value')

    Examples
    ========

    >>> from sympy import fcode
    >>> from sympy.codegen.ast import integer, real
    >>> from sympy.codegen.fnodes import array
    >>> arr = array('a', '*', 'in', type=integer)
    >>> print(fcode(arr.as_Declaration(), source_format='free', standard=2003))
    integer*4, dimension(*), intent(in) :: a
    >>> x = array('x', [3, ':', ':'], intent='out', type=real)
    >>> print(fcode(x.as_Declaration(value=1), source_format='free', standard=2003))
    real*8, dimension(3, :, :), intent(out) :: x = 1

    rn   z/Got an unexpected Attribute argument as dim: %sN)ÚinÚoutZinout)rr   rq   )r<   r   rF   r   re   rn   Úlistr   r   r   ro   r
   rM   )ÚsymbolÚdimZintentrq   rr   rs   r$   r$   r%   ÚarrayN  s    

ry   c                 C   s   t | tƒrt| ƒS t| ƒS r!   )r<   rF   r   r   r5   r$   r$   r%   Ú
_printable{  s    rz   c                 C   s   t dt| ƒgƒS )a   Creates an AST node for a function call to Fortran's "allocated(...)"

    Examples
    ========

    >>> from sympy import fcode
    >>> from sympy.codegen.fnodes import allocated
    >>> alloc = allocated('x')
    >>> fcode(alloc, source_format='free')
    'allocated(x)'

    Ú	allocated©r   rz   )ry   r$   r$   r%   r{     s    r{   c                 C   s4   t dt| ƒg|rt|ƒgng  |r,t|ƒgng  ƒS )ap   Creates an AST node for a function call to Fortran's "lbound(...)"

    Parameters
    ==========

    array : Symbol or String
    dim : expr
    kind : expr

    Examples
    ========

    >>> from sympy import fcode
    >>> from sympy.codegen.fnodes import lbound
    >>> lb = lbound('arr', dim=2)
    >>> fcode(lb, source_format='free')
    'lbound(arr, 2)'

    Úlboundr|   ©ry   rx   Úkindr$   r$   r%   r}   �  s    ÿþþr}   c                 C   s4   t dt| ƒg|rt|ƒgng  |r,t|ƒgng  ƒS )NÚuboundr|   r~   r$   r$   r%   r€   «  s    ÿþþr€   c                 C   s"   t dt| ƒg|rt|ƒgng  ƒS )aR   Creates an AST node for a function call to Fortran's "shape(...)"

    Parameters
    ==========

    source : Symbol or String
    kind : expr

    Examples
    ========

    >>> from sympy import fcode
    >>> from sympy.codegen.fnodes import shape
    >>> shp = shape('x')
    >>> fcode(shp, source_format='free')
    'shape(x)'

    Úshaper|   )Úsourcer   r$   r$   r%   r�   ´  s    ÿþr�   c                 C   s4   t dt| ƒg|rt|ƒgng  |r,t|ƒgng  ƒS )a…   Creates an AST node for a function call to Fortran's "size(...)"

    Examples
    ========

    >>> from sympy import fcode, Symbol
    >>> from sympy.codegen.ast import FunctionDefinition, real, Return
    >>> from sympy.codegen.fnodes import array, sum_, size
    >>> a = Symbol('a', real=True)
    >>> body = [Return((sum_(a**2)/size(a))**.5)]
    >>> arr = array(a, dim=[':'], intent='in')
    >>> fd = FunctionDefinition(real, 'rms', [arr], body)
    >>> print(fcode(fd, source_format='free', standard=2003))
    real*8 function rms(a)
    real*8, dimension(:), intent(in) :: a
    rms = sqrt(sum(a**2)*1d0/size(a))
    end function

    Úsizer|   r~   r$   r$   r%   rƒ   Î  s    ÿþþrƒ   c                 C   s:   t dt| ƒt|ƒg|r t|ƒgng  |r2t|ƒgng  ƒS )zž Creates an AST node for a function call to Fortran's "reshape(...)"

    Parameters
    ==========

    source : Symbol or String
    shape : ArrayExpr

    Úreshaper|   )r‚   r�   ÚpadÚorderr$   r$   r%   r„   ê  s    
ÿþþr„   c                 C   s   t d| rt| ƒgng ƒS )aú   Creates an Attribute ``bind_C`` with a name.

    Parameters
    ==========

    name : str

    Examples
    ========

    >>> from sympy import fcode, Symbol
    >>> from sympy.codegen.ast import FunctionDefinition, real, Return
    >>> from sympy.codegen.fnodes import array, sum_, bind_C
    >>> a = Symbol('a', real=True)
    >>> s = Symbol('s', integer=True)
    >>> arr = array(a, dim=[s], intent='in')
    >>> body = [Return((sum_(a**2)/s)**.5)]
    >>> fd = FunctionDefinition(real, 'rms', [arr, s], body, attrs=[bind_C('rms')])
    >>> print(fcode(fd, source_format='free', standard=2003))
    real*8 function rms(a, s) bind(C, name="rms")
    real*8, dimension(s), intent(in) :: a
    integer*4 :: s
    rms = sqrt(sum(a**2)/s)
    end function

    Úbind_C)r   r   )r   r$   r$   r%   r‡   ü  s    r‡   c                   @   s0   e Zd ZdZd ZZdeiZee	ƒZ
eeƒZdS )ÚGoToa    Represents a goto statement in Fortran

    Examples
    ========

    >>> from sympy.codegen.fnodes import GoTo
    >>> go = GoTo([10, 20, 30], 'i')
    >>> from sympy import fcode
    >>> fcode(go, source_format='free')
    'go to (10, 20, 30), i'

    )Úlabelsr^   r^   N)r(   r)   r*   r+   r,   r-   r   rC   r/   r	   Z_construct_labelsr   r_   r$   r$   r$   r%   rˆ     s
   rˆ   c                   @   s(   e Zd ZdZd ZZdeiZee	ƒZ
dS )ÚFortranReturnaK   AST node explicitly mapped to a fortran "return".

    Explanation
    ===========

    Because a return statement in fortran is different from C, and
    in order to aid reuse of our codegen ASTs the ordinary
    ``.codegen.ast.Return`` is interpreted as assignment to
    the result variable of the function. If one for some reason needs
    to generate a fortran RETURN statement, this node should be used.

    Examples
    ========

    >>> from sympy.codegen.fnodes import FortranReturn
    >>> from sympy import fcode
    >>> fcode(FortranReturn('x'))
    '       return x'

    )Úreturn_valuer‹   N)r(   r)   r*   r+   r,   r-   r   rC   r/   r   Z_construct_return_valuer$   r$   r$   r%   rŠ   ,  s   rŠ   c                   @   s   e Zd ZdZdd„ ZdS )Ú	FFunctionéM   c                 C   sF   | j j}|jd | jk r*td|| jf ƒ‚d |d t|j| j	ƒ¡¡S )NÚstandardz%s requires Fortran %d or newerz{}({})z, )
Ú	__class__r(   Z	_settingsÚ_required_standardÚNotImplementedErrorÚformatri   rL   Z_printrB   )rj   rk   r   r$   r$   r%   Ú_fcodeI  s    ÿzFFunction._fcodeN)r(   r)   r*   r�   r“   r$   r$   r$   r%   rŒ   F  s   rŒ   c                   @   s   e Zd ZdZdS )ÚF95Functioné_   N)r(   r)   r*   r�   r$   r$   r$   r%   r”   Q  s   r”   c                   @   s   e Zd ZdZdZdS )Úisignz/ Fortran sign intrinsic for integer arguments. ra   N©r(   r)   r*   r+   Únargsr$   r$   r$   r%   r–   U  s   r–   c                   @   s   e Zd ZdZdZdS )Údsignz8 Fortran sign intrinsic for double precision arguments. ra   Nr—   r$   r$   r$   r%   r™   Z  s   r™   c                   @   s   e Zd ZdZdZdS )Úcmplxz& Fortran complex conversion function. ra   Nr—   r$   r$   r$   r%   rš   _  s   rš   c                   @   s   e Zd ZdZdZdS )r   z Fortran kind function. rV   Nr—   r$   r$   r$   r%   r   d  s   r   c                   @   s   e Zd ZdZdZdS )Úmergez Fortran merge function é   Nr—   r$   r$   r$   r%   r›   i  s   r›   c                   @   s   e Zd ZdZdZdd„ ZdS )Ú_literalNc                 O   sp   d  | j¡|   d¡\}}| d¡ d¡}|d |dd …  d¡ }}|dkrRdn|}|p\d| j | |pld S )	Nz%.{}eÚeÚ0Ú.r   rV   ú+Ú )r’   Ú	_decimalsÚsplitÚstripÚrstripÚlstripÚ_token)rj   rk   rB   ÚkwargsZmantissaZsgnd_exZex_sgnZex_numr$   r$   r%   r“   r  s
    z_literal._fcode)r(   r)   r*   r¨   r£   r“   r$   r$   r$   r%   r�   n  s   r�   c                   @   s   e Zd ZdZdZdZdS )Ú
literal_spz' Fortran single precision real literal rž   é	   N©r(   r)   r*   r+   r¨   r£   r$   r$   r$   r%   rª   z  s   rª   c                   @   s   e Zd ZdZdZdZdS )Ú
literal_dpz' Fortran double precision real literal Údé   Nr¬   r$   r$   r$   r%   r­   €  s   r­   c                   @   s.   e Zd Zd ZZeedœZeeƒZ	eeƒZ
dS )Úsum_©ry   rx   Úmask©rx   r²   N©r(   r)   r*   r,   r-   r   rC   r/   r   Z_construct_arrayZ_construct_dimr$   r$   r$   r%   r°   †  s   
r°   c                   @   s.   e Zd Zd ZZeedœZeeƒZ	eeƒZ
dS )Úproduct_r±   r³   Nr´   r$   r$   r$   r%   rµ   �  s   
rµ   )N)NN)NN)N)NN)NN)N)Jr+   Zsympy.codegen.astr   r   r   r   r   r   r   r	   r
   Zsympy.core.basicr   Zsympy.core.containersr   Zsympy.core.exprr   Zsympy.core.functionr   Zsympy.core.numbersr   r   Zsympy.core.symbolr   Zsympy.core.sympifyr   Zsympy.logicr   r   Zsympy.utilities.iterablesr   r   r   r   r   r   r   r   r1   r7   r8   rD   rJ   rO   rP   r[   r]   r`   Zassumed_extentrn   Zassumed_sizery   rz   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%   Ú<module>   sj   ,%!#-

	



