
՟Kc           @   s   d  d k  Z  d  d k Z d  d k Z d  d k Z d  d k l Z y+ d  d k l Z l Z l	 Z	 d GHe
 Z Wn d GHe Z n Xd d d     YZ d S(	   iN(   t   add(   t
   cPropagatet
   cEuclideant   cUpdateUnits   loading SOM C-extensions   can not load SOM C-extensiont   SOMc           B   sU  e  Z d  d d d d d d  Z d d d	  Z d
   Z d  d d d  Z d   Z d   Z d d  Z d   Z	 d d  Z
 d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d d h  d  Z d d e d h  d  Z d    Z d! d"  Z d# d! d d! d$  Z d%   Z d e d&  Z e d'  Z d( d)  Z RS(*   i   i   i   t   hext   toroidt    c         C   sG   | |  _  | |  _ | d j o |  i |  n |  i | | |  d  S(   NR   (   t   gridTypet   topologyTypet   readSOMt   resize(   t   selft   inputDimt   numRowst   numColst   gridt   topologyt   initialFile(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   __init__   s
    		t   Arrayic         C   s   g  } | d j  o |  i  } n | d j oO h  } xA t |  i  D]0 } x' t |  i  D] } g  | | | f <qY WqC W| Sx^ t |  i  D]M } g  } x1 t |  i  D]  } d g | } | i |  q W| i |  q W| S(   Ni   t   Dictg        (   R   t   ranget   outRowst   outColst   append(   R   t   mapTypet   numDimt   newMapResultt   rowt   colt   rest   unit(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   newMap   s(        c         C   sQ   g  } xD t  |  i  D]3 } x* t  |  i  D] } | i | | f  q, Wq W| S(   N(   R   R   R   R   (   R   R   R   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   getUnits,   s      c         C   s^   t  |  |  _ t  |  |  _ t  |  |  _ |  i   |  _ |  i   |  _ |  i   |  _ d  S(   N(	   t   intR   R   R   R!   t   weightsArrayR"   t   unitst	   tempUnits(   R   R   R   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyR   3   s    c   
      C   s  t  |  } | i   i   } d | j oF | i d  } | d d  |  _ d | j o | d d  |  _ q n d |  _ | i d	  } t | d
 d d ! |  _ t | d d   |  _ t | d d   |  _	 |  i
   |  _ |  i   |  _ |  i   |  _ x | D] } | i   i d  } t | d
  } t | d  } | | f |  i j o: g  } | d D] }	 | t |	  qe~ |  i | | <qd | i   GHqW| i   d  S(   NR   s   	i   iR   i   it   rects    * i    i   ii   is"   could not initialize some with: %s(   t   opent   readlinet   stript   splitR   R	   R#   R   R   R   R!   R$   R"   R%   R&   t   floatt   close(
   R   t   somFilet   infilet	   firstlinet   fieldst   lineR   R   t   _[1]t   x(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyR
   ;   s0    	 :c         C   s   t  | d  } | i d |  i |  i |  i |  i |  i f  xb |  i D]W \ } } d | | f } x' |  i | | D] } | d | 7} qv W| i | d  qH W| i	   d  S(   Nt   ws4   # %d rows	%d cols	%d dimensions	%s grid	%s topology
s   %d	%ds   	%fs   
(
   R(   t   writeR   R   R   R   R	   R%   R$   R-   (   R   R.   t   outfileR   R   t	   outvectort   val(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   saveSOMX   s    /
  c         C   s   t  | d  } | d j o | i d |  n xb | D]Z } | i d t | d   x) | d D] } | i d t |   qd W| i d  q8 W| i   d  S(	   NR5   R   s   #%s
s   %.4fi    i   s   	%.4fs   
(   R(   R6   R,   R-   (   R   t   regArrayt   mapFilet   commentR7   R   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   saveMapb   s      c   	      C   s   |  i    } t |  } d } d } xw | D]o } | d d j o q+ n d } | i   i   } x, | D]$ } t |  | | | <| d 7} qh W| d 7} q+ W| i   | S(   Ni    t   #i   (   R!   R(   R*   R+   R,   R-   (	   R   R<   t   resultArrayR/   t   rowIndext   colIndexR2   R1   R9   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   readMapm   s"      
c         C   sa  d |  i  |  i f GHd |  i |  i f GH| d j  o d } |  i  d } n | } | d } |  i d j o d t |  i |  i d d | | !  d } x t |  i   D]b } | d d j o | Gn x> t |  i  D]- } d |  i |  i | | | | ! d	 Gq WHHq WnG xC |  i D]8 \ } } | G| Gd
 G|  i |  i | | | | ! GHq!Wd  S(   Ns   Rows = %d, Cols = %ds   grid = %s inputDim = %di    i   R   t    i   s    [s   ] s   	(	   R   R   R   R   t   lent   prettyFloatR$   R   R%   (   R   t	   dimensiont   minDimt   maxDimt   spacerR   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   describe   s*    
/  +	
 c         C   sM   d } |  i  | | } x/ t | |  D] \ } } | | | d 7} q' W| S(   Ng        i   (   R$   t   zip(   R   t   inputVectort   outRowt   outColt   distSquaredt   currentUnitt   inputt   current(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   prop   s     c         C   sE   d } x/ t  | |  D] \ } } | | | d 7} q Wt i |  S(   Ng        i   (   RL   t   matht   sqrt(   R   t   vecAt   vecBt   distancet   at   b(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt	   euclidean   s
     c         C   s   d } |  i  } d } x | D]x \ } } d } |  i | | } x/ t | |  D] \ }	 }
 | |	 |
 d 7} qO W| | j  o | | f } | } q q W| S(   Ni   i    i   (   i    i    (   R%   R$   RL   (   R   t	   inputVectt   smallestt   locUnitst   winUnitR   R   t
   magSquaredRQ   RR   RS   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt	   propagate   s    	  c   	      C   su   t  | |  } t  | |  } |  i | } | | j  o
 | } n |  i | } | | j  o
 | } n t | |  S(   N(   t   absR   R   t   max(	   R   t   aRowt   aColt   bRowt   bColt   distRowt   distColt   diffRowt   diffCol(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   recDistance   s    

c         C   s  | d } | d } | d } | d } g  } t  } d | j o t } | i | | f  n t  }	 | |  i j  o t }	 | i | | f  n t  }
 d | j o t }
 | i | | f  n t  } | |  i j  o t } | i | | f  n | d d j oK |
 o@ | o | i | | f  n |	 o | i | | f  qLqnH | o@ | o | i | | f  n |	 o | i | | f  qn | S(   Ni   i    i   (   t   Falset   TrueR   R   R   (   R   t   arowt   acolt   arowmt   arowpt   acolmt   acolpt   resultst   arowmOKt   arowpOKt   acolmOKt   acolpOK(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   immediateHexNeighbors   sB    



c         C   s   | d |  i  } | d |  i  } | d |  i } | d |  i } | | f | | f | | f | | f g } | d d j o* | i | | f  | i | | f  n' | i | | f  | i | | f  | S(   Ni   i   i    (   R   R   R   (   R   Rp   Rq   Rr   Rs   Rt   Ru   Rv   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   immediateHexNeighborsToroid   s    *
c         C   s  g  } | | | f d } | | f g | | | f d } t  d | d  } x | D] }	 | i g   g  }
 g  } x | D] \ } } xy | | | f d D]c \ } } | | f | j oD | d i | | f  | i d | | f  | i | | f  q q Wq{ W| } qU W| S(   Ni   i   ii    (   R   R   t   insert(   R   t   theRowt   theColt	   startDictt	   maxRadiust
   resultListt   previousUnitst	   seenUnitst
   radiusListt   aRadiust   currentUnitst	   nextUnitsR   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   getHexNeighbors
  s&    !   
c         C   sZ  |  i  d d  } t | d  } |  i d j o x!|  i D] \ } } g  } | D] } | g  qS ~ | | | f <xa |  i D]V \ } }	 |  i | | | |	  }
 |
 | j o% | | | f |
 i | |	 f  q} q} Wq< Wnx|  i  d d  } x |  i D] \ } } |  i d j oZ | | f g |  i | |  g | | | f <| | f g |  i | |  g | | | f <q | | f g |  i | |  g | | | f <| | f g |  i | |  g | | | f <q Wd t	 i
   GHd } xs |  i D]h \ } } | | | f c |  i | | | |  7<| d 7} | d d j o d	 t	 i
   | f GHqqW| S(
   NR   R   i   R'   t   sheets&   %s	built neighborhood Dict of radius 1i    i  s   %s	finished %d units(   R!   R   R   R%   t   rectDistanceR   R	   R{   R|   t   timet   asctimeR   (   R   t   radiust
   resultDictR   R   R   R3   R4   Rp   Rq   t   distt   resultDict1t   index(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   buildNeighborDict  s8    
 +
 1
 +/+/
 (
c         C   sH   g  } t  | |  D] \ } } | | | | q ~ } t t | |  S(   N(   RL   t   mapR    (   R   t   oldVect   inVect   rateR3   t   in_it   old_it   correctionVector(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt
   updateUnit;  s    8g?i   c         C   s  |  i  } t o. t |  i | |  i |  i |  i  } t } n |  i |  } | \ } } | d }	 | | }
 | |  i | | | |  |  i | | <x} t	 d |	  D]l } | t
 i d | d |	 d  } x@ |
 | D]4 \ } } | |  i | | | |  |  i | | <q Wq W| S(   Ni   g      i   (   R   t   hasExtensionR   R$   R   R   R   R   Rb   R   RU   t   exp(   R   RM   t   learningRatet   upRadiust	   neighborst   updateFunctiont   winnert	   winnerRowt	   winnerColt   sradiust   winnerDistListR   t	   theWeightR   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   update?  s     	$


( # 0g?i@B c         C   s  | d j  o t  |  i |  i  d } n d t i |  t |  } | i   } t |  }	 t i	 |  t |  d j o7 d t
 i   | f GH|  i |  } d t
 i   GHn x t |  D] }
 | |
 |	 } t i |
 |  } | | } t | |  } |  i | | | | d | |
 d d j oV | o0 d	 GHd
 t
 i   |
 |  i |  | | f GHqd t
 i   |
 | | f GHq q Wd  S(   Ni   i   ii    s*   %s	building neighborhood Dict of radius %ds   %s	built neighborhood DictR   i s   calling scoreData()s*   %s	time %d	score %.3f	radius %d	learn %.4fs   %s	time %d	radius %d	learn %.4f(   Rd   R   R   RU   t   logR,   t   keysRE   t   randomt   shuffleR   R   R   t   xrangeR   R#   R   t	   scoreData(   R   t   trainingSetR   t	   timeStepst   printScoresR   t   neighborDictt
   multipliert	   vecIDListt   numTrainingt   epocht   vectorIDt   decayt   epochLearningRatet   epochRadius(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   trainS  s,     
+c         C   so   | i    } t i | |  i |  i  } d } x: |  i D]/ \ } } | | | |  i | | <| d 7} q8 Wd  S(   Ni    i   (   R   R   t   sampleR   R   R%   R$   (   R   R   t	   sampleIDst   randomSampleR   R   R   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   initializeWeightsm  s    
 i    c         C   s   t  |  } d } d } x | D] } | i   } t |  d j  o q n | d d j o q n | i   i   } | d j  o t | |  } n t | |  | j o | d 7} q q W| i   | | f S(   Ni    ii   R?   i   (   R(   R*   RE   R+   R-   (   R   t
   infilenamet
   startFieldR/   R   RG   R2   R1   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   datasetSizeu  s"     
I ^в    c      
   C   su  t  |  } d } | d j  o |  i } n h  } t }	 | d j o
 t }	 n x| D]}
 |
 i   }
 t |
  d j  o qV n |
 d d j o qV n |
 i   i   } | | | | !} t |  | j o g  } |	 o | | } n d t |  } y9 g  } | D] } | t |  q	~ | | <| d 7} WqQd t |  GHqQXn | | j o PqV qV W| i	   | S(   Ni    i   ii   R?   s   record%ss   could not convert %s(
   R(   R   Rn   Ro   R*   RE   R+   t   strR,   R-   (   R   R   t
   numRecordsR   t   IDFieldRG   R/   R   t   dataDictt   trackIDR2   R1   t
   currentRect   recordt   recordIDR3   R4   (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt
   getDataset  s>    
 +	
c         C   s   |  i  d d  } t oH xt | D]9 } | t |  i | | |  i |  i |  i  i |  q  Wn0 x, | D]$ } | |  i | |  i |  qh W| S(   NR   R   (	   R!   R   R   R$   R   R   R   R   Rb   (   R   R   R   t   recID(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt
   getWinners  s     ; "c      
   C   s  d } |  i  } g  } h  } d } t }	 |  i }
 t o
 t }
 n | d j o t }	 t | d  } n |  i |  } x|  i D]} | \ } } |  i	 | | } | o" d t
 |  |  i |  f GHn |	 o- | i d | | |  i | d d f  n x | | D] } |
 | | |  } | | 7} | o# d	 | |  i | |  | f GHn |	 o1 | i d
 | | |  i | | d d f  qqWq W|	 o | i   n y | t |  } Wn d } n X| S(   Ni    g        R   R5   s   %s: [%s]s   unit	%d,%d	%s
t   delims   	s   	%s [%s] %.2fs   %.2f	%s	%s
(   R   Rn   R\   R   R   Ro   R(   R   R%   R$   R   RF   R6   R-   RE   (   R   t   datasett   outfilenameR   R   RG   t   idListt
   winnerDictt
   totalScoret	   doOutfilet	   scorefuncR7   R    R   R   t   unitWeightsR   t   winnerScoret   toreturn(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyR     sH    		

 "- 
#9
c   	      C   s   |  i  d d  } t |  } x | D] } | i   } d | j oE | d i d  \ } } t |  } t |  } g  | | | f <q% | o | | | f i |  q% | | | f i | d  q% W| i   | S(   NR   R   R    i   t   ,(   R!   R(   R+   R#   R   R-   (	   R   t   scorefilenamet   fullt   wDictt	   scorefileR2   R1   t   wrowt   wcol(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   readScoreFile  s     
RD   c         C   s3   d } x" | D] } | d | | f 7} q W| d  S(   NR   s   %.2f%si(    (   R   t	   floatListR   t   outputt   afloat(    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyRF     s
     (   t   __name__t
   __module__R   R!   R"   R   R
   R:   R>   RC   RK   RT   R\   Rb   Rm   R{   R|   R   R   R   R   Rn   R   R   R   R   R   R   R   RF   (    (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyR      s6   			
						*					#	+(    (   RU   R   R   t   copyt   operatorR    t   _csomR   R   R   Ro   R   Rn   R   (    (    (    s8   /woldlab/castor/data00/home/georgi/commoncode/SOM/som.pyt   <module>   s   0

