U
    c                     @   s  d dl mZ ee ZdddgZddddgZeeed	d
dZedddgdddgdddgks`teeed	ddZedddgdddgdddgkstee edddZ	e	ddgddgddgddggddgksteeedddZ
e
ddddgdddgkstee eddd ZeddgddgddggddgksDteeed	d!d"Zedddgdddgd#ksvteed$d%d&Zedddgd'kstd d(lZeed$d)d*Zeddgdksteeed	d+d,Zeeed	d-d.Zeeed	d/d.Zeee  ZdddgdddggZddgddgddggZd d0l mZ eeeef d1d2d3Zedddgdddggd4ks~teeed5d6d7Zeeed8d9d:Zd d;l mZ eeeeegef ed<d=d>Zeed?d@dAZeddd d d d gd dd d d gd d dd d gd d d dd gd d d d dggks,tdddgdBdCdDgdEdFdGggZdHdIdJdKd4dLdMdNdOdPdQdRgZd ddd d d d d d d g
dd ddd d d d d d g
ddd dd d d d d d g
d ddd dd d d d d g
d d d dd dd d d d g
d d d d dd ddd d g
d d d d d dd d dd g
d d d d d dd d dd g
d d d d d d ddd dg
d d d d d d d d dd g
g
Zed  d dks^tdSed  d d ksxtdTdUdV e ed D Z!d(S )W    )ListF      (   _   P   K   >   )vwreturnc                 C   s,   t | t |kstddd t| |D S )zAdds corresponding elementsvectors must be the same lengthc                 S   s   g | ]\}}|| qS  r   .0v_iZw_ir   r   G/home/cheung/ML/DS-from-scratch/05-statistics/scratch/linear_algebra.py
<listcomp>   s     zadd.<locals>.<listcomp>lenAssertionErrorzipr
   r   r   r   r   add   s    r                        	   c                 C   s,   t | t |kstddd t| |D S )z Subtracts corresponding elementsr   c                 S   s   g | ]\}}|| qS r   r   r   r   r   r   r      s     zsubtract.<locals>.<listcomp>r   r   r   r   r   subtract   s    r"   )vectorsr   c                    sL   st dtd  t fddD s6t dfddt D S )zSums all corresponding elementszno vectors provided!r   c                 3   s   | ]}t | kV  qd S Nr   )r   r
   )num_elementsr   r   	<genexpr>%   s     zvector_sum.<locals>.<genexpr>zdifferent sizes!c                    s"   g | ] t  fd dD qS )c                 3   s   | ]}|  V  qd S r$   r   )r   vectorir   r   r'   (   s     z(vector_sum.<locals>.<listcomp>.<genexpr>)sumr   r#   r)   r   r   (   s   zvector_sum.<locals>.<listcomp>)r   r   allranger-   r   )r&   r#   r   
vector_sum   s    
r0            )cr
   r   c                    s    fdd|D S )zMultiplies every element by cc                    s   g | ]} | qS r   r   )r   r   r4   r   r   r   /   s     z#scalar_multiply.<locals>.<listcomp>r   )r4   r
   r   r5   r   scalar_multiply-   s    r6   c                 C   s   t | }td| t| S )z!Computes the element-wise averager   )r   r6   r0   )r#   nr   r   r   vector_mean3   s    r8   c                 C   s0   t | t |kstdtdd t| |D S )z$Computes v_1 * w_1 + ... + v_n * w_nzvectors must be same lengthc                 s   s   | ]\}}|| V  qd S r$   r   r   r   r   r   r'   >   s     zdot.<locals>.<genexpr>)r   r   r+   r   r   r   r   r   dot:   s    r9       )r
   r   c                 C   s
   t | | S )z#Returns v_1 * v_1 + ... + v_n * v_n)r9   r
   r   r   r   sum_of_squaresB   s    r<      Nc                 C   s   t t| S )z&Returns the magnitude (or length) of v)mathsqrtr<   r;   r   r   r   	magnitudeJ   s    r@   c                 C   s   t t| |S )z2Computes (v_1 - w_1) ** 2 + ... + (v_n - w_n) ** 2)r<   r"   r   r   r   r   squared_distanceP   s    rA   c                 C   s   t t| |S )z%Computes the distance between v and w)r>   r?   rA   r   r   r   r   distanceT   s    rB   c                 C   s   t t| |S r$   )r@   r"   r   r   r   r   rB   Y   s    )Tuple)Ar   c                 C   s$   t | }| rt | d nd}||fS )z+Returns (# of rows of A, # of columns of A)r   r%   )rD   num_rowsnum_colsr   r   r   shapeh   s    rG   )r   r   )rD   r*   r   c                 C   s   | | S )z'Returns the i-th row of A (as a Vector)r   )rD   r*   r   r   r   get_rowp   s    rH   )rD   jr   c                    s    fdd| D S )z*Returns the j-th column of A (as a Vector)c                    s   g | ]}|  qS r   r   )r   ZA_irI   r   r   r   v   s   zget_column.<locals>.<listcomp>r   )rD   rI   r   rJ   r   
get_columnt   s    
rK   )Callable)rE   rF   entry_fnr   c                    s    fddt | D S )zY
    Returns a num_rows x num_cols matrix
    whose (i,j)-th entry is entry_fn(i, j)
    c                    s$   g | ]  fd dt D qS )c                    s   g | ]} |qS r   r   )r   rI   )rM   r*   r   r   r      s   z*make_matrix.<locals>.<listcomp>.<listcomp>r/   r,   rM   rF   r)   r   r      s   zmake_matrix.<locals>.<listcomp>rN   )rE   rF   rM   r   rO   r   make_matrix{   s    rP   )r7   r   c                 C   s   t | | dd S )z!Returns the n x n identity matrixc                 S   s   | |krdS dS )Nr   r   r   )r*   rI   r   r   r   <lambda>       z!identity_matrix.<locals>.<lambda>)rP   )r7   r   r   r   identity_matrix   s    rS   A   x      M         )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r    )r   r1   )r    r1   )r1   r!   z0 and 2 are friendsz0 and 8 are not friendsc                 C   s   g | ]\}}|r|qS r   r   )r   r*   Z	is_friendr   r   r   r      s   r   )"typingr   floatZVectorZheight_weight_ageZgradesr   r   r"   r0   r6   r8   r9   r<   r>   r@   rA   rB   ZMatrixrD   BrC   intrG   rH   rK   rL   rP   rS   dataZfriendshipsZfriend_matrix	enumerateZfriends_of_fiver   r   r   r   <module>   s   $$, ( "      
