
    \h                     n    S SK Jr  SSKJrJr  SSKJr  SSKJrJ	r	  SSK
Jr  SSKJrJr   " S S	\5      rg
)   )
MatrixExpr    )FunctionClassLambda)Dummy)_sympifysympify)Matrix)reimc                   ^   ^  \ rS rSrSrU 4S jr\S 5       r\S 5       rS r	S r
S rS	rU =r$ )
FunctionMatrix	   a*  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                   > [        U5      [        U5      p!U R                  U5        U R                  U5        [        U5      n[        U[        [
        45      (       d  [        SR                  U5      5      eSUR                  ;  a  [        SR                  U5      5      e[        U[
        5      (       d(  [        S5      [        S5      pT[        XE4U" XE5      5      n[        TU ]-  XX#5      $ )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__s         ]/var/www/auris/envauris/lib/python3.13/site-packages/sympy/matrices/expressions/funcmatrix.pyr   FunctionMatrix.__new__P   s    d^Xd^dtt%-!899F    EKK:AA%HJ J %((:uSzqA65;/Ews$66    c                      U R                   SS $ )Nr   r   argsselfs    r    shapeFunctionMatrix.shapee   s    yy1~r"   c                      U R                   S   $ )Nr   r$   r&   s    r    r   FunctionMatrix.lamdai   s    yy|r"   c                 $    U R                  X5      $ N)r   )r'   r   r   kwargss       r    _entryFunctionMatrix._entrym   s    zz!r"   c                 d    SSK Jn  SSKJn  U" U 5      R	                  U5      R                  5       $ )Nr   )Trace)Sum) sympy.matrices.expressions.tracer2   sympy.concrete.summationsr3   rewritedoit)r'   r2   r3   s      r    _eval_traceFunctionMatrix._eval_tracep   s&    :1T{""3',,..r"   c                 R    [        [        U 5      5      [        [        U 5      5      4$ r-   )r   r
   r   r&   s    r    _eval_as_real_imag!FunctionMatrix._eval_as_real_imagu   s    6$< "VD\"233r"    )__name__
__module____qualname____firstlineno____doc__r   propertyr(   r   r/   r8   r;   __static_attributes____classcell__)r   s   @r    r   r   	   sK    EL7*     /
4 4r"   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    <module>rL      s%     5 # 0 ! 7m4Z m4r"   