B
    [                 @   sd   d 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
mZmZ ddlmZ G dd deZd	S )
z& Linear Solver for Holonomic Functions    )print_functiondivision)MutableDenseMatrix)flattennumbered_symbols)SymbolDummysymbols)Sc               @   s6   e Zd ZdZedd Zdd Zdd Zdd	d
ZdS )	NewMatrixzf
    Supports elements which can't be Sympified.
    See docstrings in sympy/matrices/matrices.py
    c             C   s   | S )N )ar   r   ;lib/python3.7/site-packages/sympy/holonomic/linearsolver.py_sympify   s    zNewMatrix._sympifyc             C   s~   ddl m} | st| |S | j|jkr0tdt| j| j|j }| |d d d | jf< ||d d | jd f< t| |S )Nr   )MutableMatrixz3`self` and `rhs` must have the same number of rows.)sympy.matricesr   typerows
ShapeErrorr   zeroscols)selfZrhsr   newmatr   r   r   row_join   s    zNewMatrix.row_joinc             C   s~   ddl m} | st| |S | j|jkr0tdt| j|j | j}| |d | jd d f< ||| jd d d f< t| |S )Nr   )r   z7`self` and `bott` must have the same number of columns.)r   r   r   r   r   r   r   r   )r   Zbottr   r   r   r   r   col_join#   s    zNewMatrix.col_joinFc                s  ddl m}m} | |  | }|d d d df j\} | \}}|d d d df |d d df  }}	tt fdd|}t	|}
|t
 j}|||}x t|D ]\}}||| qW |d dd d f |dd d f  }}|	|
d df jstd|t	|d  }tdd t
 |
 D  |
 d	}|d |
|
d f }|	d |
df }||||  |}t d	}x&t|D ]\}}	|	||| df< qW |r|||fS ||fS d S )
Nr   )Matrixr   c                s   |  k S )Nr   )p)colr   r   <lambda>:   s    z.NewMatrix.gauss_jordan_solve.<locals>.<lambda>zLinear system has no solutionc             S   s   g | ]}t d qS )   )r
   ).0kr   r   r   
<listcomp>O   s    z0NewMatrix.gauss_jordan_solve.<locals>.<listcomp>r    )r   r   r   ZhstackcopyshapeZrreflistfilterlenrangeTZvstack	enumerateZcol_swapZis_zero
ValueErrorr   Zreshape)r   bZfreevarr   r   ZaugrowAZpivotsvZrankZpermutationicZfree_var_indexZtauVZvtZfree_solZsolr"   r   )r   r   gauss_jordan_solve1   s2    &&&
zNewMatrix.gauss_jordan_solveN)F)	__name__
__module____qualname____doc__staticmethodr   r   r   r4   r   r   r   r   r      s
   r   N)r8   Z
__future__r   r   Zsympy.matrices.denser   Zsympy.utilities.iterablesr   r   Zsympy.core.symbolr   r   r	   Zsympyr
   r   r   r   r   r   <module>   s   