o
    oÇhÀ  ã                   @   sh   d dl mZ ddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZ G dd	„ d	eƒZd
S )é   )Ú
MatrixExpré    )ÚFunctionClassÚLambda)ÚDummy)Ú_sympifyÚsympify)ÚMatrix)ÚreÚimc                       sP   e Zd ZdZ‡ fdd„Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
‡  ZS )ÚFunctionMatrixaö  Represents a matrix using a function (``Lambda``) which gives
    outputs according to the coordinates of each matrix entries.

    Parameters
    ==========

    rows : nonnegative integer. Can be symbolic.

    cols : nonnegative integer. Can be symbolic.

    lamda : Function, Lambda or str
        If it is a SymPy ``Function`` or ``Lambda`` instance,
        it should be able to accept two arguments which represents the
        matrix coordinates.

        If it is a pure string containing Python ``lambda`` semantics,
        it is interpreted by the SymPy parser and casted into a SymPy
        ``Lambda`` instance.

    Examples
    ========

    Creating a ``FunctionMatrix`` from ``Lambda``:

    >>> from sympy import FunctionMatrix, symbols, Lambda, MatPow
    >>> i, j, n, m = symbols('i,j,n,m')
    >>> FunctionMatrix(n, m, Lambda((i, j), i + j))
    FunctionMatrix(n, m, Lambda((i, j), i + j))

    Creating a ``FunctionMatrix`` from a SymPy function:

    >>> from sympy import KroneckerDelta
    >>> X = FunctionMatrix(3, 3, KroneckerDelta)
    >>> X.as_explicit()
    Matrix([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]])

    Creating a ``FunctionMatrix`` from a SymPy undefined function:

    >>> from sympy import Function
    >>> f = Function('f')
    >>> X = FunctionMatrix(3, 3, f)
    >>> X.as_explicit()
    Matrix([
    [f(0, 0), f(0, 1), f(0, 2)],
    [f(1, 0), f(1, 1), f(1, 2)],
    [f(2, 0), f(2, 1), f(2, 2)]])

    Creating a ``FunctionMatrix`` from Python ``lambda``:

    >>> FunctionMatrix(n, m, 'lambda i, j: i + j')
    FunctionMatrix(n, m, Lambda((i, j), i + j))

    Example of lazy evaluation of matrix product:

    >>> Y = FunctionMatrix(1000, 1000, Lambda((i, j), i + j))
    >>> isinstance(Y*Y, MatPow) # this is an expression object
    True
    >>> (Y**2)[10,10] # So this is evaluated lazily
    342923500

    Notes
    =====

    This class provides an alternative way to represent an extremely
    dense matrix with entries in some form of a sequence, in a most
    sparse way.
    c                    s¤   t |ƒt |ƒ}}|  |¡ |  |¡ t|ƒ}t|ttfƒs%td |¡ƒ‚d|jvr1td |¡ƒ‚t|tƒsIt	dƒt	dƒ}}t||f|||ƒƒ}t
ƒ  | |||¡S )Nz4{} should be compatible with SymPy function classes.é   z({} should be able to accept 2 arguments.ÚiÚj)r   Ú
_check_dimr   Ú
isinstancer   r   Ú
ValueErrorÚformatÚnargsr   ÚsuperÚ__new__)ÚclsÚrowsÚcolsÚlamdar   r   ©Ú	__class__© úy/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/matrices/expressions/funcmatrix.pyr   P   s"   

þ
ÿ
zFunctionMatrix.__new__c                 C   s   | j dd… S )Nr   r   ©Úargs©Úselfr   r   r   Úshapee   s   zFunctionMatrix.shapec                 C   s
   | j d S )Nr   r   r!   r   r   r   r   i   s   
zFunctionMatrix.lamdac                 K   s   |   ||¡S ©N)r   )r"   r   r   Úkwargsr   r   r   Ú_entrym   s   zFunctionMatrix._entryc                 C   s*   ddl m} ddlm} || ƒ |¡ ¡ S )Nr   )ÚTrace)ÚSum)Ú sympy.matrices.expressions.tracer'   Úsympy.concrete.summationsr(   ÚrewriteÚdoit)r"   r'   r(   r   r   r   Ú_eval_tracep   s   zFunctionMatrix._eval_tracec                 C   s   t t| ƒƒtt| ƒƒfS r$   )r
   r	   r   r!   r   r   r   Ú_eval_as_real_imagu   s   z!FunctionMatrix._eval_as_real_imag)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr#   r   r&   r-   r.   Ú__classcell__r   r   r   r   r   	   s    F

r   N)Úmatexprr   Úsympy.core.functionr   r   Úsympy.core.symbolr   Úsympy.core.sympifyr   r   Úsympy.matricesr	   Ú$sympy.functions.elementary.complexesr
   r   r   r   r   r   r   Ú<module>   s    