
    /fi7n                     j   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	m
Z
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 ddlZddlZddlmZmZ ddlmZmZmZmZ e G d d             Z e G d	 d
             Z! G d d      Z" G d dejF                        Z$ G d d      Z%d Z&e'dk(  r e&       \  Z(Z)yy)aA  
============================================================
  10-ATTACTOR N-BODY MNIST CLASSIFIER
  Based on Conditional Collapse Theory (CCT) + 
  Gravitational N-Body Optimization Framework (GNBOF)
============================================================

  Concept: Each digit (0-9) is a gravitational attractor.
  - Parameters orbit around these attractors
  - Black holes = overfitting singularities (memorization)
  - Lagrange points = decision boundaries
  - Energy conservation = convergence guarantee
============================================================
    N)
DataLoaderTensorDataset)Circle)	dataclassfield)ListDictTupleOptionalc                   v    e Zd ZU dZeed<   dZeed<   dZe	j                  ed<   dZeed<   d	Zeed
<   d	Zeed<   y)AttractorConfigz&Configuration for each digit attractordigit      ?massNpositionFis_black_hole        event_horizon_radiusorbital_energy)__name__
__module____qualname____doc__int__annotations__r   floatr   torchTensorr   boolr   r        */home/per/Documents/Multiple zeros/ex01.pyr   r   #   sA    0JD%!Hell!M4"%%%NEr!   r   c                       e Zd ZU dZ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<   dZeed<   y)GNBOFConfigz!Global N-Body Optimization Config皙?G?betag      @singularity_threshold{Gz?hawking_rater   escape_velocity_scale      ?lagrange_thresholdg-C6?periodicity_toleranceg    .Acompute_budgetentropy_thresholdN)r   r   r   r   r&   r   r   r(   r)   r+   r,   r.   r/   r0   r1   r    r!   r"   r$   r$   -   sc    +AuND%#&5&L%#&5& ###'5'NE"u"r!   r$   c                       e Zd ZdZddefdZd Zdej                  dej                  fdZ	d Z
d	 Zdefd
ZdefdZdefdZdeej                     fdZy)NBodyOptimizerz
    N-Body Gravitational Optimizer
    
    Instead of standard gradient descent, parameters experience
    gravitational pull from all 10 digit attractors.
    configc                    t        |      | _        || _        || _        | j                  D cg c]  }t	        j
                  |       c}| _        g | _        g | _        t        d      | _
        d| _        d| _        g | _        y c c}w )Ninfr   F)listparamsr4   num_attractorsr   
zeros_likevelocityposition_history
attractorsr   current_entropytotal_energy_spentcollapse_achievedblack_holes)self
parametersr4   r9   ps        r"   __init__zNBodyOptimizer.__init__B   s{    :&, 7;kkB))!,B "13$U|"%!& ') Cs   Bc           
      D   t        d       |j                          g }g }d}d}t        j                         5  t	        |      D ]  \  }\  }}	||k\  r nt        |d      r|j                  |      }
n!|j                  |j                  d      d      }
t        |
j                  d      ||z
        }|j                  |
d|        |j                  |	d|        ||z  } ddd       t        j                  |d      }t        j                  |d      }g | _        t        d      D ]  }||k(  }|j                         dkD  r||   j                  d      }n%t        j                   |j"                  d	         d
z  }d}| j                  j                  t%        |||j'                         j)                         j+                  d                    t        d| j                  D cg c]  }|j,                   c}        | j                  S # 1 sw Y   2xY wc c}w )zw
        Initialize 10 attractors in latent space.
        Each attractor = mean embedding of its digit class.
        z,
[GNBOF] Initializing 10 digit attractors...  r   get_embeddingNdim
      r%   r   T)r   r   r   z,[GNBOF] Attractors initialized with masses: )printevalr   no_grad	enumeratehasattrrH   viewsizeminappendcatr=   rangesummeanrandnshaper   clonedetachrequires_grad_r   )rB   model
dataloaderall_embeddings
all_labelsmax_samples	collected	batch_idxinputstargetsembtaker   maskcenterr   as                    r"   initialize_attractorsz$NBodyOptimizer.initialize_attractorsR   s   
 	=> 	


	]]_ 	"09*0E ",	,FG+5/2--f5C ++fkk!nb9C388A;i(?@%%c%4j1!!'%4.1T!	"	" >q9YYzq1
 2Y 	E&DxxzA~'-22q29^%9%9!%<=C DOO""?..0??E$ 	  	<doo=^aff=^<_`aK	" 	"H >_s   B(H(H
H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 )u   
        Compute total gravitational force on parameter position from all attractors.
        
        F_total = Σ (G * m_i * (p_i - pos) / ||p_i - pos||³)
        gư>   r   )
r   r:   rQ   r=   rA   r   normr4   r&   r   )	rB   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           
         |j                          t        d      D ci c]  }|g  }}t        j                         5  |D ]t  \  }} ||      }t        d      D ]Y  }	||	k(  }
|
j	                         dkD  s||	   j                  t        j                  ||
   ||
   d      j                                [ v 	 ddd       t        | j                        D ]   \  }}t        ||         dkD  st        j                  ||         }dd|z   z  }|| j                  j                  kD  r=|j                   s1d|_        | j"                  j                  |       t%        d| d	       ||_        |j                   s|xj&                  | j                  j(                  z  c_        |j&                  | j                  j                  k  sd
|_        | j"                  j+                  |       t%        d| d       # yc c}w # 1 sw Y   IxY w)z
        Update attractor masses based on training dynamics.
        - High loss = weak attractor
        - Overfitting detected = convert to black hole
        rL   r   rZ   )	reductionNr   Tu'   [GNBOF] ⚫ BLACK HOLE DETECTED: Digit z overfitting!Fu   [GNBOF] ⭐ Black hole z! evaporated via Hawking radiation)rO   rX   r   rP   rY   rV   Fcross_entropyitemrQ   r=   lennprZ   r4   r)   r   rA   rN   r   r+   remove)rB   r`   ra   epochrt   digit_lossesrg   rh   outputsdrk   ru   avg_lossnew_masss                 r"   update_attractor_massz$NBodyOptimizer.update_attractor_mass   s    	

',Ry1!211]]_ 	w#- w-r wA"a<DxxzA~$Q..qwt}gVZmgm/n/s/s/uvww	w &doo6 	^LAy<?#a'77<?3#.1 dkk???	H_H_.2I+$$++A.CA3mTU!)	 **NNdkk&>&>>N ~~(I(II27	/((//2 7s:[\])	^ 2	w 	ws   
G;7H 6AH  H
c                     |       }t        j                  | j                  D cg c]  }|j                          c}      }| j	                  |      }t         j
                  j                  || j                  d      }t        j                  |D cg c]  }|j                          c}      }||dz  z   }	t        | j                        D ]  \  }
}| j                  |
   }| j                  j                  |z  d| j                  j                  z
  ||
   z  z   }|| j                  |
<   |xj                  | j                  j                  |z  z  c_         | xj                  |j                         z  c_        |S c c}w c c}w )z2
        Single N-Body optimization step.
        T)retain_graphr%   rM   )r   rW   r8   flattenrz   autogradgradrQ   r;   r4   r(   datar,   r?   r   )rB   closurelossrD   r   gravitygradsg	grad_flatcombined_forcert   vv_news                r"   stepzNBodyOptimizer.step   sE   
 y 994;;?aaiik?@ 228< ##D$++D#IIIE:qqyy{:;	 #Ws]2 dkk* 	@DAqa AKK$$q(A0@0@,@E!H+LLE$DMM!FFdkk77%??F		@ 	499;.- @ ;s   E>Fc           	         t        j                  | j                  D cg c].  }|j                         j	                         j                         0 c}      }t        | j                        dkD  rt        t        | j                        dz
  t        dt        | j                        dz
        d      D ]B  }t        j                  || j                  |   z
        }|| j                  j                  k  sB y | j                  j                  |       t        | j                        dkD  r| j                  j                  d       yc c}w )	z
        Check if parameters are in stable orbit (converged).
        Periodicity = params approximately repeat after k steps.
        rL   rM   r      rI   T2   F)r   rW   r8   r   r]   r^   r   r<   rX   maxrr   r4   r/   rV   pop)rB   rD   current_postdiffs        r"   detect_periodicityz!NBodyOptimizer.detect_periodicity   s   
 iit{{ S!!2!2!4!;!;!= STt$$%*3t44593q#dF[F[B\_aBa;bdfg  zz+0E0Ea0H"HI$++;;; 
 	$$[1t$$%*!!%%a( !Ts   3Ec                    |j                          g }t        j                         5  |D ]5  \  }} ||      }t        j                  |d      }|j                  |       7 	 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)z
        Compute CCT entropy: uncertainty about digit classification.
        Lower = more confident = more collapsed.
        rM   rJ   Nr   g|=)rO   r   rP   r}   softmaxrV   rW   rY   logrT   r   r>   )	rB   r`   ra   	all_probsrg   _r   probsentropys	            r"   get_cct_entropyzNBodyOptimizer.get_cct_entropy   s    
 	

	]]_ 	(' (	-		'q1  '(	( IIiQ/	 99Y9u3D)EEFFXYIZZ&||~||~	( 	(s   ;C((C1c                     | j                  ||      }| j                         }|| j                  j                  k  r.t	        d|dd| j                  j                          d| _        y|rt	        d       d| _        yy)z|
        CCT Collapse Condition:
        - Entropy below threshold
        - OR periodicity detected (stable orbit)
        u   [GNBOF] ✓ COLLAPSE: Entropy .4fz < Tu9   [GNBOF] ✓ COLLAPSE: Stable orbit detected (periodicity)F)r   r   r4   r1   rN   r@   )rB   r`   ra   r   periodics        r"   check_collapsezNBodyOptimizer.check_collapse  s~     &&uj9**,T[[222273-s4;;C`C`Babc%)D"MO%)D"r!   c                    g }t        | j                        }t        |      D ]  }t        |dz   |      D ]  }| j                  |   j                  | j                  |   j                  z   dz  }t	        j
                  || j                  |   j                  z
        }t	        j
                  || j                  |   j                  z
        }t        ||z
        | j                  j                  k  s|j                  |         |S )z
        Find Lagrange points between attractors = decision boundaries.
        These are equilibrium points where forces balance.
        rM   rq   )
r   r=   rX   r   r   rr   absr4   r.   rV   )rB   lagrange_pointsnrt   jmidd1d2s           r"   get_lagrange_pointsz"NBodyOptimizer.get_lagrange_points&  s    
  q 
	0A1q5!_ 	0q)22T__Q5G5P5PPTUU ZZdooa&8&A&A ABZZdooa&8&A&A ABrBw<$++"@"@@#**3/	0
	0 r!   N)rL   )r   r   r   r   r$   rE   rn   r   r   rz   r   r   r   r   r   r   r   r   r   r    r!   r"   r3   r3   :   sz    ); ) 3jELL U\\ 0&^P@D (E ,4 *T%,,%7 r!   r3   c                   <     e Zd ZdZd fd	Zd Zd ZdefdZ xZ	S )AttractorMNISTzo
    MNIST classifier with attractor-based dynamics.
    Hidden activations orbit around digit attractors.
    c                    t         |           || _        || _        t	        j
                  dddd      | _        t	        j
                  dddd      | _        t	        j                  dd      | _	        t	        j                  d|      | _        t	        j                  ||      | _        t	        j                  t        |      D cg c]S  }t	        j                  t	        j                  |d      t	        j                          t	        j                  dd            U c}      | _        t	        j$                  t'        j(                  ||      dz        | _        y c c}w )	NrM          )padding@   rq   i@  r%   )superrE   
latent_dimr9   nnConv2dconv1conv2	MaxPool2dpoolLinearfc1attractor_projection
ModuleListrX   
SequentialReLUclassifiers	Parameterr   r[   attractor_positions)rB   r   r9   r   	__class__s       r"   rE   zAttractorMNIST.__init__G  s   $, YYq"a3
YYr2q!4
LLA&	99Z4 %'IIj.$I! ==
 ^,*

 	 MM		*b)			"a *
  $&<<NJ0WZ]0]#^ *
s   AEc                 \   | j                  t        j                  | j                  |                  }| j                  t        j                  | j	                  |                  }|j                  |j                  d      d      }t        j                  | j                  |            }|S )Nr   rI   )r   r}   relur   r   rS   rT   r   )rB   xs     r"   rH   zAttractorMNIST.get_embeddinga  ss    IIaffTZZ]+,IIaffTZZ]+,FF166!9b!FF488A;r!   c                 8   | j                  |      }| j                  |      }g }t        | j                        D ]>  }t	        j
                  || j                  |   z
  dd      }| }|j                  |       @ t	        j                  |d      }||dz  z   }|S )NrM   T)rK   keepdimrJ   r%   )	rH   r   rX   r9   r   rr   r   rV   rW   )	rB   r   zlogitsattractor_logitsrt   dist
correctionfinal_logitss	            r"   forwardzAttractorMNIST.forwardh  s    q! **1- t**+ 	0A::a$":":1"==1dSDJ##J/	0 !99%51=  03 66r!   ro   c                     | j                   j                  j                         | j                   j                  &| j                   j                  j                         dS ddS )z&Return current state of all attractorsN)	positions	gradients)r   r   r]   r   )rB   s    r"   get_attractor_statesz#AttractorMNIST.get_attractor_states  sa     1166<<> 4499E 1166<<>
 	
 #	
 	
r!   )r   rL   )
r   r   r   r   rE   rH   r   r	   r   __classcell__)r   s   @r"   r   r   A  s$    
_46
d 
r!   r   c                   @    e Zd ZdZdefdZd Zd Zd
dZddZ	ddZ
y	)CCTNBodyTrainerzQ
    Trainer implementing Conditional Collapse Theory + N-Body Optimization.
    r4   c                 L    || _         || _        || _        g g g g g g g d| _        y )N)r   
train_losstest_accr   energy_spentrA   attractor_masses)r`   	optimizerr4   history)rB   r`   r   r4   s       r"   rE   zCCTNBodyTrainer.__init__  s7    
"  "
r!   c                 2   | j                   j                          d}d}d}t        |      D ]  \  }\  }}|dz  dk(  rX| j                  j	                  | j                   |      }	t        d| d|	ddt        | j                  j                                | j                  |      }
t        j                  |
|      }| j                   j                          |j                          t        j                         5  t        | j                   j                               D ]s  \  }}|j                  |j                   | j                   j"                  j                   k(  sA| j                  j%                  |      }|xj                  |dz  z  c_        u 	 d d d        t        j                         5  t        | j                   j                               D ]  \  }}|j                  |t        | j                  j&                        k  s6| j                  j&                  |   }|j)                  | j*                  j,                        j/                  |j                  d| j*                  j,                  z
  	       |j1                  || j*                  j2                  	        	 d d d        ||j5                         z  }|
j7                  d      \  }}||j9                  d      z  }||j;                  |      j=                         j5                         z  } | j                  j?                  | j                   ||       | j                  jA                  | j                   |      }|t        |      z  d
|z  |z  |fS # 1 sw Y   xY w# 1 sw Y   xY w)Nr   d   z	  [Batch z] Entropy: r   z, Black Holes: r*   rM   )alpha      Y@)!r`   trainrQ   r   r   rN   r   rA   r}   r~   	zero_gradbackwardr   rP   rC   r   r\   r   rz   r;   mul_r4   r(   add_sub_r,   r   r   rT   eqrY   r   r   )rB   train_loaderr   
total_losscorrecttotalrf   rg   rh   r   r   r   rt   rD   r   r   r   	predicted	collapseds                      r"   train_epochzCCTNBodyTrainer.train_epoch  s   


,5l,C #	:(I(3!#..88\R	)K}OTWX\XfXfXrXrTsStuv jj(G??7G4D JJ  "MMO  5%djj&;&;&=> 5DAqvv)77djj&D&D&J&JJ&*nn&P&PQR&SGFFgn4F55  K%djj&;&;&=> KDAqvv)a#dnn6M6M2N.N NN33A6t{{//055affAHXHXDX5Yq(I(IJ	KK $))+%J";;q>LAyW\\!_$Ey||G,0027799GG#	:L 	,,TZZuM NN11$**lK	C--tg~/EyPP95 5K Ks1   ;6N 2-N  5N 26N)"NBN N
	N	c                    | j                   j                          d}d}t        j                         5  |D ]n  \  }}| j                  |      }|j	                  d      \  }}||j                  d      z  }||j                  |      j                         j                         z  }p 	 d d d        d|z  |z  S # 1 sw Y   xY w)Nr   rM   r   )	r`   rO   r   rP   r   rT   r   rY   r   )	rB   test_loaderr   r   rg   rh   r   r   r   s	            r"   testzCCTNBodyTrainer.test  s    

]]_ 	>#. >**V,&{{1~9a(9<<0446;;==	>	> g~%%	> 	>s   A4B88Cc           
      4   t        d       t        d       t        d       | j                  j                  | j                  |       t	        |      D ]  }t        j
                         }| j                  ||      \  }}}| j                  |      }	| j                  j                  | j                  |      }
| j                  d   j                  |       | j                  d   j                  |       | j                  d   j                  |	       | j                  d   j                  |
       | j                  d   j                  | j                  j                         | j                  d	   j                  t        | j                  j                               | j                  d
   j                  | j                  j                  D cg c]  }|j                   c}       t        d|dz    d| dt        j
                         |z
  dd       t        d|dd|dd       t        d|	dd       t        d|
d       t        d| j                  j                  d       t        dt        | j                  j                                t        d| j                  j                  D cg c]  }|j                  d c}        |st        d       ||dz
  k  st        d        | j                  S  | j                  S c c}w c c}w )N=
============================================================z(  CCT-GNBOF TRAINING: 10-ATTRACTOR MNIST<============================================================r   r   r   r   r   rA   r   z
[Epoch rM   /z] z.1fsz  Train Loss: r   z | Train Acc: .2f%z  Test Acc:   z  Entropy:    z  Energy:     z  Black Holes: z  Attractor Masses: z.3fu+   
✓ COLLAPSE ACHIEVED - Theory understood!z,  Early stopping - entropy threshold reached)rN   r   rn   r`   rX   timer   r   r   r   rV   r?   r   rA   r=   r   )rB   r   r   epochsr   
start_timer   	train_accr   r   r   rm   s               r"   r   zCCTNBodyTrainer.train  s   m89f 	,,TZZF6] !	EJ 04/?/?e/T,J	9 yy-H nn44TZZMGLL!((/LL&--j9LL$++H5LL#**73LL(//0Q0QRLL'..s4>>3M3M/NOLL+,33T^^E^E^4_QVV4_` IeAgYaxr$))+
2J31OqQRN:c"2.3qQRN8C.23N73-01N4>>#D#DS"IJKOC(B(B$C#DEF(4>>C\C\)]aQVVCL/)](^_`DE6A:%HI||G!	F ||# 5` *^s   L
4Lc                    t        j                  ddd      \  }}|d   j                  | j                  d   | j                  d   dd       |d   j	                  d	       |d   j                  d
       |d   j                  d       |d   j                  d       |d   j                  | j                  d   | j                  d   dd       |d   j                  | j                  j                  ddd| j                  j                   d       |d   j	                  d	       |d   j                  d       |d   j                  d       |d   j                          |d   j                  d       t        j                  | j                  d         }t        d      D ]1  }|d   j                  | j                  d   |dd|f   d| d       3 |d   j	                  d	       |d   j                  d       |d   j                  d       |d   j                  d d!d"       |d   j                  d       |d#   j                  | j                  d   | j                  d$   d%d&'       |d#   j	                  d	       |d#   j                  d(       |d#   j                  d)       |d#   j                  d       t        j                           t        j"                  |d*+       t%        d,|        t        j&                          y)-z0Visualize the attractor dynamics during trainingrq   )   rL   figsize)r   r   r   r   zb-)	linewidthEpochzTest Accuracy (%)zClassification PerformanceT)r   rM   r   zr-r   z--zThreshold ())ycolor	linestylelabelzCCT EntropyzSemantic Collapse Progressr   rL   )rM   r   NzDigit g      ?)r  r  zAttractor MasszGravitational Mass Evolutionzupper right   )locfontsizencol)rM   rM   rA   purpleffffff?)r  r   zNumber of Black Holesz#Singularity Detection (Overfitting)   dpiz 
[GNBOF] Visualization saved to )pltsubplotsplotr   
set_xlabel
set_ylabel	set_titlegridaxhliner4   r1   legendr   arrayrX   bartight_layoutsavefigrN   show)rB   	save_pathfigaxesmassesrt   s         r"   visualize_attractorsz$CCTNBodyTrainer.visualize_attractors  s   LLAx8	T 	T
W-t||J/GYZ[T
g&T
12T
9:T
 	T
W-t||I/FXYZT
T[[::#QU"-dkk.K.K-LA N 	 	PT
g&T
m,T
9:T
T
 $,,'9:;r 	>AJOODLL16!Q$<#)!  >	> 	T
g&T
./T
;<T
maa@T
 	T
t||G,dll=.IQYadeT
g&T
56T
BCT
I3'1)=>
r!   c                 
   t        j                  d      \  }}t        j                  | j                  j                         D cg c]  }|j                          c}      }|j                  d   dkD  r|dd }t        |      dkD  r-|dt        |      dz   j                         j                         nt        j                  j                  d      }t        |      dkD  r-|t        |      dz  d j                         j                         nt        j                  j                  d      }t        |      dk  st        |      dk  r>t        j                  j                  d      }t        j                  j                  d      }t        j                  |j                         d	z
  |j!                         d	z   d
      }t        j                  |j                         d	z
  |j!                         d	z   d
      }	t        j"                  ||	      \  }
}t        j$                  |
      }t'        |
j                  d         D ]>  }t'        |
j                  d	         D ]  }d}t)        | j*                  j,                        D ]  \  }}|j.                  s|j0                  n|j0                   }t        j                  j3                  |j                         |j!                               }t        j                  j3                  |j                         |j!                               }t        j4                  |
||f   |z
  dz  |||f   |z
  dz  z         dz   }|j.                  r	|||z  z  }|||z  z  } | |||f<   " A |j7                  |
||ddd      }t        j8                  ||d       t)        | j*                  j,                        D ]  \  }}|t        |      k  s|t        |      k  s%||t        |      z     }||t        |      z     }|j.                  rFt;        ||fd|j0                  z  dd      }|j=                  |       |j?                  ||ddd       t;        ||fd|j0                  z  t         j@                  jC                  |dz        d      }|j=                  |       |jE                  ||tG        |jH                        ddddd        |jK                  d        |jM                  d!       |jO                  d"       t        jP                          t        jR                  |d#$       tU        d%|        t        jV                          yc c}w )&zR
        Visualize the 2D loss landscape with attractors and black holes.
        )rL   rL   r  r   i  Nrq   rG   rL   rM   r   r%   r   viridisg333333?)levelscmapr   Loss)axr  r-   blackg?)radiusr  r   kx   r   )
markersizemarkeredgewidth333333?r  rl   boldwhite)havar  
fontweightr  zWeight Dimension 1zWeight Dimension 2zG10-Attractor Loss Landscape
(Black Circles = Overfitting Singularities)r  r  z!
[GNBOF] Loss landscape saved to ),r  r   r   rW   r`   rC   r   r\   r   cpunumpyr   randomr[   linspacerU   r   meshgridr:   rX   rQ   r   r=   r   r   uniformsqrtcontourfcolorbarr   	add_patchr!  cmSet1textstrr   r"  r#  r$  r*  r+  rN   r,  )rB   r-  r.  r7  rD   weightsw1w2x_rangey_rangeXYZrt   r   r   kru   r   pos_xpos_yr   contourx_posy_poscircles                             r"   visualize_loss_landscapez(CCTNBodyTrainer.visualize_loss_landscape?  sb   
 ,,x0R ))$**2G2G2IJQQYY[JK==d"etnG 9<Gq8HW%c'lAo&**,224biioo^aNb8;Gq8HWS\1_%&**,224biioo^aNbr7R<3r7R<%B%B ++bffhlBFFHqL"=++bffhlBFFHqL"={{7G,1 MM!qwwqz" 	A1771:& $-dnn.G.G$H )LAy1:1H1H9>>y~~oDII--bffhAEII--bffhAE77AacFUNQ#6!AaC&5.19L#LMPSSD ..TD[(TD[() !A#	  ++aAby+LW62 &dnn&?&?@ 	JLAy3r7{q3r7{1s2w;1s2w;**#UEN3;O)0=FLL(GGE5$2qGQ $UEN3;O),QrT):#GFLL(GGE5#ioo*>8PX$&6  J!	J& 	*+
*+
_`I3'29+>?
C Ks   U(N)r   )attractor_evolution.png)loss_landscape.png)r   r   r   r   r$   rE   r   r   r   r1  ra  r    r!   r"   r   r     s1    
 
1Qf&+Z*XIr!   r   c                     t        d       t        d       t        d       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        dt        |       dt        |       d       t        dd      }t        dt        d |j                         D               d       t        dddddd      }t        |j                         |d      }t        |||      }|j!                  ||d      }	|j#                  d       |j%                  d       t        d       t        d       t        d       t        d |	d!   d"   d#d$       t        d%|	d&   d"   d'       t        d(|	d)   d"   d#       t        d*|	d+   d"           ||	fS ),Nr  z.  CCT-GNBOF: 10-Attractor MNIST Classificationr  )r-   z../dataT)rootr   download	transformF   )
batch_sizeshufflez
[DATA] Train: z samples | Test: z samplesr   rL   )r   r9   z	
[MODEL] c              3   <   K   | ]  }|j                           y w)N)numel).0rD   s     r"   	<genexpr>zmain.<locals>.<genexpr>  s     A1779As   z parametersg?r'   g      @r*   r>  )r&   r(   r)   r+   r,   r1   )r9   r   )r  rb  rc  z  FINAL RESULTSz  Final Test Accuracy: r   rI   r  r  z  Final Entropy:       r   r   z  Total Energy Spent:  r   z  Black Holes at End:  rA   )rN   
transformsComposeToTensor	NormalizetorchvisiondatasetsMNISTr   r   r   rY   rC   r$   r3   r   r   r1  ra  )
rg  train_datasettest_datasetr   r   r`   r4   r   trainerr   s
             r"   mainry    s&   	-	
:;	&M ""VV,$ I
  ((..dTY / M ''--edi . L mTJL\c5IK	S/00A#lBSATT\
]^ b<E	JsAe.>.>.@AAB+
NO 
!"F u//16"MI eY7G mmL+bmAG   !:;$$%9: 
-	
	&M	#GJ$7$;C#@
BC	#GI$6r$:3#?
@A	#GN$;B$?#D
EF	#GM$:2$>#?
@A'>r!   __main__)*r   r   torch.nnr   torch.nn.functional
functionalr}   torch.optimoptimtorch.utils.datar   r   rs  torchvision.transformsro  rE  r   matplotlib.pyplotpyplotr  matplotlib.patchesr   r  mathdataclassesr   r   typingr   r	   r
   r   r   r$   r3   Moduler   r   ry  r   r`   r   r    r!   r"   <module>r     s         6  +   %   ( . .       
# 
# 
#@ @NI
RYY I
`w w|:z zVNE7 r!   