B
    [                 @   sd   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 Z
G dd deZd	d
 Zdd ZdS )    )print_functiondivision)
MatrixExpr)TupleBasic)floorc             C   s   t | tr| j| j| jf} t | tttfsL| dk dkr>| |7 } | | d df} t| } t| dkrj| 	d | \}}}|pzd}|d kr|}|dk dkr||7 }|dk dkr||7 }|pd}|| | dk dkrt
 |||fS )Nr   T      )
isinstanceslicestartstopsteptuplelistr   lenappend
IndexError)iZ
parentsizer   r   r    r   ?lib/python3.7/site-packages/sympy/matrices/expressions/slice.py	normalize   s*    


r   c               @   s\   e Zd ZdZedd Zedd Zedd Zdd Zedd	 Z	d
d Z
edd ZdS )MatrixSlicea   A MatrixSlice of a Matrix Expression

    Examples
    ========

    >>> from sympy import MatrixSlice, ImmutableMatrix
    >>> M = ImmutableMatrix(4, 4, range(16))
    >>> M
    Matrix([
    [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15]])

    >>> B = MatrixSlice(M, (0, 2), (2, 4))
    >>> ImmutableMatrix(B)
    Matrix([
    [2, 3],
    [6, 7]])
    c             C   s
   | j d S )Nr   )args)selfr   r   r   <lambda>5   s    zMatrixSlice.<lambda>c             C   s
   | j d S )Nr   )r   )r   r   r   r   r   6   s    c             C   s
   | j d S )Nr	   )r   )r   r   r   r   r   7   s    c             C   s   t ||jd }t ||jd }t|t|  kr<dksDn t d|d kdks|jd |d k dksd|d kdks|jd |d k dkrt t|trt|||S t| |t	| t	| S )Nr   r      T)
r   shaper   r   r
   r   mat_slice_of_slicer   __new__r   )clsparentrowslicecolslicer   r   r   r   9   s    
zMatrixSlice.__new__c             C   sx   | j d | j d  }| j d dkr&|nt|| j d  }| jd | jd  }| jd dkr^|nt|| jd  }||fS )Nr   r   r	   )r"   r   r#   )r   ZrowsZcolsr   r   r   r   G   s
    $$zMatrixSlice.shapec             C   s6   | j || jd  | jd  || jd  | jd  S )Nr	   r   )r!   _entryr"   r#   )r   r   jr   r   r   r$   O   s    zMatrixSlice._entryc             C   s   | j | jkS )N)r"   r#   )r   r   r   r   on_diagS   s    zMatrixSlice.on_diagN)__name__
__module____qualname____doc__propertyr!   r"   r#   r   r   r$   r&   r   r   r   r   r       s   r   c             C   sL   | \}}}|\}}}|||  }|| }	|||  }
|
|krBt  ||
|	fS )N)r   )stZstart1Zstop1Zstep1Zstart2Zstop2Zstep2r   r   r   r   r   r   slice_of_sliceX   s    

r.   c             C   s&   t | j|}t | j|}t| j||S )z Collapse nested matrix slices

    >>> from sympy import MatrixSymbol
    >>> X = MatrixSymbol('X', 10, 10)
    >>> X[:, 1:5][5:8, :]
    X[5:8, 1:5]
    >>> X[1:9:2, 2:6][1:3, 2]
    X[3:7:2, 4]
    )r.   r"   r#   r   r!   )r!   r"   r#   rowcolr   r   r   r   f   s    
r   N)Z
__future__r   r   Z"sympy.matrices.expressions.matexprr   Zsympyr   r   Z#sympy.functions.elementary.integersr   r   r   r.   r   r   r   r   r   <module>   s   8