
    kiM+                        d Z ddlZddlmZ ddlmc mZ ddlmZ ddl	Z	ddl
mZ ddlZddlmZ ddlmZmZ  ej&                  ej(                  j+                         rdnd      Z ede        e G d	 d
             Ze G d d             Z G d d      Z G d dej4                        Z G d d      Zd Zedk(  r e       \  ZZ yy)a  
============================================================
  10-ATTACTOR N-BODY MNIST CLASSIFIER (CUDA ENHANCED)
  Based on Conditional Collapse Theory (CCT) + 
  Gravitational N-Body Optimization Framework (GNBOF)
============================================================
    N)
DataLoader)	dataclass)ListDictcudacpuz[SYSTEM] Using device: c                   V    e Zd ZU eed<   dZeed<   dZej                  ed<   dZ
eed<   y)AttractorConfigdigit      ?massNpositionFis_black_hole)__name__
__module____qualname__int__annotations__r   floatr   torchTensorr   bool     ex01_colab.pyr
   r
      s)    JD%!Hell!M4r   r
   c                   ~    e Zd ZU dZeed<   dZeed<   dZeed<   dZeed<   d	Z	eed
<   dZ
eed<   dZeed<   dZeed<   y)GNBOFConfig皙?G?betag      @singularity_threshold{Gz?hawking_rater   escape_velocity_scaleentropy_threshold   orbit_iterationsorbit_force_scaleN)r   r   r   r   r   r   r!   r"   r$   r%   r&   r(   r   r)   r   r   r   r   r      sV    AuND%#&5&L%#&5&"u"c#u#r   r   c                   t    e Zd ZdefdZd Zdej                  dej                  fdZd Z	de
fdZdefd	Zy
)NBodyOptimizerconfigc                 ,   t        |      | _        || _        | j                  D cg c]*  }t        j                  |      j                  t              , c}| _        g | _        g | _	        t        d      | _        d| _        d| _        g | _        y c c}w )Ninf        F)listparamsr,   r   
zeros_liketodevicevelocityposition_history
attractorsr   current_entropytotal_energy_spentcollapse_achievedblack_holes)self
parametersr,   ps       r   __init__zNBodyOptimizer.__init__*   sz    :&AEMA))!,//7M "13$U|"%!&&( Ns   /Bc           
      l   t        d       |j                          g }g }d}d}t        j                         5  |D ]  \  }}||k\  r n|j	                  t
              }t        |d      r|j                  |      }	n!|j                  |j                  d      d      }	t        |	j                  d      ||z
        }
|j                  |	d |
 j                                |j                  |d |
 j                                ||
z  } d d d        t        j                  |d      }t        j                  |d      }g | _        t        d      D ]  }||k(  }|j!                         dkD  r)||   j#                  d      j	                  t
              }n8t        j$                  |j&                  d         d	z  j	                  t
              }| j                  j                  t)        |d
|j+                         j-                         j/                  d                    | j                  S # 1 sw Y   &xY w)Nz6
[GNBOF] Initializing 10 digit attractors on device...i  r   get_embeddingdim
      r   r   T)r   r   r   )printevalr   no_gradr3   r4   hasattrrA   viewsizeminappendr   catr7   rangesummeanrandnshaper
   clonedetachrequires_grad_)r<   model
dataloaderall_embeddings
all_labelsmax_samples	collectedinputstargetsembtaker   maskcenters                 r   initialize_attractorsz$NBodyOptimizer.initialize_attractors5   s   GH


	]]_ 	"#- "+6*5/2--f5C ++fkk!nb9C388A;i(?@%%c%4jnn&67!!'%4."4"4"67T!	"	" >q9YYzq1
2Y 
	E&DxxzA~'-22q29<<VD++n&:&:1&=>DHHPOO""?#..0??E$ 
	 ?	" 	"s   CH))H3r   returnc                    t        j                  |      }t        | j                        D ]  \  }}|| j                  v r`||j
                  z
  }t        j                  |      dz   }| j                  j                   |j                  z  |dz  dz   z  }||||z  z  z  }t|j
                  |z
  }t        j                  |      dz   }| j                  j                  |j                  z  |dz  dz   z  }||||z  z  z  } |S )Ngư>   r   )
r   r2   	enumerater7   r;   r   normr,   r   r   )	r<   r   total_forcei	attractor	directiondistance	repulsive
attractions	            r   compute_gravitational_forcez*NBodyOptimizer.compute_gravitational_force^   s    &&x0%doo6 
	CLAyD$$$$y'9'99	 ::i047![[]]NY^^;x1}s?RS	yI,@AA%..9	 ::i047![[]]Y^^;x1}t?ST
zY-ABB
	C r   c           
      0   |j                          t        d      D ci c]  }|g  }}t        j                         5  |D ]  \  }}|j	                  t
              |j	                  t
              }} ||      }t        d      D ]W  }||k(  }	|	j                         dkD  s||   j                  t        j                  ||	   ||	         j                                Y  	 d d d        t        | j                        D ]  \  }}
t        ||         dkD  st        j                  ||         }dd|z   z  }|| j                   j"                  kD  r.|
j$                  s"d|
_        | j&                  j                  |       ||
_         y c c}w # 1 sw Y   xY w)NrE   r   r   T)rH   rP   r   rI   r3   r4   rQ   rN   Fcross_entropyitemrh   r7   lennprR   r,   r"   r   r;   r   )r<   rX   rY   rk   digit_lossesr^   r_   outputsdrb   rl   avg_lossnew_masss                r   update_attractor_massz$NBodyOptimizer.update_attractor_massm   sl   

',Ry1!211]]_ 	e#- e"())F"3WZZ5G-r eA"a<DxxzA~$Q..qwt}gVZm/\/a/a/cdee	e &doo6 	*LAy<?#a'77<?3#.1dkk???	H_H_.2I+$$++A.!)		* 2	e 	es   
FA!F A FFc                    |j                          g }t        j                         5  |D ]H  \  }}|j                  t              } ||      }|j                  t        j                  |d             J 	 d d d        t        j                  |d      }t        j                  |t        j                  |dz         z         |j                  d      z  }|j                         | _        | j                  S # 1 sw Y   xY w)NrF   rC   r   g|=)rH   r   rI   r3   r4   rN   rs   softmaxrO   rQ   logrL   ru   r8   )r<   rX   rY   	all_probsr^   _ry   entropys           r   get_cct_entropyzNBodyOptimizer.get_cct_entropy   s    

	]]_ 	<' <	6*-  7!:;<	< IIiQ/	99Y9u3D)EEFFXYIZZ&||~###	< 	<s   AC77D c                 j    | j                  ||      }|| j                  j                  k  rd| _        yy)NTF)r   r,   r&   r:   )r<   rX   rY   r   s       r   check_collapsezNBodyOptimizer.check_collapse   s4    &&uj9T[[222%)D"r   N)r   r   r   r   r?   rd   r   r   rq   r}   r   r   r   r   r   r   r   r+   r+   )   sL    	); 	)'RELL U\\ **$E $4 r   r+   c                   ,     e Zd Zd fd	Zd Zd Z xZS )AttractorMNISTc                    t         |           || _        || _        t	        j
                  d|      | _        t	        j
                  ||      | _        t	        j                  t        j                  ||      dz        | _        y )Ni  r   )superr?   
latent_dimnum_attractorsnnLinearfc1
classifier	Parameterr   rS   attractor_positions)r<   r   r   	__class__s      r   r?   zAttractorMNIST.__init__   sc    $,99Wj1))J?#%<<NJ0WZ]0]#^ r   c                     |j                  |j                  d      d      }t        j                  | j	                  |            S )Nr   rB   )rK   rL   rs   relur   )r<   xs     r   rA   zAttractorMNIST.get_embedding   s1    FF166!9b!vvdhhqk""r   c                     | j                  |      }| j                  |      }t        j                  || j                         }||dz  z   S )Nr   )rA   r   r   cdistr   )r<   r   zlogitsattractor_logitss        r   forwardzAttractorMNIST.forward   sK    q!#!KK4+C+CDD(3...r   )@   rE   )r   r   r   r?   rA   r   __classcell__)r   s   @r   r   r      s    _#/r   r   c                   ,    e Zd ZdefdZd Zd ZddZy)CCTNBodyTrainerr,   c                 n    |j                  t              | _        || _        || _        g g g g g d| _        y )N)epoch
train_losstest_accr   attractor_masses)r3   r4   rX   	optimizerr,   history)r<   rX   r   r,   s       r   r?   zCCTNBodyTrainer.__init__   s4    XXf%
"!#22RTjlmr   c           
      B   | j                   j                          d\  }}}}t        |      D ]  \  }\  }}	|j                  t              |	j                  t              }	}t        j                  |	      j                         }
d }|
D ]H  }t        |      }t        | j                  j                        D ]  }| j                  |      }t        j                  ||	      }| j                   j                          |j                          t        j                          5  | j                   j#                  |      j%                  d      }| j&                  j(                  |   j*                  |z
  }t        | j                   j-                               D ]  \  }}|j.                  || j                   j0                  u r.|j.                  |xx   || j                  j2                  z  z  cc<   |t5        | j&                  j6                        k  s}| j&                  j6                  |   }|j9                  | j                  j:                        j=                  |j.                  d| j                  j:                  z
         |j?                  || j                  j@                          	 d d d        ||jC                         z  }|dz  }|} K ||jE                  d      \  }}||	jG                  d      z  }||jI                  |	      jK                         jC                         z  } | j&                  jM                  | j                   |       |tE        d|      z  d|z  |z  | j&                  jO                  | j                   |      fS # 1 sw Y   xY w)N)r/   r   r   r   r   rC   rF   )alpha      Y@)(rX   trainrh   r3   r4   r   uniquetolistr   rP   r,   r(   rs   rt   	zero_gradbackwardrI   rA   rR   r   r7   r   r=   gradr   r)   rv   r5   mul_r!   add_sub_r%   ru   maxrL   eqrQ   r}   r   )r<   train_loaderr   
total_losstotal_updatescorrecttotal	batch_idxr^   r_   orbit_indiceslast_outputs	orbit_idxr   ry   loss
batch_axisorbit_forcerk   r>   v	predicteds                         r   train_epochzCCTNBodyTrainer.train_epoch   s   

4@1
M7E,5l,C $	>(I($ii/F1CGF!LL188:ML* +		N	t{{;;< +A"jj0G??7G<DJJ((*MMO S%)ZZ%=%=f%E%J%Jq%J%Q
&*nn&?&?	&J&S&SV`&`$-djj.C.C.E$F 
SDAq vv~ ( DJJ$B$BB !y 1[4;;C`C`5` ` 1 3t~~'>'>#??$(NN$;$;A$> !t{{'7'7 8 = =affAPTP[P[P`P`L` = a !q0Q0Q R
S	S  $))+-J!Q&M#*L1++8 '+//29a(9<<0446;;==I$	>L 	,,TZZFC=114'>E3I4>>KhKhimisis  vB  LC  C  	C5S Ss   C1N	BN	Nc                    | j                   j                          d\  }}t        j                         5  |D ]  \  }}|j	                  t
              |j	                  t
              }}| j                  |      }|j                  d      \  }}||j                  d      z  }||j                  |      j                         j                         z  } 	 d d d        d|z  |z  S # 1 sw Y   xY w)N)r   r   rF   r   r   )rX   rH   r   rI   r3   r4   r   rL   r   rQ   ru   )	r<   test_loaderr   r   r^   r_   ry   r   r   s	            r   testzCCTNBodyTrainer.test   s    

]]_ 	>#. >"())F"3WZZ5G**V,&{{1~9a(9<<0446;;==>	> g~%%	> 	>s   BC##C,c           
         | j                   j                  | j                  |       t        |      D ]:  }| j	                  ||      \  }}}| j                  |      }| j                   j                  | j                  |      }	| j                  d   j                  |       | j                  d   j                  |       | j                  d   j                  |       | j                  d   j                  |	       | j                  d   j                  | j                   j                  D 
cg c]  }
|
j                   c}
       t        d|dz    d|d	d
|	d       |s0 | j                  S  | j                  S c c}
w )Nr   r   r   r   r   z[Epoch rF   z] Acc: z.2fz%, Entropy: z.4f)r   rd   rX   rP   r   r   r   r   rN   r7   r   rG   )r<   r   r   epochsr   r   acc	collapsedr   r   as              r   r   zCCTNBodyTrainer.train   s?   ,,TZZF6] 
	 E#'#3#3L%#H D#yyy-Hnn44TZZMGLL!((/LL&--d3LL$++H5LL#**73LL+,33T^^E^E^4_QVV4_`GE!G9GHS>gc]ST%||
	  || 5`s   +E<
N)rE   )r   r   r   r   r?   r   r   r   r   r   r   r   r      s!    n n*CX
&r   r   c            	         t        j                  t        j                         t        j                  dd      g      } t        j
                  j                  ddd|       }t        j
                  j                  ddd|       }t        |dd      }t        |dd      }t               j                  t              }t        dd	d
dddd      }t        |j                         |      }t        |||      }|j                  ||      }	||	fS )N)g      ?z./dataT)rootr   download	transformF   )
batch_sizeshuffleg?r    g      @g333333?r#   r'   )r   r!   r"   r&   r%   r(   r)   )
transformsComposeToTensor	NormalizetorchvisiondatasetsMNISTr   r   r3   r4   r   r+   r=   r   r   )
r   train_datasettest_datasetr   r   rX   r,   r   trainerr   s
             r   mainr      s    ""J$7$7$9:;O;OPVX^;_#`aI((..HDSWcl.mM''--85SWcl-mLmTJL\c5IK'E
!"F u//16:IeY7GmmL+6G'>r   __main__)!__doc__r   torch.nnr   torch.nn.functional
functionalrs   torch.utils.datar   r   torchvision.transformsr   numpyrw   dataclassesr   typingr   r   r4   r   is_availablerG   r
   r   r+   Moduler   r   r   r   rX   r   r   r   r   <module>r      s        '  +  !  


 7 7 9fu	E x( )
      $ $ $l l\/RYY /&L L\* zVNE7 r   