
    {TiD                     t    d Z ddlZddlZddlZddlmZ ddlmZ  G d dej                        Z	e
fdZd	dZy)
zSubstitution matrices.    N)	as_handle)
_arraycorec                        e Zd ZdZdddef fd	Zd Zd Zd Zd Z	d Z
dd	Zdd
Z fdZd Zd ZddZd Zd Zd ZddZd Zd Zd Zd ZddZd Zd Z xZS )Arrayz8numpy array subclass indexed by integers and by letters.Nc                 J   t        |t              r|t        d      |t        d      g }d}|D ]	  }t        |t              r'|d}n|dk7  rt        d      |j	                  |       ;t        |t
              sL|t        |      }n|t        |      k7  rt        d      |dk(  r=t        |t              st        d      t        |      dkD  rd}|j	                  |       |d	k(  rD|D ]>  }t        |t              st        d      t        |      dkD  rd}|j	                  |       @ t        d
|z         t        t        |            }|rdj                  |      }nt        |      }t        |      }|dk(  r|f}	n|d	k(  r||f}	nt        d      t        | -  | |	|      }
|dk(  r*t        |      D ]  \  }}|j                  d      |
|<    n@|d	k(  r:t        |      D ]5  \  }}t        |      D ]"  \  }}||f}|j                  |d      }||
||f<   $ 7 n|t        j                  }n!t        |t        t
        f      st        d      t        |      }||d}n|dvrt        d|z        |f|z  }	ny|F|j                   }	t        |	      }|dk(  rnZ|d	k(  r|	d   |	d   k7  rJt        d      t        d|z        |f|z  }	|j                   |	k7  rt        d|	d|j                   d      t        | -  | |	|      }
|d|
dd n||
dd ||
_        |
S )zCreate a new Array instance.Nz'alphabet must be None if data is a dictz#dims must be None if data is a dictT   zinconsistent dimensions in datazexpected stringF   zFdata array should be 1- or 2- dimensional (found %d dimensions) in key zdata is an empty dictionaryg        z&alphabet should be a string or a tuple)r   r	   z dims should be 1 or 2 (found %s)r   zdata array is not squarez@data array should be 1- or 2- dimensional (found %d dimensions) z-data shape has inconsistent shape (expected (z
), found (z)))
isinstancedict
ValueErrorstrappendtuplelensortedsetjoinsuper__new__	enumerategetstringascii_uppercaseshapealphabet)clsr   dimsdatadtypesingle_letterskeyletternr   objii1letter1i2letter2value	__class__s                    [/home/agent/.local/lib/python3.12/site-packages/Bio/Align/substitution_matrices/__init__.pyr   zArray.__new__   s}   dD!# !JKK !FGGH!N c3'| ()JKKOOC(U+|"3xS)()JKKqy)#s3",->"??s8a<-2N ,&) 4F#-fc#:&01B&C C"6{Q16$OOF34 );=AB 5< c(m,H778, ?HAqyA !>??'/#ue4Cqy'1 3FAs!XXfc2CF3#,X#6 ,KB'0': ,G&0 $c 2&+BF,, !11 C<8 !IJJHA|<D'$%G$%NOOt< JJEu:Dqy 8uQx/",-G"HH(57;< 
 D4KEzzU*($djj2  '/#ue4C|AA
    c                 P    	 |j                   }||| _         y y # t        $ r Y y w xY wN)r   AttributeError)selfr%   r   s      r-   __array_finalize__zArray.__array_finalize__|   s8    	)||H
 # ( $	  		s    	%%c                    t        |t              rSg }|D ]?  }t        |t              r	 | j                  j	                  |      }|j                  |       A t        |      }|S t        |t              r	 | j                  j	                  |      }|S |S # t
        $ r t        d|z        d w xY w# t
        $ r t        d|z        d w xY w)Nz'%s')r   r   r   r   indexr   
IndexErrorr   )r2   r"   indicesr5   s       r-   _convert_keyzArray._convert_key   s    c5!G &eS)C $ 3 3E : u%& .C 
 S!9mm))#. 
s
 & C(%8dBC  9 #.D89s   B5B0 B-0C	c                    | j                  |      }t        j                  j                  | |      }|j                  dk(  r| j                  dk(  r$|j
                  | j
                  k7  rt        d      | j                  dk(  r| j
                  d   }|j
                  d   |k(  r|j
                  d   dk(  rn|j
                  d   dk(  r|j
                  d   |k(  rnct        d      |j                  dk(  r*|j
                  d   | j
                  d   k7  r*t        d      |j                  dk(  r|j                         S |j                  t              S )Nr	   zRequesting truncated arrayr   r   )
r8   npndarray__getitem__ndimr   r6   itemviewr   )r2   r"   r+   lengths       r-   r<   zArray.__getitem__   s   $

&&tS1::?yyA~;;$**,$%ABBaA;;q>V+A!0C[[^q(U[[^v-E$%ABBZZ1_{{1~A. !=>>ZZ1_::<zz%  r.   c                 h    | j                  |      }t        j                  j                  | ||       y r0   )r8   r:   r;   __setitem__r2   r"   r+   s      r-   rB   zArray.__setitem__   s(    $


tS%0r.   c                 &    || j                         v S r0   )keys)r2   r"   s     r-   __contains__zArray.__contains__   s    diik!!r.   c                     |\  }}}| j                   }|D ]-  }t        |t              s|j                   |k7  s$t        d       t        j
                  j                  | ||      S )Nalphabets are inconsistent)r   r   r   r   r:   r;   __array_prepare__)r2   out_arrcontextufuncinputsr&   r   args           r-   rI   zArray.__array_prepare__   se    "vq== 	CC#u%<<8+$%ABB	C zz++D'7CCr.   c                 j    t        |      dk(  r|d   S t        j                  j                  | ||      S )Nr   r   )r   r:   r;   __array_wrap__)r2   rJ   rK   s      r-   rP   zArray.__array_wrap__   s1    w<11:zz((w@@r.   c                    g }| j                   }|D ]l  }t        |t              rI|j                   |k7  rt        d      |j	                  |j                  t        j                               \|j	                  |       n |j                  dd       }|rg }	|D ]l  }t        |t              rI|j                   |k7  rt        d      |	j	                  |j                  t        j                               \|	j	                  |       n t        |	      |d<   nd|j                  z  }t        | 0  ||g|i |}
|
t        u rt        S |dk(  ry |j                  dk(  r|
f}
g }t        |
|      D ]f  \  }}|j                  dk(  r|}n>|:t        j                   |      j                  t              }| j                   |_         n|}|j	                  |       h t#        |      dk(  r|d   S |S )NrH   outr0   atr   r   )r   r   r   r   r   r?   r:   r;   popr   noutr   __array_ufunc__NotImplementedzipr=   asarrayr   )r2   rL   methodrM   kwargsargsr   rN   outputsout_argsraw_resultsresults
raw_resultoutputresultr,   s                  r-   rV   zArray.__array_ufunc__   s   == 	!C#u%<<8+$%ABBCHHRZZ01C 	! **UD)H )c5)||x/()EFFOOCHHRZZ$89OOC() "(OF5M

*Gg-eVMdMfM.(!!T>::?&.K"%k7"; 	#J!##J/44U;"&--NN6"	# !\Q.wqz;G;r.   c                     dd l }t        j                  |       }|j                  |      }| j                  }t        | j                        }| j                  }t        ||d |f}t        j                  ||fS Nr   )
pickler:   arraydumpsr   r   r   r    r   r   )r2   rf   valuesstater   r   r    	argumentss           r-   
__reduce__zArray.__reduce__   s`    $V$==4::

HdD%8	y%00r.   c                 @    dd l }|j                  |      | d d d d f<   y re   )rf   loads)r2   rj   rf   s      r-   __setstate__zArray.__setstate__   s    \\%(QT
r.   c                 0    	 | |   S # t         $ r |cY S w xY w)z=Return the value of the key if found; return value otherwise.)r6   rC   s      r-   r   z	Array.get  s%    	9 	L	s    c              #     K   t        | j                        }|dk(  rDt        | j                        D ]+  \  }}t        j
                  j                  | |      }||f - y|dk(  rgt        | j                        D ]N  \  }}t        | j                        D ]1  \  }}||f}t        j
                  j                  | ||f      }||f 3 P yt        d| j                  z        w)z6Return an iterator of (key, value) pairs in the array.r   r	   array has unexpected shape %sN)r   r   r   r   r:   r;   r<   RuntimeError)	r2   r   r5   r"   r+   r'   c1r)   c2s	            r-   itemszArray.items  s     4::19'6 !
s

..tU;5j ! QY#DMM2 %B'6 %FBr(CJJ224"bBEu*$%% >KLLs   C#C%c                     t        | j                        }| j                  |dk(  rt              S |dk(  rt        fdD              S t	        d| j                  z        )z7Return a tuple with the keys associated with the array.r   r	   c              3   4   K   | ]  }D ]  }||f 
  y wr0    ).0ru   rt   r   s      r-   	<genexpr>zArray.keys.<locals>.<genexpr>#  s!     HbxH"bHHs   rr   )r   r   r   r   rs   )r2   r   r   s     @r-   rE   z
Array.keys  sW    4::==19?"QYHHHHH>KLLr.   c                      t         j                        } j                  }|dk(  rt               S |dk(  r- j                  \  }t         fdt	        |      D              S t        d j                  z        )z3Return a tuple with the values stored in the array.r   r	   c              3      K   | ]6  }t              D ]&  }t        j                  j                  ||f       ( 8 y wr0   )ranger:   r;   r<   )rz   r)   r'   n1r2   s      r-   r{   zArray.values.<locals>.<genexpr>/  sG      )  

&&tb"X66s   <?rr   )r   r   r   r   r~   rs   )r2   r   r   n2r   s   `   @r-   ri   zArray.values'  ss    4::==19;QYZZFB )   >KLLr.   c                     |!	 |j                         }|D ]
  }||   | |<    	 |D ]
  }||   | |<    y# t        $ r |D ]
  \  }}|| |<    Y *w xY w)z,Update the array from dict/iterable E and F.N)rE   r1   )r2   EFr   r"   r+   s         r-   updatezArray.update7  s~    ='668
  'C !#DI' 	C#DI	 " &"# &JC %DI&&s   4 AAc                    g }g }t        |      D ]C  \  }}	 | j                  j                  |      }|j	                  |       |j	                  |       E t        | j                        }t        ||      }t        j                  |g|z   }t        j                  |g|z   }| j                  t        j                        |   ||<   |S # t        $ r Y w xY w)zFSubset the array by selecting the letters from the specified alphabet.)r   )r   r   r5   r   r   r   r   r   r:   ix_r?   r;   )	r2   r   iijjr&   r"   jr   as	            r-   selectzArray.selectE  s    ) 	FAsMM'', IIaLIIaL	 4::(&VVbTD[!VVbTD[!		"**%b)"  s   C	CCc                    | j                   }t        |      }d g|z  }g }	 | j                  }|D ]  }d|z  }|j                  |        	 d}t        |      D ]&  \  }	}
| |
   }||z  }t        |      }||kD  r|}|||	<   ( dt        |      z   dz   }t        ||      D ]#  \  }}||z  }||z   dz   }|j                  |       % dj                  |      }|S # t        $ r Y w xY w)N#  %s
r    %s
r
   )	r   r   headerr   r1   r   r   rX   r   )r2   fmtr   r$   wordslinesr   linemaxwidthr&   r"   r+   wordwidthfmt2r#   texts                    r-   
_format_1DzArray._format_1DW  s#   ==M
	#[[F  # 4'T"# ) 	FAsIE;DIEx E!H	 c(m#c)%0 	LFD$;DD=4'DLL	 wwu~)  		s   C 	C#"C#c                 N   | j                   }t        |      }t        |      D cg c]  }d g|z  
 }}g }	 | j                  }|D ]  }d|z  }|j	                  |        	 t        d |D              }	dt        |	      z   dz   }
d|	z  }t        |      D ]  \  }}d}t        |      D ]-  \  }}||f}| |   }||z  }t        |      }||kD  r|}|||   |<   / dt        |      z   dz   }||z  }||z  }t        |      D ]  \  }}||   |   }||z  ||   |<     |j                         dz   }|j	                  |       t        ||      D ]2  \  }}|
|z  }|d	j                  |      z   dz   }|j	                  |       4 d	j                  |      }|S c c}w # t
        $ r Y Bw xY w)
Nr   c              3   2   K   | ]  }t        |        y wr0   )r   )rz   cs     r-   r{   z#Array._format_2D.<locals>.<genexpr>  s     0!s1v0s   %r    r   r   r   r
   )r   r   r~   r   r   r1   maxr   r   rstriprX   r   )r2   r   r   r$   _r   r   r   r   keywidthkeyfmtr   ru   r   r&   rt   r"   r+   r   r   r   r#   rowr   s                           r-   
_format_2DzArray._format_2Dt  s   ==M%*1X.$!..	#[[F  # 4'T"# 0x00s8}$s*X~x( 	*EArH"8, #22hS	U{D	8#$H"a# #h-'#-D"9DDLD"8, *2Qx{"Tka*	*  {{}t#Tx/ 	KFC6/C%,DLL	 wwu~I /  		s   FF 	F$#F$c                 $    | j                  |      S r0   format)r2   r   s     r-   
__format__zArray.__format__  s    {{3r.   c                    |dk(  r3t        j                  | j                  t         j                        rd}nd}t	        | j
                        }|dk(  r| j                  |      S |dk(  r| j                  |      S t        d|z        )zReturn a string representation of the array.

        The argument ``fmt`` specifies the number format to be used.
        By default, the number format is "%i" if the array contains integer
        numbers, and "%.1f" otherwise.

        r
   z%iz%.1fr   r	   zArray has unexpected rank %d)	r:   
issubdtyper    integerr   r   r   r   rs   )r2   r   r$   s      r-   r   zArray.format  su     "9}}TZZ4

O6??3''!V??3''=ABBr.   c                 "    | j                         S r0   r   )r2   s    r-   __str__zArray.__str__  s    {{}r.   c                     t         j                  j                  |       }| j                  }t	        |t
              r(|j                  d      sJ |d d d| j                  z  z   }|S )N)z,
         alphabet='%s'))r:   r;   __repr__r   r   r   endswith)r2   r   r   s      r-   r   zArray.__repr__  sZ    zz""4(==h$==%%%9;dmmKKDr.   r0   )r
   )__name__
__module____qualname____doc__floatr   r3   r8   r<   rB   rF   rI   rP   rV   rl   ro   r   rv   rE   ri   r   r   r   r   r   r   r   r   __classcell__)r,   s   @r-   r   r      s    B"D dL)$!,1"DA
.<`	1)
M 	MM $:'R C*r.   r   c                    t        |       5 }|j                         }ddd       g }t              D ]:  \  }}|j                  d      s n$|j	                  |dd j                                < |d D cg c]  }|j                          }}t        |d         t        |d         cxk(  rdk(  rjn ng|D 	cg c]  \  }}	|	 }
}}	|
D ]  }t        |      dkD  st        |
      }
 n dj                  |
      }
t        |
d|      }|j                  |       n|j                  d      }
|
D ]  }t        |      dkD  st        |
      }
 n dj                  |
      }
t        |
d|      }t        |
|      D ]A  \  }}|j                  d      }||k(  sJ t        |
|      D ]  \  }}t        |      |||f<    C ||_        |S # 1 sw Y   xY wc c}w c c}	}w )z*Parse the file and return an Array object.N#r   r   r	   r
   )r   r   r    )r   	readlinesr   
startswithr   stripsplitr   r   r   r   r   rT   rX   r   r   )handler    fpr   r   r&   r   rowsr"   r+   r   matrixr(   r   r#   r*   r   s                    r-   readr     s   	6	 b FU# (4s#d12hnn&'( &+12Y/TDJJL/D/
47|s47|(q(*./JCC// 	)C3x!| ?	)
 wwx(Hq>d88A; 	)C3x!| ?	)
 wwx(Hq>$/ 	7LGSWWQZFf$$$!$Xs!3 7+0;w'(7	7
 FMME  0/s   G6G:GGc                    t         j                  j                  t              }t         j                  j	                  |      }t         j                  j                  |d      }| 2t        j                  |      }	 |j                  d       t        |      S t         j                  j                  ||       }t        |      }|S # t        $ r Y t        |      S w xY w)zLoad and return a precalculated substitution matrix.

    >>> from Bio.Align import substitution_matrices
    >>> names = substitution_matrices.load()
    r   z
README.txt)ospathrealpath__file__dirnamer   listdirremover   r   r   )namer   	directorysubdirectory	filenamesr   s         r-   loadr     s     77H%D%I77<<	62L|JJ|,		\*
 i  77<<d+D$ZFM  	i  	s   ;C 	CCr0   )r   r   r   numpyr:   Bio.Filer   Bio.Align.substitution_matricesr   r   r   r   r   ry   r.   r-   <module>r      s>     	    6kJ k\  $Nr.   