§
    OŠtj›{  ã                   óÄ  — d dl mZmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZmZ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 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* d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6  G d„ de'¦  «        Z7 G d„ de7¦  «        Z8d„ Z9d„ Z:d„ Z;d„ Z<d„ Z=d„ Z>d„ Z?d „ Z@d!„ ZAd"„ ZBd#„ ZCd$„ ZDd%„ ZEd&„ ZFd'„ ZGd(S ))é    )ÚQÚask)ÚBasicÚAddÚMulÚS©Ú_sympify)ÚreÚim)ÚtypedÚexhaustÚ	conditionÚdo_oneÚunpack)Ú	bottom_up)Úis_sequenceÚsift)Ú
filldedent)ÚMatrixÚ
ShapeError)ÚNonInvertibleMatrixError)ÚdetÚDeterminant)ÚInverse)ÚMatAdd)Ú
MatrixExprÚMatrixElement)ÚMatMul)ÚMatPow©ÚMatrixSlice)Ú
ZeroMatrixÚIdentity©Útrace)Ú	TransposeÚ	transposec                   ó  ‡ — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zed„ ¦   «         Zed„ ¦   «         Zˆ fd„Zˆ xZS )ÚBlockMatrixau  A BlockMatrix is a Matrix comprised of other matrices.

    The submatrices are stored in a SymPy Matrix object but accessed as part of
    a Matrix Expression

    >>> from sympy import (MatrixSymbol, BlockMatrix, symbols,
    ...     Identity, ZeroMatrix, block_collapse)
    >>> n,m,l = symbols('n m l')
    >>> X = MatrixSymbol('X', n, n)
    >>> Y = MatrixSymbol('Y', m, m)
    >>> Z = MatrixSymbol('Z', n, m)
    >>> B = BlockMatrix([[X, Z], [ZeroMatrix(m,n), Y]])
    >>> print(B)
    Matrix([
    [X, Z],
    [0, Y]])

    >>> C = BlockMatrix([[Identity(n), Z]])
    >>> print(C)
    Matrix([[I, Z]])

    >>> print(block_collapse(C*B))
    Matrix([[X, Z + Z*Y]])

    Some matrices might be comprised of rows of blocks with
    the matrices in each row having the same height and the
    rows all having the same total number of columns but
    not having the same number of columns for each matrix
    in each row. In this case, the matrix is not a block
    matrix and should be instantiated by Matrix.

    >>> from sympy import ones, Matrix
    >>> dat = [
    ... [ones(3,2), ones(3,3)*2],
    ... [ones(2,3)*3, ones(2,2)*4]]
    ...
    >>> BlockMatrix(dat)
    Traceback (most recent call last):
    ...
    ValueError:
    Although this matrix is comprised of blocks, the blocks do not fill
    the matrix in a size-symmetric fashion. To create a full matrix from
    these arguments, pass them directly to Matrix.
    >>> Matrix(dat)
    Matrix([
    [1, 1, 2, 2, 2],
    [1, 1, 2, 2, 2],
    [1, 1, 2, 2, 2],
    [3, 3, 3, 4, 4],
    [3, 3, 3, 4, 4]])

    See Also
    ========
    sympy.matrices.matrixbase.MatrixBase.irregular
    c           	      ó¢  ‡	‡
‡— ddl m} d„ Š
t          |¦  «        dk    s:t          |d         ¦  «        r%t          ˆ
fd„|d         D ¦   «         ¦  «        dk    rt	          t          d¦  «        ¦  «        ‚|r|d         ng Š ‰
‰¦  «        �s‰r ‰
‰d         ¦  «        r‰gŠt          d„ ‰D ¦   «         ¦  «        dk    x}}|r�‰D ]#}t          d„ |D ¦   «         ¦  «        dk    }|s nŒ$|}|rct          t          ‰d         ¦  «        ¦  «        D ]@Š	t          ˆ	ˆfd	„t          t          ‰¦  «        ¦  «        D ¦   «         ¦  «        dk    }|s nŒA|sYt          d
„ ‰D ¦   «         ¦  «        dk    }|r|rt	          t          d¦  «        ¦  «        ‚t	          t          d¦  «        ¦  «        ‚ |‰d¬¦  «        }t          j        | |¦  «        }|S )Nr   ©ÚImmutableDenseMatrixc                 ó$   — t          | dd¦  «        S )NÚ	is_MatrixF)Úgetattr)Úis    úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/matrices/expressions/blockmatrix.pyú<lambda>z%BlockMatrix.__new__.<locals>.<lambda>R   s   € �' ! [°%Ñ8Ô8€ ó    é   c                 ó&   •— h | ]} ‰|¦  «        ’ŒS © r7   )Ú.0ÚrÚisMats     €r2   ú	<setcomp>z&BlockMatrix.__new__.<locals>.<setcomp>U   s!   ø€ Ð/Ð/Ð/ !�U�U˜1‘X”XÐ/Ð/Ð/r4   z\
                expecting a sequence of 1 or more rows
                containing Matrices.c                 ó,   — h | ]}t          |¦  «        ’ŒS r7   )Úlen©r8   r9   s     r2   r;   z&BlockMatrix.__new__.<locals>.<setcomp>_   s   € Ð4Ð4Ð4¨!�s 1™vœvÐ4Ð4Ð4r4   c                 ó   — h | ]	}|j         ’Œ
S r7   ©Úrows©r8   r1   s     r2   r;   z&BlockMatrix.__new__.<locals>.<setcomp>c   s   € Ð0Ð0Ð0¨˜aœfÐ0Ð0Ð0r4   c                 ó6   •— h | ]}‰|         ‰         j         ’ŒS r7   ©Úcols)r8   r1   ÚcrA   s     €€r2   r;   z&BlockMatrix.__new__.<locals>.<setcomp>j   s3   ø€ ð "7ð "7ð "7Ø !ð #' q¤'¨!¤*¤/ð "7ð "7ð "7r4   c                 ó@   — h | ]}t          d „ |D ¦   «         ¦  «        ’ŒS )c              3   ó$   K  — | ]}|j         V — Œd S ©NrD   rB   s     r2   ú	<genexpr>z0BlockMatrix.__new__.<locals>.<setcomp>.<genexpr>q   s$   è è € Ð*Ð* 1˜œÐ*Ð*Ð*Ð*Ð*Ð*r4   )Úsumr>   s     r2   r;   z&BlockMatrix.__new__.<locals>.<setcomp>p   s<   € ð :ð :ð :Ø/0•CÐ*Ð*¨Ð*Ñ*Ô*Ñ*Ô*ð:ð :ð :r4   a0  
                        Although this matrix is comprised of blocks,
                        the blocks do not fill the matrix in a
                        size-symmetric fashion. To create a full matrix
                        from these arguments, pass them directly to
                        Matrix.a}  
                    When there are not the same number of rows in each
                    row's matrices or there are not the same number of
                    total columns in each row, the matrix is not a
                    block matrix. If this matrix is known to consist of
                    blocks fully filling a 2-D space then see
                    Matrix.irregular.F©Úevaluate)	Úsympy.matrices.immutabler-   r=   r   Ú
ValueErrorr   Úranger   Ú__new__)ÚclsÚargsÚkwargsr-   ÚblockyÚokr9   ÚmatÚobjrF   r:   rA   s            @@@r2   rQ   zBlockMatrix.__new__P   s™  øøø€ ØAÐAÐAÐAÐAÐAØ8Ð8ˆÝˆt‰9Œ9˜Š>ˆ>Ý  Q¤Ñ(Ô(ð åÐ/Ð/Ð/Ð/ t¨A¤wÐ/Ñ/Ô/Ñ0Ô0°AÒ5Ð5Ý�Zð )(ñ )ô )ñ *ô *ð *ð Ð&ˆt�AŒwˆw BˆØˆu�T‰{Œ{ñ %	+Øð ˜˜˜d 1œg™œð Ø�v�õ Ð4Ð4¨tÐ4Ñ4Ô4Ñ5Ô5¸Ò:Ð:ˆF�RØð "àð ð �AÝÐ0Ð0¨aÐ0Ñ0Ô0Ñ1Ô1°QÒ6�BØð Ø˜ðà�Øð "å"¥3 t¨A¤w¡<¤<Ñ0Ô0ð "ð "˜Ý ð "7ð "7ð "7ð "7ð "7Ý%*­3¨t©9¬9Ñ%5Ô%5ð"7ñ "7ô "7ñ 8ô 8Ø;<ò=˜à!ð "Ø!˜Eð"àð +åð :ð :Ø48ð:ñ :ô :ñ ;ô ;Ø>?ò@�àð %˜bð %Ý$¥Zð 1#ñ &$ô &$ñ %ô %ð %õ !¥ð -)ñ "*ô "*ñ +ô +ð +ð #Ð" 4°%Ð8Ñ8Ô8ˆÝŒm˜C Ñ%Ô%ˆØˆ
r4   c                 óô   — dx}}| j         }t          |j        d         ¦  «        D ]}|||df         j        d         z  }Œt          |j        d         ¦  «        D ]}||d|f         j        d         z  }Œ||fS ©Nr   r5   )ÚblocksrP   Úshape)ÚselfÚnumrowsÚnumcolsÚMr1   s        r2   r\   zBlockMatrix.shape„   sŽ   € àÐˆ�'ØŒKˆÝ�q”w˜q”zÑ"Ô"ð 	(ð 	(ˆAØ�q˜˜A˜”w”} QÔ'Ñ'ˆGˆGÝ�q”w˜q”zÑ"Ô"ð 	(ð 	(ˆAØ�q˜˜A˜”w”} QÔ'Ñ'ˆGˆGØ˜Ð!Ð!r4   c                 ó   — | j         j        S rI   ©r[   r\   ©r]   s    r2   Ú
blockshapezBlockMatrix.blockshapeŽ   s   € àŒ{Ô Ð r4   c                 ó   — | j         d         S )Nr   ©rS   rc   s    r2   r[   zBlockMatrix.blocks’   s   € àŒy˜Œ|Ðr4   c                 óP   ‡ — ˆ fd„t          ‰ j        d         ¦  «        D ¦   «         S )Nc                 ó8   •— g | ]}‰j         |d f         j        ‘ŒS ©r   )r[   rA   ©r8   r1   r]   s     €r2   ú
<listcomp>z-BlockMatrix.rowblocksizes.<locals>.<listcomp>˜   ó'   ø€ ÐJÐJÐJ¨1�”˜A˜q˜DÔ!Ô&ÐJÐJÐJr4   r   ©rP   rd   rc   s   `r2   ÚrowblocksizeszBlockMatrix.rowblocksizes–   ó,   ø€ àJÐJÐJÐJµ°d´oÀaÔ6HÑ0IÔ0IÐJÑJÔJÐJr4   c                 óP   ‡ — ˆ fd„t          ‰ j        d         ¦  «        D ¦   «         S )Nc                 ó8   •— g | ]}‰j         d |f         j        ‘ŒS ri   )r[   rE   rj   s     €r2   rk   z-BlockMatrix.colblocksizes.<locals>.<listcomp>œ   rl   r4   r5   rm   rc   s   `r2   ÚcolblocksizeszBlockMatrix.colblocksizesš   ro   r4   c                 ó¬   — t          |t          ¦  «        o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S rI   )Ú
isinstancer*   r\   rd   rn   rr   ©r]   Úothers     r2   Ústructurally_equalzBlockMatrix.structurally_equalž   sa   € Ý˜5¥+Ñ.Ô.ð :Ø”
˜eœkÒ)ð:à” 5Ô#3Ò3ð:ð Ô" eÔ&9Ò9ð:ð Ô" eÔ&9Ò9ð		;r4   c                 óŽ   — t          |t          ¦  «        r,| j        |j        k    rt          | j        |j        z  ¦  «        S | |z  S rI   )rt   r*   rr   rn   r[   ru   s     r2   Ú	_blockmulzBlockMatrix._blockmul¥   sF   € Ý�u�kÑ*Ô*ð 	9ØÔ" eÔ&9Ò9Ð9Ý˜tœ{¨5¬<Ñ7Ñ8Ô8Ð8à�e‰|Ðr4   c                 ó˜   — t          |t          ¦  «        r1|                      |¦  «        rt          | j        |j        z   ¦  «        S | |z   S rI   )rt   r*   rw   r[   ru   s     r2   Ú	_blockaddzBlockMatrix._blockadd¬   sK   € Ý�u�kÑ*Ô*ð 	;Ø×+Ò+¨EÑ2Ô2ð	;å˜tœ{¨U¬\Ñ9Ñ:Ô:Ð:à�e‰|Ðr4   c                 ó¸   — d„ | j         D ¦   «         }t          | j        d         | j        d         |¦  «        }|                     ¦   «         }t	          |¦  «        S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   ©r(   ©r8   Úmatrixs     r2   rk   z/BlockMatrix._eval_transpose.<locals>.<listcomp>µ   s    € Ð@Ð@Ð@¨&•I˜fÑ%Ô%Ð@Ð@Ð@r4   r   r5   )r[   r   rd   r(   r*   )r]   Úmatricesr`   s      r2   Ú_eval_transposezBlockMatrix._eval_transpose³   sO   € à@Ð@°D´KÐ@Ñ@Ô@ˆå�4”? 1Ô% t¤°qÔ'9¸8ÑDÔDˆà�KŠK‰MŒMˆÝ˜1‰~Œ~Ðr4   c                 ó˜   — t          t          | j        d         | j        d         | j        ¦  «                             ¦   «         ¦  «        S rZ   )r*   r   rd   r[   Úadjointrc   s    r2   Ú_eval_adjointzBlockMatrix._eval_adjoint¼   s?   € ÝÝ�4”? 1Ô% t¤°qÔ'9¸4¼;ÑGÔG×OÒOÑQÔQñ
ô 
ð 	
r4   c                 óš   ‡ — ‰ j         ‰ j        k    r9ˆ fd„t          ‰ j        d         ¦  «        D ¦   «         }t	          d„ |D ¦   «         Ž S d S )Nc                 ó.   •— g | ]}‰j         ||f         ‘ŒS r7   )r[   rj   s     €r2   rk   z+BlockMatrix._eval_trace.<locals>.<listcomp>Ã   s$   ø€ ÐKÐKÐK¨A�d”k ! Q $Ô'ÐKÐKÐKr4   r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   r%   ©r8   Úblocks     r2   rk   z+BlockMatrix._eval_trace.<locals>.<listcomp>Ä   s   € Ð:Ð:Ð:¨%�˜u™œÐ:Ð:Ð:r4   )rn   rr   rP   rd   r   )r]   r[   s   ` r2   Ú_eval_tracezBlockMatrix._eval_traceÁ   s^   ø€ ØÔ Ô!3Ò3Ð3ØKÐKÐKÐKµ°t´ÀqÔ7IÑ1JÔ1JÐKÑKÔKˆFÝÐ:Ð:°6Ð:Ñ:Ô:Ð;Ð;ð 4Ð3r4   c                 óü  — | j         dk    rt          | j        d         ¦  «        S | j         dk    r¾| j                             ¦   «         \  \  }}\  }}t	          t          j        |¦  «        ¦  «        r-t          |¦  «        t          |||j        z  |z  z
  ¦  «        z  S t	          t          j        |¦  «        ¦  «        r-t          |¦  «        t          |||j        z  |z  z
  ¦  «        z  S t          | ¦  «        S )N©r5   r5   ©r   r   ©é   r�   )	rd   r   r[   Útolistr   r   Ú
invertibleÚIr   )r]   ÚAÚBÚCÚDs        r2   Ú_eval_determinantzBlockMatrix._eval_determinantÆ   sà   € ØŒ?˜fÒ$Ð$Ý�t”{ 4Ô(Ñ)Ô)Ð)ØŒ?˜fÒ$Ð$à”{×)Ò)Ñ+Ô+ñ‰Vˆa�Ùˆa�Ý•1”< ‘?”?Ñ#Ô#ð /Ý˜1‘v”v�c ! a¨¬¡e¨A¡g¡+Ñ.Ô.Ñ.Ð.Ý•Q”\ !‘_”_Ñ%Ô%ð /Ý˜1‘v”v�c ! a¨¬¡e¨A¡g¡+Ñ.Ô.Ñ.Ð.Ý˜4Ñ Ô Ð r4   c                 ó  — d„ | j         D ¦   «         }t          | j        d         | j        d         |¦  «        }d„ | j         D ¦   «         }t          | j        d         | j        d         |¦  «        }t          |¦  «        t          |¦  «        fS )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   )r   r   s     r2   rk   z2BlockMatrix._eval_as_real_imag.<locals>.<listcomp>Ó   s   € Ð>Ð>Ð>¨�˜F™œÐ>Ð>Ð>r4   r   r5   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   )r   r   s     r2   rk   z2BlockMatrix._eval_as_real_imag.<locals>.<listcomp>Ö   s   € Ð<Ð<Ð< f•r˜&‘z”zÐ<Ð<Ð<r4   )r[   r   rd   r*   )r]   Úreal_matricesÚim_matricess      r2   Ú_eval_as_real_imagzBlockMatrix._eval_as_real_imagÒ   s…   € Ø>Ð>°$´+Ð>Ñ>Ô>ˆÝ˜tœ¨qÔ1°4´?À1Ô3EÀ}ÑUÔUˆà<Ð<°´Ð<Ñ<Ô<ˆÝ˜Tœ_¨QÔ/°´ÀÔ1CÀ[ÑQÔQˆå˜MÑ*Ô*­K¸Ñ,DÔ,DÐEÐEr4   c                 óP   — t          | j                             |¦  «        ¦  «        S rI   )r*   r[   Údiff)r]   Úxs     r2   Ú_eval_derivativezBlockMatrix._eval_derivativeÛ   s    € Ý˜4œ;×+Ò+¨AÑ.Ô.Ñ/Ô/Ð/r4   c                 ó*   — |                       ¦   «         S )a  Return transpose of matrix.

        Examples
        ========

        >>> from sympy import MatrixSymbol, BlockMatrix, ZeroMatrix
        >>> from sympy.abc import m, n
        >>> X = MatrixSymbol('X', n, n)
        >>> Y = MatrixSymbol('Y', m, m)
        >>> Z = MatrixSymbol('Z', n, m)
        >>> B = BlockMatrix([[X, Z], [ZeroMatrix(m,n), Y]])
        >>> B.transpose()
        Matrix([
        [X.T,  0],
        [Z.T, Y.T]])
        >>> _.transpose()
        Matrix([
        [X, Z],
        [0, Y]])
        )r‚   rc   s    r2   r(   zBlockMatrix.transposeÞ   s   € ð* ×#Ò#Ñ%Ô%Ð%r4   r”   Fc                 óô  — | j         dk    rß| j                             ¦   «         \  \  }}\  }}||||dœ}	 |r6||         j        ||         z                       ¦   «         ||         j        z  n||                              ¦   «         }|dk    r|||z  |z  z
  S |dk    r|||z  |z  z
  S |dk    r|||z  |z  z
  S |dk    r|||z  |z  z
  S | S # t
          $ r t          d¦  «        ‚w xY wt          d¦  «        ‚)	a  Return the Schur Complement of the 2x2 BlockMatrix

        Parameters
        ==========

        mat : String, optional
            The matrix with respect to which the
            Schur Complement is calculated. 'A' is
            used by default

        generalized : bool, optional
            If True, returns the generalized Schur
            Component which uses Moore-Penrose Inverse

        Examples
        ========

        >>> from sympy import symbols, MatrixSymbol, BlockMatrix
        >>> m, n = symbols('m n')
        >>> A = MatrixSymbol('A', n, n)
        >>> B = MatrixSymbol('B', n, m)
        >>> C = MatrixSymbol('C', m, n)
        >>> D = MatrixSymbol('D', m, m)
        >>> X = BlockMatrix([[A, B], [C, D]])

        The default Schur Complement is evaluated with "A"

        >>> X.schur()
        -C*A**(-1)*B + D
        >>> X.schur('D')
        A - B*D**(-1)*C

        Schur complement with non-invertible matrices is not
        defined. Instead, the generalized Schur complement can
        be calculated which uses the Moore-Penrose Inverse. To
        achieve this, `generalized` must be set to `True`

        >>> X.schur('B', generalized=True)
        C - D*(B.T*B)**(-1)*B.T*A
        >>> X.schur('C', generalized=True)
        -A*(C.T*C)**(-1)*C.T*D + B

        Returns
        =======

        M : Matrix
            The Schur Complement Matrix

        Raises
        ======

        ShapeError
            If the block matrix is not a 2x2 matrix

        NonInvertibleMatrixError
            If given matrix is non-invertible

        References
        ==========

        .. [1] Wikipedia Article on Schur Component : https://en.wikipedia.org/wiki/Schur_complement

        See Also
        ========

        sympy.matrices.matrixbase.MatrixBase.pinv
        r�   )r”   r•   r–   r—   r”   r•   r–   r—   z˜The given matrix is not invertible. Please set generalized=True             to compute the generalized Schur Complement which uses Moore-Penrose Inversez>Schur Complement can only be calculated for 2x2 block matrices)rd   r[   r‘   ÚTÚinvr   r   )	r]   rW   Úgeneralizedr”   r•   r–   r—   Údr¦   s	            r2   ÚschurzBlockMatrix.schurõ   sH  € ðJ Œ?˜fÒ$Ð$à”{×)Ò)Ñ+Ô+ñ‰Vˆa�Ùˆa�Ø˜a q°Ð2Ð2ˆAð[Ø:EÐW�q˜”v”x  #¤‘×+Ò+Ñ-Ô-¨a°¬f¬hÑ6Ð6È1ÈSÌ6Ï:Ê:É<Ì<�Ø˜#’:�:Ø˜q 3™w¨™{™?Ð*Ø˜C’Z�ZØ˜q 3™w¨™{™?Ð*Ø˜C’Z�ZØ˜q 3™w¨™{™?Ð*Ø˜C’Z�ZØ˜q 3™w¨™{™?Ð*à�øÝ+ð [ð [ð [Ý.ð 0Zñ [ô [ð [ð[øøøõ Ð]Ñ^Ô^Ð^s$   ¶A"C ÂC Â*C Â;C ÃC ÃC(c                 ó  — | j         dk    ræ| j                             ¦   «         \  \  }}\  }}	 |j        }n# t          $ r t	          d¦  «        ‚w xY wt          |j        d         ¦  «        }t          |j        d         ¦  «        }t          |j        Ž }t          ||g||z  |gg¦  «        }	t          ||  
                    ¦   «         ¦  «        }t          |||z  g|j        |gg¦  «        }
|	||
fS t          d¦  «        ‚)aL  Returns the Block LDU decomposition of
        a 2x2 Block Matrix

        Returns
        =======

        (L, D, U) : Matrices
            L : Lower Diagonal Matrix
            D : Diagonal Matrix
            U : Upper Diagonal Matrix

        Examples
        ========

        >>> from sympy import symbols, MatrixSymbol, BlockMatrix, block_collapse
        >>> m, n = symbols('m n')
        >>> A = MatrixSymbol('A', n, n)
        >>> B = MatrixSymbol('B', n, m)
        >>> C = MatrixSymbol('C', m, n)
        >>> D = MatrixSymbol('D', m, m)
        >>> X = BlockMatrix([[A, B], [C, D]])
        >>> L, D, U = X.LDUdecomposition()
        >>> block_collapse(L*D*U)
        Matrix([
        [A, B],
        [C, D]])

        Raises
        ======

        ShapeError
            If the block matrix is not a 2x2 matrix

        NonInvertibleMatrixError
            If the matrix "A" is non-invertible

        See Also
        ========
        sympy.matrices.expressions.blockmatrix.BlockMatrix.UDLdecomposition
        sympy.matrices.expressions.blockmatrix.BlockMatrix.LUdecomposition
        r�   zTBlock LDU decomposition cannot be calculated when                    "A" is singularr   r5   z@Block LDU decomposition is supported only for 2x2 block matrices)rd   r[   r‘   r“   r   r$   r\   r#   r*   ÚBlockDiagMatrixr©   r¥   r   )r]   r”   r•   r–   r—   ÚAIÚIpÚIqÚZÚLÚUs              r2   ÚLDUdecompositionzBlockMatrix.LDUdecompositionP  s  € ðT Œ?˜eÒ#Ð#à”{×)Ò)Ñ+Ô+ñ‰Vˆa�Ùˆa�ð&Ø”S��øÝ+ð &ð &ð &Ý.ð 0%ñ &ô &ð &ð&øøøõ ˜!œ' !œ*Ñ%Ô%ˆBÝ˜!œ' !œ*Ñ%Ô%ˆBÝ˜AœGÐ$ˆAÝ˜b !˜W q¨¡t¨R jÐ1Ñ2Ô2ˆAÝ  4§:¢:¡<¤<Ñ0Ô0ˆAÝ˜b " Q¡$˜Z¨¬¨b¨	Ð2Ñ3Ô3ˆAØ�a˜�7ˆNåÐ_Ñ`Ô`Ð`ó	   ¯7 ·Ac                 ó  — | j         dk    rç| j                             ¦   «         \  \  }}\  }}	 |j        }n# t          $ r t	          d¦  «        ‚w xY wt          |j        d         ¦  «        }t          |j        d         ¦  «        }t          |j        Ž }t          |||z  g|j	        |gg¦  «        }	t          |                      d¦  «        |¦  «        }t          ||g||z  |gg¦  «        }
|	||
fS t          d¦  «        ‚)aL  Returns the Block UDL decomposition of
        a 2x2 Block Matrix

        Returns
        =======

        (U, D, L) : Matrices
            U : Upper Diagonal Matrix
            D : Diagonal Matrix
            L : Lower Diagonal Matrix

        Examples
        ========

        >>> from sympy import symbols, MatrixSymbol, BlockMatrix, block_collapse
        >>> m, n = symbols('m n')
        >>> A = MatrixSymbol('A', n, n)
        >>> B = MatrixSymbol('B', n, m)
        >>> C = MatrixSymbol('C', m, n)
        >>> D = MatrixSymbol('D', m, m)
        >>> X = BlockMatrix([[A, B], [C, D]])
        >>> U, D, L = X.UDLdecomposition()
        >>> block_collapse(U*D*L)
        Matrix([
        [A, B],
        [C, D]])

        Raises
        ======

        ShapeError
            If the block matrix is not a 2x2 matrix

        NonInvertibleMatrixError
            If the matrix "D" is non-invertible

        See Also
        ========
        sympy.matrices.expressions.blockmatrix.BlockMatrix.LDUdecomposition
        sympy.matrices.expressions.blockmatrix.BlockMatrix.LUdecomposition
        r�   zTBlock UDL decomposition cannot be calculated when                    "D" is singularr   r5   r—   z@Block UDL decomposition is supported only for 2x2 block matrices)rd   r[   r‘   r“   r   r$   r\   r#   r*   r¥   r«   r©   r   )r]   r”   r•   r–   r—   ÚDIr­   r®   r¯   r±   r°   s              r2   ÚUDLdecompositionzBlockMatrix.UDLdecompositionŒ  s  € ðT Œ?˜eÒ#Ð#à”{×)Ò)Ñ+Ô+ñ‰Vˆa�Ùˆa�ð&Ø”S��øÝ+ð &ð &ð &Ý.ð 0%ñ &ô &ð &ð&øøøõ ˜!œ' !œ*Ñ%Ô%ˆBÝ˜!œ' !œ*Ñ%Ô%ˆBÝ˜AœGÐ$ˆAÝ˜b ! B¡$˜Z¨!¬#¨r¨Ð3Ñ4Ô4ˆAÝ §
¢
¨3¡¤°Ñ3Ô3ˆAÝ˜b !˜W b¨¡d¨B ZÐ0Ñ1Ô1ˆAØ�a˜�7ˆNåÐ_Ñ`Ô`Ð`r³   c                 ó´  — | j         dk    r¿| j                             ¦   «         \  \  }}\  }}	 |t          j        z  }|j        }n# t          $ r t          d¦  «        ‚w xY wt          |j        Ž }|  	                    ¦   «         t          j        z  }t          ||g||z  |gg¦  «        }t          |||z  g|j        |gg¦  «        }	||	fS t          d¦  «        ‚)a#  Returns the Block LU decomposition of
        a 2x2 Block Matrix

        Returns
        =======

        (L, U) : Matrices
            L : Lower Diagonal Matrix
            U : Upper Diagonal Matrix

        Examples
        ========

        >>> from sympy import symbols, MatrixSymbol, BlockMatrix, block_collapse
        >>> m, n = symbols('m n')
        >>> A = MatrixSymbol('A', n, n)
        >>> B = MatrixSymbol('B', n, m)
        >>> C = MatrixSymbol('C', m, n)
        >>> D = MatrixSymbol('D', m, m)
        >>> X = BlockMatrix([[A, B], [C, D]])
        >>> L, U = X.LUdecomposition()
        >>> block_collapse(L*U)
        Matrix([
        [A, B],
        [C, D]])

        Raises
        ======

        ShapeError
            If the block matrix is not a 2x2 matrix

        NonInvertibleMatrixError
            If the matrix "A" is non-invertible

        See Also
        ========
        sympy.matrices.expressions.blockmatrix.BlockMatrix.UDLdecomposition
        sympy.matrices.expressions.blockmatrix.BlockMatrix.LDUdecomposition
        r�   zSBlock LU decomposition cannot be calculated when                    "A" is singularz?Block LU decomposition is supported only for 2x2 block matrices)rd   r[   r‘   r   ÚHalfr“   r   r#   r\   r©   r*   r¥   r   )
r]   r”   r•   r–   r—   r¬   r¯   r   r°   r±   s
             r2   ÚLUdecompositionzBlockMatrix.LUdecompositionÈ  sø   € ðR Œ?˜eÒ#Ð#à”{×)Ò)Ñ+Ô+ñ‰Vˆa�Ùˆa�ð&Ø•q”v‘I�Ø”S��øÝ+ð &ð &ð &Ý.ð 0%ñ &ô &ð &ð&øøøõ ˜AœGÐ$ˆAØ—
’
‘”�aœfÑ$ˆAÝ˜a ˜V a¨¡d¨A YÐ/Ñ0Ô0ˆAÝ˜a  A¡˜Y¨¬¨Q xÐ0Ñ1Ô1ˆAØ�a�4ˆKåÐ^Ñ_Ô_Ð_s   ¯A ÁA c                 ó¤  — ||}}t          | j        ¦  «        D ]F\  }}||k     }|dk    r n4|dk    r||z  }Œ|| j        d         dz
  k     rt          | ||¦  «        c S ŒGt          | j        ¦  «        D ]F\  }	}
||
k     }|dk    r n4|dk    r||
z  }Œ|	| j        d         dz
  k     rt          | ||¦  «        c S ŒG| j        ||	f         ||f         S )NTFr   r5   )Ú	enumeratern   rd   r   rr   r[   )r]   r1   ÚjrT   Úorig_iÚorig_jÚ	row_blockr^   ÚcmpÚ	col_blockr_   s              r2   Ú_entryzBlockMatrix._entry  s$  € à˜A�ˆÝ"+¨DÔ,>Ñ"?Ô"?ð 	;ð 	;ÑˆI�wØ�g’+ˆCØ�dŠ{ˆ{Ø�Ø˜’�Ø�W‘��Ø˜Tœ_¨QÔ/°!Ñ3Ò3Ð3å$ T¨6°6Ñ:Ô:Ð:Ð:Ð:ð 4õ #,¨DÔ,>Ñ"?Ô"?ð 	;ð 	;ÑˆI�wØ�g’+ˆCØ�dŠ{ˆ{Ø�Ø˜’�Ø�W‘��Ø˜Tœ_¨QÔ/°!Ñ3Ò3Ð3Ý$ T¨6°6Ñ:Ô:Ð:Ð:Ð:ð 4àŒ{˜9 iÐ/Ô0°°A°Ô6Ð6r4   c                 ó.  — | j         d         | j         d         k    rdS t          | j         d         ¦  «        D ][}t          | j         d         ¦  «        D ]>}||k    r| j        ||f         j        s  dS ||k    r| j        ||f         j        s  dS Œ?Œ\dS )Nr   r5   FT)rd   rP   r[   Úis_IdentityÚis_ZeroMatrix)r]   r1   r¼   s      r2   rÄ   zBlockMatrix.is_Identity  s±   € àŒ?˜1Ô ¤°Ô!3Ò3Ð3Ø�5Ý�t” qÔ)Ñ*Ô*ð 	!ð 	!ˆAÝ˜4œ?¨1Ô-Ñ.Ô.ð !ð !�Ø�a’4�4 ¤¨A¨q¨DÔ 1Ô =�4Ø ˜5˜5˜5Ø�a’4�4 ¤¨A¨q¨DÔ 1Ô ?�4Ø ˜5˜5˜5øð	!ð
 ˆtr4   c                 ó"   — | j         | j        k    S rI   )rn   rr   rc   s    r2   Úis_structurally_symmetricz%BlockMatrix.is_structurally_symmetric$  s   € àÔ! TÔ%7Ò7Ð7r4   c                 ó¤   •— | |k    rdS t          |t          ¦  «        r| j        |j        k    rdS t          ¦   «                              |¦  «        S )NT)rt   r*   r[   ÚsuperÚequals)r]   rv   Ú	__class__s     €r2   rÊ   zBlockMatrix.equals(  sL   ø€ Ø�5Š=ˆ=Ø�4Ý�u�kÑ*Ô*ð 	¨t¬{¸e¼lÒ/JÐ/JØ�4Ý‰wŒw�~Š~˜eÑ$Ô$Ð$r4   )r”   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rQ   Úpropertyr\   rd   r[   rn   rr   rw   ry   r{   r‚   r…   r‹   r˜   rž   r¢   r(   r©   r²   r¶   r¹   rÂ   rÄ   rÇ   rÊ   Ú__classcell__)rË   s   @r2   r*   r*      s  ø€ € € € € ð6ð 6ðn2ð 2ð 2ðh ð"ð "ñ „Xð"ð ð!ð !ñ „Xð!ð ðð ñ „Xðð ðKð Kñ „XðKð ðKð Kñ „XðKð;ð ;ð ;ðð ð ðð ð ðð ð ð
ð 
ð 
ð
<ð <ð <ð

!ð 
!ð 
!ðFð Fð Fð0ð 0ð 0ð&ð &ð &ð.Y_ð Y_ð Y_ð Y_ðv:að :að :aðx:að :að :aðx8`ð 8`ð 8`ðt7ð 7ð 7ð, ð	ð 	ñ „Xð	ð ð8ð 8ñ „Xð8ð%ð %ð %ð %ð %ð %ð %ð %ð %r4   r*   c                   óÈ   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
ed„ ¦   «         Zd	„ Zd
„ Zdd„Zd„ Zd„ Zd„ Zd„ ZdS )r«   að  A sparse matrix with block matrices along its diagonals

    Examples
    ========

    >>> from sympy import MatrixSymbol, BlockDiagMatrix, symbols
    >>> n, m, l = symbols('n m l')
    >>> X = MatrixSymbol('X', n, n)
    >>> Y = MatrixSymbol('Y', m, m)
    >>> BlockDiagMatrix(X, Y)
    Matrix([
    [X, 0],
    [0, Y]])

    Notes
    =====

    If you want to get the individual diagonal blocks, use
    :meth:`get_diag_blocks`.

    See Also
    ========

    sympy.matrices.dense.diag
    c                 óD   — t          j        t          gd„ |D ¦   «         ¢R Ž S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   r	   )r8   Úms     r2   rk   z+BlockDiagMatrix.__new__.<locals>.<listcomp>K  s   € Ð/JÐ/JÐ/JÀµ¸±´Ð/JÐ/JÐ/Jr4   )r   rQ   r«   )rR   Úmatss     r2   rQ   zBlockDiagMatrix.__new__J  s)   € ÝŒ}�_ÐKÐ/JÐ/JÀTÐ/JÑ/JÔ/JÐKÐKÐKÐKr4   c                 ó   — | j         S rI   rf   rc   s    r2   ÚdiagzBlockDiagMatrix.diagM  s
   € àŒyÐr4   c                 óˆ   ‡— ddl m} | j        Šˆfd„t          t	          ‰¦  «        ¦  «        D ¦   «         } ||d¬¦  «        S )Nr   r,   c                 ód   •‡— g | ]+Šˆˆfd „t          t          ‰¦  «        ¦  «        D ¦   «         ‘Œ,S )c                 óx   •— g | ]6}‰|k    r‰‰         n%t          ‰‰         j        ‰|         j        ¦  «        ‘Œ7S r7   )r#   rA   rE   )r8   r¼   r1   rÖ   s     €€r2   rk   z5BlockDiagMatrix.blocks.<locals>.<listcomp>.<listcomp>U  sO   ø€ ð 3ð 3ð 3Øð  šF˜F��a”�­
°4¸´7´<ÀÀaÄÄÑ(NÔ(Nð 3ð 3ð 3r4   )rP   r=   )r8   r1   rÖ   s    @€r2   rk   z*BlockDiagMatrix.blocks.<locals>.<listcomp>U  s^   øø€ ð 3ð 3ð 3àð3ð 3ð 3ð 3ð 3Ý!&¥s¨4¡y¤yÑ!1Ô!1ð3ñ 3ô 3ð 3ð 3ð 3r4   FrL   )rN   r-   rS   rP   r=   )r]   r-   ÚdatarÖ   s      @r2   r[   zBlockDiagMatrix.blocksQ  sj   ø€ àAÐAÐAÐAÐAÐAØŒyˆð3ð 3ð 3ð 3å!&¥s¨4¡y¤yÑ!1Ô!1ð3ñ 3ô 3ˆð $Ð# D°5Ð9Ñ9Ô9Ð9r4   c                 óz   — t          d„ | j        D ¦   «         ¦  «        t          d„ | j        D ¦   «         ¦  «        fS )Nc              3   ó$   K  — | ]}|j         V — Œd S rI   r@   r‰   s     r2   rJ   z(BlockDiagMatrix.shape.<locals>.<genexpr>\  ó$   è è € Ð6Ð6 5�E”JÐ6Ð6Ð6Ð6Ð6Ð6r4   c              3   ó$   K  — | ]}|j         V — Œd S rI   rD   r‰   s     r2   rJ   z(BlockDiagMatrix.shape.<locals>.<genexpr>]  rß   r4   )rK   rS   rc   s    r2   r\   zBlockDiagMatrix.shapeZ  sD   € åÐ6Ð6¨D¬IÐ6Ñ6Ô6Ñ6Ô6ÝÐ6Ð6¨D¬IÐ6Ñ6Ô6Ñ6Ô6ð8ð 	8r4   c                 ó2   — t          | j        ¦  «        }||fS rI   )r=   rS   )r]   Úns     r2   rd   zBlockDiagMatrix.blockshape_  s   € å�”	‰NŒNˆØ�1ˆvˆr4   c                 ó$   — d„ | j         D ¦   «         S )Nc                 ó   — g | ]	}|j         ‘Œ
S r7   r@   r‰   s     r2   rk   z1BlockDiagMatrix.rowblocksizes.<locals>.<listcomp>f  ó   € Ð2Ð2Ð2˜u�”
Ð2Ð2Ð2r4   rf   rc   s    r2   rn   zBlockDiagMatrix.rowblocksizesd  ó   € à2Ð2¨¬	Ð2Ñ2Ô2Ð2r4   c                 ó$   — d„ | j         D ¦   «         S )Nc                 ó   — g | ]	}|j         ‘Œ
S r7   rD   r‰   s     r2   rk   z1BlockDiagMatrix.colblocksizes.<locals>.<listcomp>j  rå   r4   rf   rc   s    r2   rr   zBlockDiagMatrix.colblocksizesh  ræ   r4   c                 ó>   — t          d„ | j        D ¦   «         ¦  «        S )z%Returns true if all blocks are squarec              3   ó$   K  — | ]}|j         V — Œd S rI   )Ú	is_square©r8   rW   s     r2   rJ   z5BlockDiagMatrix._all_square_blocks.<locals>.<genexpr>n  s$   è è € Ð6Ð6 S�3”=Ð6Ð6Ð6Ð6Ð6Ð6r4   )ÚallrS   rc   s    r2   Ú_all_square_blocksz"BlockDiagMatrix._all_square_blocksl  s!   € åÐ6Ð6¨D¬IÐ6Ñ6Ô6Ñ6Ô6Ð6r4   c                 ór   — |                       ¦   «         rt          d„ | j        D ¦   «         Ž S t          j        S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   )r   rì   s     r2   rk   z5BlockDiagMatrix._eval_determinant.<locals>.<listcomp>r  s   € Ð7Ð7Ð7 c�˜S™œÐ7Ð7Ð7r4   )rî   r   rS   r   ÚZerorc   s    r2   r˜   z!BlockDiagMatrix._eval_determinantp  s;   € Ø×"Ò"Ñ$Ô$ð 	9ÝÐ7Ð7¨T¬YÐ7Ñ7Ô7Ð8Ð8õ Œvˆr4   Úignoredc                 óx   — |                       ¦   «         rt          d„ | j        D ¦   «         Ž S t          d¦  «        ‚)Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS r7   )Úinverserì   s     r2   rk   z1BlockDiagMatrix._eval_inverse.<locals>.<listcomp>y  s    € Ð$HÐ$HÐ$H°s S§[¢[¡]¤]Ð$HÐ$HÐ$Hr4   z Matrix det == 0; not invertible.)rî   r«   rS   r   )r]   Úexpands     r2   Ú_eval_inversezBlockDiagMatrix._eval_inversew  sB   € Ø×"Ò"Ñ$Ô$ð 	JÝ"Ð$HÐ$H¸d¼iÐ$HÑ$HÔ$HÐIÐIå&Ð'IÑJÔJÐJr4   c                 ó2   — t          d„ | j        D ¦   «         Ž S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS r7   r~   rì   s     r2   rk   z3BlockDiagMatrix._eval_transpose.<locals>.<listcomp>~  s    € Ð FÐ FÐ F°S §¢¡¤Ð FÐ FÐ Fr4   )r«   rS   rc   s    r2   r‚   zBlockDiagMatrix._eval_transpose}  s   € ÝÐ FÐ F¸D¼IÐ FÑ FÔ FÐGÐGr4   c                 óØ   — t          |t          ¦  «        r;| j        |j        k    r+t          d„ t	          | j        |j        ¦  «        D ¦   «         Ž S t                               | |¦  «        S )Nc                 ó   — g | ]
\  }}||z  ‘ŒS r7   r7   ©r8   ÚaÚbs      r2   rk   z-BlockDiagMatrix._blockmul.<locals>.<listcomp>ƒ  s    € Ð$PÐ$PÐ$P©T¨Q° Q q¡SÐ$PÐ$PÐ$Pr4   )rt   r«   rr   rn   ÚziprS   r*   ry   ru   s     r2   ry   zBlockDiagMatrix._blockmul€  sc   € Ý�u�oÑ.Ô.ð 	6ØÔ" eÔ&9Ò9Ð9Ý"Ð$PÐ$PµS¸¼ÀEÄJÑ5OÔ5OÐ$PÑ$PÔ$PÐQÐQå×(Ò(¨¨uÑ5Ô5Ð5r4   c                 ó  — t          |t          ¦  «        r[| j        |j        k    rK| j        |j        k    r;| j        |j        k    r+t          d„ t          | j        |j        ¦  «        D ¦   «         Ž S t                               | |¦  «        S )Nc                 ó   — g | ]
\  }}||z   ‘ŒS r7   r7   rü   s      r2   rk   z-BlockDiagMatrix._blockadd.<locals>.<listcomp>Œ  s    € Ð$RÐ$RÐ$R©t¨q°! Q¨¡UÐ$RÐ$RÐ$Rr4   )	rt   r«   rd   rn   rr   rÿ   rS   r*   r{   ru   s     r2   r{   zBlockDiagMatrix._blockadd‡  s„   € Ý�u�oÑ.Ô.ð 	6Ø” 5Ô#3Ò3Ð3ØÔ" eÔ&9Ò9Ð9ØÔ" eÔ&9Ò9Ð9Ý"Ð$RÐ$Rµs¸4¼9ÀeÄjÑ7QÔ7QÐ$RÑ$RÔ$RÐSÐSå×(Ò(¨¨uÑ5Ô5Ð5r4   c                 ó   — | j         S )a  Return the list of diagonal blocks of the matrix.

        Examples
        ========

        >>> from sympy import BlockDiagMatrix, Matrix

        >>> A = Matrix([[1, 2], [3, 4]])
        >>> B = Matrix([[5, 6], [7, 8]])
        >>> M = BlockDiagMatrix(A, B)

        How to get diagonal blocks from the block diagonal matrix:

        >>> diag_blocks = M.get_diag_blocks()
        >>> diag_blocks[0]
        Matrix([
        [1, 2],
        [3, 4]])
        >>> diag_blocks[1]
        Matrix([
        [5, 6],
        [7, 8]])
        rf   rc   s    r2   Úget_diag_blockszBlockDiagMatrix.get_diag_blocks�  s   € ð0 ŒyÐr4   N)rò   )rÌ   rÍ   rÎ   rÏ   rQ   rÐ   rØ   r[   r\   rd   rn   rr   rî   r˜   r÷   r‚   ry   r{   r  r7   r4   r2   r«   r«   0  sG  € € € € € ðð ð2Lð Lð Lð ðð ñ „Xðð ð:ð :ñ „Xð:ð ð8ð 8ñ „Xð8ð ðð ñ „Xðð ð3ð 3ñ „Xð3ð ð3ð 3ñ „Xð3ð7ð 7ð 7ðð ð ðKð Kð Kð KðHð Hð Hð6ð 6ð 6ð6ð 6ð 6ðð ð ð ð r4   r«   c                 óú  — ddl m} d„ }t          |t          t          t          t          t          ¦  «        t          t          t          t          ¦  «        t          t          t          t          t          t          t           t          t"          t$          ¦  «        i¦  «        ¦  «        }t'          t)          t'          |¦  «        |¬¦  «        ¦  «        } || ¦  «        }t+          |dd¦  «        }|�
 |¦   «         S |S )a  Evaluates a block matrix expression

    >>> from sympy import MatrixSymbol, BlockMatrix, symbols, Identity, ZeroMatrix, block_collapse
    >>> n,m,l = symbols('n m l')
    >>> X = MatrixSymbol('X', n, n)
    >>> Y = MatrixSymbol('Y', m, m)
    >>> Z = MatrixSymbol('Z', n, m)
    >>> B = BlockMatrix([[X, Z], [ZeroMatrix(m, n), Y]])
    >>> print(B)
    Matrix([
    [X, Z],
    [0, Y]])

    >>> C = BlockMatrix([[Identity(n), Z]])
    >>> print(C)
    Matrix([[I, Z]])

    >>> print(block_collapse(C*B))
    Matrix([[X, Z + Z*Y]])
    r   )Úexpr_fnsc                 ó`   — t          | t          ¦  «        o|                      t          ¦  «        S rI   )rt   r   Úhasr*   ©Úexprs    r2   r3   z block_collapse.<locals>.<lambda>Â  s!   € � D­*Ñ5Ô5ÐO¸$¿(º(Å;Ñ:OÔ:O€ r4   )ÚfnsÚdoitN)Úsympy.strategies.utilr  r   r   r   r   Ú	bc_mataddÚbc_block_plus_identr   Ú	bc_matmulÚbc_distr    r'   Úbc_transposer   Ú
bc_inverser*   Ú	bc_unpackÚdeblockr   r   r0   )r	  r  ÚhasbmÚconditioned_rlÚruleÚresultr  s          r2   Úblock_collapser  «  sæ   € ð* /Ð.Ð.Ð.Ð.Ð.àOÐO€EåØÝÝ•V�IÕ':Ñ;Ô;Ý•V�I¥wÑ/Ô/Ý•YÝ�Ý•jÝ�&¥­GÑ4Ô4ð6ñ	
ô 	
ñ
ô 
€Nõ ÝÝ�NÑ#Ô#Øð	
ñ 	
ô 	
ñô €Dð ˆT�$‰ZŒZ€FÝ�6˜6 4Ñ(Ô(€DØÐØˆt‰vŒvˆàˆr4   c                 ó6   — | j         dk    r| j        d         S | S )Nr�   rŽ   )rd   r[   r  s    r2   r  r  Þ  s!   € Ø„˜&Ò Ð ØŒ{˜4Ô Ð Ø€Kr4   c                 óÊ   — t          | j        d„ ¦  «        }|d         }|s| S |d         }|d         }|dd …         D ]}|                     |¦  «        }Œ|rt          |Ž |z   S |S )Nc                 ó,   — t          | t          ¦  «        S rI   ©rt   r*   )r`   s    r2   r3   zbc_matadd.<locals>.<lambda>ä  s   € ¥Z°µ;Ñ%?Ô%?€ r4   TFr   r5   )r   rS   r{   r   )r	  rS   r[   Ú	nonblocksrŠ   rþ   s         r2   r  r  ã  s†   € Ý�”	Ð?Ð?Ñ@Ô@€DØ�$ŒZ€FØð Øˆà�U”€IØ�1ŒI€EØ�A�B�BŒZð #ð #ˆØ—’ Ñ"Ô"ˆˆØð Ý�yÐ! EÑ)Ð)àˆr4   c                 óh  ‡— d„ | j         D ¦   «         }|s| S d„ | j         D ¦   «         Š‰rˆt          ˆfd„‰D ¦   «         ¦  «        rm‰d         j        r`t          d„ ‰d         j        D ¦   «         Ž }d„ | j         D ¦   «         }t          |t          |¦  «        z  g‰¢|¢R Ž                      ¦   «         S | S )Nc                 ó    — g | ]}|j         ¯	|‘ŒS r7   )rÄ   ©r8   Úargs     r2   rk   z'bc_block_plus_ident.<locals>.<listcomp>ó  s   € Ð:Ð:Ð:�c¨#¬/Ð:ˆcÐ:Ð:Ð:r4   c                 ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r7   r  r!  s     r2   rk   z'bc_block_plus_ident.<locals>.<listcomp>÷  s'   € ÐGÐGÐG�c­*°S½+Ñ*FÔ*FÐGˆcÐGÐGÐGr4   c              3   óN   •K  — | ]}|                      ‰d          ¦  «        V — Œ dS )r   N)rw   )r8   rþ   r[   s     €r2   rJ   z&bc_block_plus_ident.<locals>.<genexpr>ø  s5   øè è € ÐGÐG¸1�q×+Ò+¨F°1¬IÑ6Ô6ÐGÐGÐGÐGÐGÐGr4   r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r7   )r$   )r8   Úks     r2   rk   z'bc_block_plus_ident.<locals>.<listcomp>ú  s4   € ð %Jð %Jð %JØ,-õ &.¨a¡[¤[ð %Jð %Jð %Jr4   c                 óJ   — g | ] }|j         °	t          |t          ¦  «        °|‘Œ!S r7   )rÄ   rt   r*   r!  s     r2   rk   z'bc_block_plus_ident.<locals>.<listcomp>ü  s0   € ÐeÐeÐe˜°´ÐeÍ
ÐSVÕXcÑHdÔHdÐe�ÐeÐeÐer4   )rS   rí   rÇ   r«   rn   r   r=   r  )r	  ÚidentsÚblock_idÚrestr[   s       @r2   r  r  ò  s÷   ø€ Ø:Ð:˜TœYÐ:Ñ:Ô:€FØð ØˆàGÐG˜TœYÐGÑGÔG€FØð E•3ÐGÐGÐGÐGÀÐGÑGÔGÑGÔGð EØ˜!”9Ô6ðEå"ð %Jð %JØ17¸´Ô1Hð%Jñ %Jô %Jð KˆàeÐe˜tœyÐeÑeÔeˆÝ�h¥ V¡¤Ñ,Ð=¨vÐ=¸Ð=Ð=Ð=×BÒBÑDÔDÐDà€Kr4   c                 ód  ‡‡— |                       ¦   «         \  Š}‰dk    r| S t          |¦  «        }t          |t          ¦  «        r|j        Šˆfd„‰D ¦   «         }t          |Ž S t          |t
          ¦  «        r7|j        Šˆˆfd„t          ‰j        ¦  «        D ¦   «         }t          |¦  «        S | S )z  Turn  a*[X, Y] into [a*X, a*Y] r5   c                 ó   •— g | ]}‰|z  ‘ŒS r7   r7   )r8   rW   Úfactors     €r2   rk   zbc_dist.<locals>.<listcomp>  s   ø€ Ð+Ð+Ð+ #�˜#‘Ð+Ð+Ð+r4   c                 óV   •‡— g | ]$Šˆˆˆfd „t          ‰j        ¦  «        D ¦   «         ‘Œ%S )c                 ó*   •— g | ]}‰‰‰|f         z  ‘ŒS r7   r7   )r8   r¼   r•   r-  r1   s     €€€r2   rk   z&bc_dist.<locals>.<listcomp>.<listcomp>  s&   ø€ Ð5Ð5Ð5 !ˆV�a˜˜1˜”gÑÐ5Ð5Ð5r4   )rP   rE   )r8   r1   r•   r-  s    @€€r2   rk   zbc_dist.<locals>.<listcomp>  sP   øø€ ð Nð Nð NØ:;Ð5Ð5Ð5Ð5Ð5Ð5¥u¨Q¬V¡}¤}Ð5Ñ5Ô5ðNð Nð Nr4   )	Úas_coeff_mmulr   rt   r«   rØ   r*   r[   rP   rA   )r	  rW   ÚunpackedÚnew_Br•   r-  s       @@r2   r  r    sØ   øø€ à×$Ò$Ñ&Ô&�K€FˆCØ�‚{€{Øˆå�c‰{Œ{€Hå�(�OÑ,Ô,ð "ØŒMˆØ+Ð+Ð+Ð+¨Ð+Ñ+Ô+ˆÝ Ð&Ð&Ý	�H�kÑ	*Ô	*ð "ØŒOˆðNð Nð Nð Nð NÝ?DÀQÄV¹}¼}ðNñ Nô Nˆå˜5Ñ!Ô!Ð!Ø€Kr4   c                 ó´  — t          | t          ¦  «        rD| j        d         j        r0| j        d         dk    rd| j        d         g| j        d         z  }}n| S |                      ¦   «         \  }}d}|dz   t          |¦  «        k     �r1|||dz   …         \  }}t          |t          ¦  «        rFt          |t          ¦  «        r1|                     |¦  «        ||<   |                     |dz   ¦  «         n¯t          |t          ¦  «        r@|                     t          |gg¦  «        ¦  «        ||<   |                     |dz   ¦  «         nZt          |t          ¦  «        r@t          |gg¦  «                             |¦  «        ||<   |                     |dz   ¦  «         n|dz  }|dz   t          |¦  «        k     �°1t          |g|¢R Ž  
                    ¦   «         S )Nr5   r   r�   )rt   r    rS   Ú
is_IntegerÚas_coeff_matricesr=   r*   ry   Úpopr   r  )r	  r-  r�   r1   r”   r•   s         r2   r  r    sÊ  € Ý�$�ÑÔð 4ØŒ9�QŒ<Ô"ð 	 t¤y°¤|°aÒ'7Ð'7Ø  4¤9¨Q¤< .°´¸1´Ñ"=�HˆFˆFàˆKà×1Ò1Ñ3Ô3Ñˆ�à	€AØˆQ‰3•�X‘”ÒÑØ˜˜!˜A™#˜Œ‰ˆˆ1Ý�a�Ñ%Ô%ð 
	­*°Q½Ñ*DÔ*Dð 
	ØŸ+š+ a™.œ.ˆH�Q‰KØ�LŠL˜˜1™ÑÔÐÐÝ˜�;Ñ'Ô'ð 	ØŸ+š+¥k°A°3°%Ñ&8Ô&8Ñ9Ô9ˆH�Q‰KØ�LŠL˜˜1™ÑÔÐÐÝ˜�;Ñ'Ô'ð 	Ý%¨ s eÑ,Ô,×6Ò6°qÑ9Ô9ˆH�Q‰KØ�LŠL˜˜1™ÑÔÐÐàˆq‰DˆAð ˆQ‰3•�X‘”ÒÑõ �&Ð$˜8Ð$Ð$Ð$×)Ò)Ñ+Ô+Ð+r4   c                 óR   — t          | j        ¦  «        }|                     ¦   «         S rI   )r  r"  r‚   )r	  Úcollapses     r2   r  r  .  s#   € Ý˜dœhÑ'Ô'€HØ×#Ò#Ñ%Ô%Ð%r4   c                 óè   — t          | j        t          ¦  «        r|                      ¦   «         S t	          | ¦  «        }| |k    r|S t          t          t          | j        ¦  «        ¦  «        ¦  «        S rI   )rt   r"  r«   rõ   Úblockinverse_1x1Úblockinverse_2x2r   Úreblock_2x2)r	  Úexpr2s     r2   r  r  3  s_   € Ý�$”(�OÑ,Ô,ð Ø�|Š|‰~Œ~Ðå˜TÑ"Ô"€EØˆu‚}€}ØˆÝ�G¥K°´Ñ$9Ô$9Ñ:Ô:Ñ;Ô;Ð;r4   c                 óÞ   — t          | j        t          ¦  «        rR| j        j        dk    rBt	          | j        j        d                              ¦   «         gg¦  «        }t          |¦  «        S | S )Nr�   r   )rt   r"  r*   rd   r   r[   rõ   )r	  rW   s     r2   r:  r:  <  s`   € Ý�$”(�KÑ(Ô(ð  ¨T¬XÔ-@ÀFÒ-JÐ-JÝ�t”x” qÔ)×1Ò1Ñ3Ô3Ð4Ð5Ñ6Ô6ˆÝ˜3ÑÔÐØ€Kr4   c                 ó  — t          | j        t          ¦  «        �rk| j        j        dk    �rZ| j        j                             ¦   «         \  \  }}\  }}t          ||||¦  «        }|d k    r| j                             |¦  «        j        }|dk    r9|j        }t          |||z  |z  |z  |z  z   | |z  |z  g| |z  |z  |gg¦  «        S |dk    r9|j        }t          | |z  |z  |g|||z  |z  |z  |z  z   | |z  |z  gg¦  «        S |dk    r9|j        }	t          |	 |z  |z  |	|	|z  |z  |z  |	z  z   g|| |z  |	z  gg¦  «        S |dk    r9|j        }
t          || |z  |
z  g|
 |z  |z  |
|
|z  |z  |z  |
z  z   gg¦  «        S | S )Nr�   r”   r•   r–   r—   )	rt   r"  r*   rd   r[   r‘   Ú_choose_2x2_inversion_formular©   r“   )r	  r”   r•   r–   r—   ÚformulaÚMIr¬   ÚBIÚCIrµ   s              r2   r;  r;  C  sò  € Ý�$”(�KÑ(Ô(ñ `¨T¬XÔ-@ÀFÒ-JÑ-Jð ”8”?×)Ò)Ñ+Ô+ñ	‰ˆ!ˆQÙ	ˆ!ˆQå/°°1°a¸Ñ;Ô;ˆØ�dŠ?ˆ?Ø”—’ Ñ(Ô(Ô*ˆBØ�cŠ>ˆ>Ø”ˆBÝ  b¨1¡f¨r¡k°A¡o¸Ñ&:Ñ!:¸R¸CÀ!¹GÀb¹LÐ IÈRÈCÐRSÉGÐVXÉLÐZ\ÐK]Ð^Ñ_Ô_Ð_Ø�cŠ>ˆ>Ø”ˆBÝ "  q¡¨2¡¨rÐ 2°R¸"¸q¹&À2¹+È¹/ÈBÑ:NÑ5NÐQSÐPSÐVWÑPWÐZ\ÑP\Ð4]Ð^Ñ_Ô_Ð_Ø�cŠ>ˆ>Ø”ˆBÝ "  q¡¨2¡¨r°B¸±F¸R±KÀ!±OÀbÑ4HÑ/HÐ IÈBÐQSÐPSÐVWÑPWÐZ\ÑP\ÐK]Ð^Ñ_Ô_Ð_Ø�cŠ>ˆ>Ø”ˆBÝ  b S¨1¡W¨r¡\Ð 2°b°S¸1±W¸r±\À2ÈÈQÉÐQSÉÐVWÉÐZ\ÑH\ÑC\Ð4]Ð^Ñ_Ô_Ð_à€Kr4   c                 óŽ  — t          t          j        | ¦  «        ¦  «        }|dk    rdS t          t          j        |¦  «        ¦  «        }|dk    rdS t          t          j        |¦  «        ¦  «        }|dk    rdS t          t          j        |¦  «        ¦  «        }|dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS dS )a\  
    Assuming [[A, B], [C, D]] would form a valid square block matrix, find
    which of the classical 2x2 block matrix inversion formulas would be
    best suited.

    Returns 'A', 'B', 'C', 'D' to represent the algorithm involving inversion
    of the given argument or None if the matrix cannot be inverted using
    any of those formulas.
    Tr”   r•   r–   r—   FN)r   r   r’   )r”   r•   r–   r—   ÚA_invÚB_invÚC_invÚD_invs           r2   r@  r@  \  sÍ   € õ •”˜Q‘”Ñ Ô €EØ�‚}€}ØˆsÝ•”˜Q‘”Ñ Ô €EØ�‚}€}ØˆsÝ•”˜Q‘”Ñ Ô €EØ�‚}€}ØˆsÝ•”˜Q‘”Ñ Ô €EØ�‚}€}Øˆsà�‚~€~ØˆsØ�‚~€~ØˆsØ�‚~€~ØˆsØ�‚~€~ØˆsØˆ4r4   c           
      ó�  ‡— t          | t          ¦  «        r| j                             t          ¦  «        s| S d„ }| j                             |¦  «        Š	 t          dt          ˆfd„t          ‰j        d         ¦  «        D ¦   «         ¦  «        g ¦  «        }t          d‰j        d         ¦  «        D ]s}t          ‰|df         j        ¦  «        }t          d‰j        d         ¦  «        D ]$}| 	                    ‰||f         j        ¦  «        }Œ%| 
                    |¦  «        }Œtt          |¦  «        S # t          $ r | cY S w xY w)z( Flatten a BlockMatrix of BlockMatrices c                 óR   — t          | t          ¦  «        r| nt          | gg¦  «        S rI   r  )r¡   s    r2   r3   zdeblock.<locals>.<lambda>„  s%   € �* Q­Ñ4Ô4ÐL�Q�Q½+ÈÀsÀeÑ:LÔ:L€ r4   r   c              3   óL   •K  — | ]}‰d |f         j         j        d         V — ŒdS )r   r5   Nrb   )r8   r1   Úbbs     €r2   rJ   zdeblock.<locals>.<genexpr>ˆ  s5   øè è € ÐPÐP¸˜2˜a ˜dœ8œ?Ô0°Ô3ÐPÐPÐPÐPÐPÐPr4   r5   )rt   r*   r[   r  Ú	applyfuncr   rK   rP   r\   Úrow_joinÚcol_joinr   )r•   ÚwrapÚMMÚrowr`   ÚcolrM  s         @r2   r  r  €  sC  ø€ å�a�Ñ%Ô%ð ¨Q¬X¯\ª\½+Ñ-FÔ-Fð ØˆØLÐL€DØ	
Œ×	Ò	˜DÑ	!Ô	!€Bð
Ý�A•sÐPÐPÐPÐP½UÀ2Ä8ÈAÄ;Ñ=OÔ=OÐPÑPÔPÑPÔPÐRTÑUÔUˆÝ˜˜BœH QœKÑ(Ô(ð 	 ð 	 ˆCÝ�r˜#˜q˜&”zÔ(Ñ)Ô)ˆAÝ˜Q ¤¨¤Ñ,Ô,ð 4ð 4�Ø—J’J˜r # s (œ|Ô2Ñ3Ô3��Ø—’˜Q‘”ˆBˆBå˜2‰ŒÐøÝð ð ð Øˆˆˆðøøøs   ÁCD6 Ä6EÅEc           
      ó  — t          | t          ¦  «        rt          d„ | j        D ¦   «         ¦  «        s| S t          }| j        \  }}| j        }t          d|¦  «        D ]Ò}t          d|¦  «        D ]¿}t           ||d|…d|…f         ¦  «        ¦  «        }t           ||d|…|d…f         ¦  «        ¦  «        }t           |||d…d|…f         ¦  «        ¦  «        }	t           |||d…|d…f         ¦  «        ¦  «        }
t          |||	|
¦  «        }|�t          ||g|	|
gg¦  «        c c S ŒÀŒÓ ||d          ||ddd…f         ¦  «        g ||dd…df         ¦  «         ||dd…dd…f         ¦  «        gg¦  «        S )zÌ
    Reblock a BlockMatrix so that it has 2x2 blocks of block matrices.  If
    possible in such a way that the matrix continues to be invertible using the
    classical 2x2 block inversion formulas.
    c              3   ó"   K  — | ]
}|d k    V — ŒdS )r�   Nr7   )r8   r¨   s     r2   rJ   zreblock_2x2.<locals>.<genexpr>š  s&   è è € Ð3SÐ3S¸a°A¸²EÐ3SÐ3SÐ3SÐ3SÐ3SÐ3Sr4   r5   NrŽ   r   )rt   r*   rí   rd   r[   rP   r  r@  )r	  ÚBMÚ	rowblocksÚ	colblocksr[   r1   r¼   r”   r•   r–   r—   rA  s               r2   r<  r<  ”  sß  € õ �d�KÑ(Ô(ð µÐ3SÐ3SÀ4Ä?Ð3SÑ3SÔ3SÑ0SÔ0Sð Øˆå	€BØœ?Ñ€IˆyØŒ[€FÝ�1�iÑ Ô ð 
5ð 
5ˆÝ�q˜)Ñ$Ô$ð 		5ð 		5ˆAå˜"˜"˜V B Q B¨¨¨ Fœ^Ñ,Ô,Ñ-Ô-ˆAÝ˜"˜"˜V B Q B¨¨¨ Fœ^Ñ,Ô,Ñ-Ô-ˆAÝ˜"˜"˜V A B B¨¨¨ Fœ^Ñ,Ô,Ñ-Ô-ˆAÝ˜"˜"˜V A B B¨¨¨ Fœ^Ñ,Ô,Ñ-Ô-ˆAå3°A°q¸!¸QÑ?Ô?ˆGØÐ"Ý" Q¨ F¨Q°¨FÐ#3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4ð #ð		5ð ˆ2��t”˜b˜b ¨¨1¨2¨2¨¤Ñ/Ô/Ð0Ø��6˜!˜"˜"˜a˜%”=Ñ!Ô! 2 2 f¨Q¨R¨R°°°¨V¤nÑ#5Ô#5Ð6ð8ñ 9ô 9ð 9r4   c                 óV   — d}g }| D ]!}|                      |||z   f¦  «         ||z  }Œ"|S )z½ Convert sequence of numbers into pairs of low-high pairs

    >>> from sympy.matrices.expressions.blockmatrix import bounds
    >>> bounds((1, 10, 50))
    [(0, 1), (1, 11), (11, 61)]
    r   )Úappend)ÚsizesÚlowÚrvÚsizes       r2   Úboundsr`  ±  sH   € ð €CØ	€BØð ð ˆØ
�	Š	�3˜˜d™
Ð#Ñ$Ô$Ð$Øˆt‰ˆˆØ€Ir4   c                 óz   ‡ ‡— t          |¦  «        }t          |¦  «        Št          ˆˆ fd„|D ¦   «         ¦  «        S )a   Cut a matrix expression into Blocks

    >>> from sympy import ImmutableMatrix, blockcut
    >>> M = ImmutableMatrix(4, 4, range(16))
    >>> B = blockcut(M, (1, 3), (1, 3))
    >>> type(B).__name__
    'BlockMatrix'
    >>> ImmutableMatrix(B.blocks[0, 1])
    Matrix([[1, 2, 3]])
    c                 ó0   •‡— g | ]Šˆˆfd „‰D ¦   «         ‘ŒS )c                 ó2   •— g | ]}t          ‰‰|¦  «        ‘ŒS r7   r!   )r8   Úcolboundr	  Úrowbounds     €€r2   rk   z'blockcut.<locals>.<listcomp>.<listcomp>Í  s5   ø€ ð 4ð 4ð 4Ø%õ % T¨8°XÑ>Ô>ð 4ð 4ð 4r4   r7   )r8   re  Ú	colboundsr	  s    @€€r2   rk   zblockcut.<locals>.<listcomp>Í  sP   øø€ ð 4ð 4ð 4à%ð4ð 4ð 4ð 4ð 4Ø)2ð4ñ 4ô 4ð 4ð 4ð 4r4   )r`  r*   )r	  ÚrowsizesÚcolsizesÚ	rowboundsrf  s   `   @r2   Úblockcutrj  ¿  s]   øø€ õ �xÑ Ô €IÝ�xÑ Ô €IÝð 4ð 4ð 4ð 4ð 4à)2ð4ñ 4ô 4ñ 5ô 5ð 5r4   N)HÚsympy.assumptions.askr   r   Ú
sympy.corer   r   r   r   Úsympy.core.sympifyr
   Ú$sympy.functions.elementary.complexesr   r   Úsympy.strategiesr   r   r   r   r   Úsympy.strategies.traverser   Úsympy.utilities.iterablesr   r   Úsympy.utilities.miscr   Úsympy.matricesr   r   Úsympy.matrices.exceptionsr   Ú&sympy.matrices.expressions.determinantr   r   Ú"sympy.matrices.expressions.inverser   Ú!sympy.matrices.expressions.mataddr   Ú"sympy.matrices.expressions.matexprr   r   Ú!sympy.matrices.expressions.matmulr   Ú!sympy.matrices.expressions.matpowr    Ú sympy.matrices.expressions.slicer"   Ú"sympy.matrices.expressions.specialr#   r$   Ú sympy.matrices.expressions.tracer&   Ú$sympy.matrices.expressions.transposer'   r(   r*   r«   r  r  r  r  r  r  r  r  r:  r;  r@  r  r<  r`  rj  r7   r4   r2   ú<module>r     s  ðØ *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ /Ð /Ð /Ð /Ð /Ð /Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø +Ð +Ð +Ð +Ð +Ð +à -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø >Ð >Ð >Ð >Ð >Ð >Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EðU%ð U%ð U%ð U%ð U%�*ñ U%ô U%ð U%ðpxð xð xð xð x�kñ xô xð xðv1ð 1ð 1ðfð ð ð
ð ð ðð ð ðð ð ð(,ð ,ð ,ð2&ð &ð &ð
<ð <ð <ðð ð ðð ð ð2!ð !ð !ðHð ð ð(9ð 9ð 9ð:ð ð ð5ð 5ð 5ð 5ð 5r4   