
    zi/<                        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
 ddlZddlmZ ddlZddej                  dedej                  fdZ G d d	ej$                        Z G d
 dej$                        Z G d dej$                        Z G d dej$                        Z G d dej$                        ZddZd Zedk(  r e        yy)uY  
Graviton-CIFAR: Stable Physics-Inspired Neural Network
=======================================================
Fixed issues:
1. Cross-product destabilizing gradients → reduced q strength
2. Gravitational attention saturating → proper normalization
3. Manifold projection causing collapse → gentler projection
4. Missing gradient clipping
    N)
DataLoaderxdimreturnc                 `    t        j                  | d|d      }| |j                  dd      z  S )z.Normalization with clamp to prevent explosion.   Tpr   keepdimư>g      $@minmax)torchnormclamp)r   r   r   s      #/home/per/Documents/gravity/ex02.pystable_normalizer      s.    ::a1#t4D

t
.//    c                        e Zd ZdZd
dededef fdZddej                  dej                  dej                  fd	Z	 xZ
S )SoftmaxAttentionz)Stable baseline attention for comparison.	embed_dim	num_headsdropoutc                 ^   t         |           || _        || _        ||z  | _        t        j                  ||      | _        t        j                  ||      | _        t        j                  ||      | _	        t        j                  ||      | _
        t        j                  |      | _        y N)super__init__r   r   head_dimnnLinearq_projk_projv_projout_projDropoutr   )selfr   r   r   	__class__s       r   r   zSoftmaxAttention.__init__    s    ""!Y.ii	95ii	95ii	95		)Y7zz'*r   r   contextr   c                 r   ||}|j                   \  }}}|j                   d   }| j                  |      j                  ||| j                  | j                        j                  dd      }| j                  |      j                  ||| j                  | j                        j                  dd      }| j                  |      j                  ||| j                  | j                        j                  dd      }	t        j                  ||j                  dd            t        j                  | j                        z  }
t        j                  |
d      }| j                  |      }t        j                  ||	      j                  dd      j                  ||| j                        }| j!                  |      S )N   r   r   )shaper"   reshaper   r   	transposer#   r$   r   matmulmathsqrtFsoftmaxr   r   r%   )r'   r   r)   batchseq_len_ctx_lenQKVscoresattnouts                r   forwardzSoftmaxAttention.forward,   sW   ?GGGw--"KKN""5'4>>4==Q[[\]_`aKK ((WaabcefgKK ((Waabcefg aR!45		$--8PPyyR(||D!ll4#--a3;;E7DNN[}}S!!r   )   皙?r   )__name__
__module____qualname____doc__intfloatr   r   TensorrA   __classcell__r(   s   @r   r   r      sF    3
+# 
+# 
+E 
+" " " "r   r   c                        e Zd ZdZd	dedef fdZd
dej                  dej                  dej                  fdZ xZ	S )GravitationalAttentionu   
    FIXED: Gravitational attention with proper normalization.
    Uses 1/r² but properly scaled to prevent vanishing/exploding.
    r   r   c                    t         |           || _        || _        ||z  | _        t        j                  t        j                  d            | _	        t        j                  ||      | _        t        j                  ||      | _        t        j                  ||      | _        t        j                  ||      | _        t        j                  d      | _        y )N      ?rC   )r   r   r   r   r   r    	Parameterr   tensorgravity_scaler!   r"   r#   r$   r%   r&   r   )r'   r   r   r(   s      r   r   zGravitationalAttention.__init__E   s    ""!Y.  \\%,,s*;<ii	95ii	95ii	95		)Y7zz#r   r   r)   r   c                 8   ||}|j                   \  }}}|j                   d   }| j                  |      j                  ||| j                  | j                        }| j                  |      j                  ||| j                  | j                        }| j                  |      j                  ||| j                  | j                        }	|j                  d      }
|j                  d      }t        j                  |
|z
  dz  d      }|j                  dd      }| j                  |dz   z  }||j                  dd	
      dz   z  }| j                  |      }t        j                  d||	      }|j                  ||| j                        }| j                  |      S )Nr+   r   r-   r.   {Gz?      Y@r   rP   T)r   r   g:0yE>zbsch,bchd->bshd)r/   r"   r0   r   r   r#   r$   	unsqueezer   sumr   rS   r   einsumr   r%   )r'   r   r)   r7   r8   r9   r:   r;   r<   r=   
Q_expanded
K_expandeddist_sqgravity_scoresr?   r@   s                   r   rA   zGravitationalAttention.forwardU   sj   ?GGGw--"KKN""5'4>>4==QKK ((WKK ((W [[^
[[^
 ))Z*4:C --De-4 ++w}= (>+=+=!T+=+RUY+YZ ||N+ll,dA6kk%$..9}}S!!r   )rB   r   
rD   rE   rF   rG   rH   r   r   rJ   rA   rK   rL   s   @r   rN   rN   @   sA    '# '# ' "" "" "" ""r   rN   c                   `     e Zd ZdZdef fdZdej                  dej                  fdZ xZ	S )LorentzGradientLayeru   
    FIXED: Lorentz-inspired gradient modifier with reduced impact.
    F = q * (v × B) but scaled down to prevent destabilization.
    r   c                 B   t         |           || _        t        j                  t        j                  d            | _        t        j                  t        j                  ||dz        t        j                         t        j                  |dz  |            | _        y )NMbP?r   )r   r   r   r    rQ   r   rR   q
Sequentialr!   Tanhb_proj)r'   r   r(   s     r   r   zLorentzGradientLayer.__init__   so    " ell512 mmIIia0GGIIIi1ni0
r   r   r   c                 R    | j                  |      }|| j                  ||z
  z  z   }|S )zz
        Apply gentle Lorentz-like transformation.
        Instead of cross-product, use rotation-like operation.
        )rf   rc   )r'   r   Br@   s       r   rA   zLorentzGradientLayer.forward   s/    
 KKN $&&AE""
r   r^   rL   s   @r   r`   r`   z   s/    
# 
 %,, r   r`   c                   f     e Zd ZdZddedef fdZdej                  dej                  fdZ xZ	S )	ManifoldProjectionus   
    FIXED: GM=v²r constraint with gentle normalization.
    Projects to sphere but with gradual transitions.
    radiusprojection_ratioc                 >    t         |           || _        || _        y r   )r   r   rk   rl   )r'   rk   rl   r(   s      r   r   zManifoldProjection.__init__   s     0r   r   r   c                     t        j                  |ddd      }||dz   z  | j                  z  }|| j                  ||z
  z  z   S )Nr   r-   Tr	   r   )r   r   rk   rl   )r'   r   r   	projecteds       r   rA   zManifoldProjection.forward   sK    zz!qb$7 $+&$++5	 4((IM:::r   )rP   rC   )
rD   rE   rF   rG   rI   r   r   rJ   rA   rK   rL   s   @r   rj   rj      s6    1u 1e 1
; ;%,, ;r   rj   c            	       r     e Zd ZdZ	 	 d
dedededef fdZdej                  dej                  fd	Z	 xZ
S )GravitonCIFARz
    Stabilized CIFAR classifier using physics concepts.
    - Gravitational attention for feature aggregation
    - Lorentz-inspired residual connections  
    - Gentle manifold projection (no collapse)
    num_classesr   r   use_physicsc                 F   t         |           || _        || _        t	        j
                  g t	        j                  dddd      t	        j                  d      t	        j                         t	        j                  dddd      t	        j                  d      t	        j                         t	        j                  d      t	        j                  d      t	        j                  dddd      t	        j                  d      t	        j                         t	        j                  dddd      t	        j                  d      t	        j                         t	        j                  d      t	        j                  d      t	        j                  dddd      t	        j                  d      t	        j                         t	        j                  dddd      t	        j                  d      t	        j                         t	        j                  d      t	        j                  d      t	        j                  dd	dd      t	        j                  d	      t	        j                         t	        j                  d	d	dd      t	        j                  d	      t	        j                         t	        j                  d      t	        j                  d       | _        t	        j                  d	|      | _        |rt        ||      | _        nt!        ||      | _        |rt#        |      nt	        j$                         | _        |rt)        d
d      nt	        j$                         | _        t	        j
                  t	        j                  |d      t	        j                         t	        j                  d      t	        j                  dd      t	        j                         t	        j                  d      t	        j                  d|            | _        y )N   @   r+   paddingr   rC            rP   g?)rk   rl   g333333?g?)r   r   rs   r   r    rd   Conv2dBatchNorm2dGELU	MaxPool2dr&   featuresr!   to_embedrN   	attentionr   r`   Identitylorentzrj   manifold
classifier)r'   rr   r   r   rs   r(   s        r   r   zGravitonCIFAR.__init__   s   &"  (
IIaQ*(
 NN2(
 GGI	(

 IIb"a+(
 NN2(
 GGI(
 LLO(
 JJsO(
 IIb#q!,(
 NN3(
 GGI(
 IIc31-(
  NN3!(
" GGI#(
$ LLO%(
& JJsO'(
, IIc31--(
. NN3/(
0 GGI1(
2 IIc31-3(
4 NN35(
6 GGI7(
8 LLO9(
: JJsO;(
@ IIc31-A(
B NN3C(
D GGIE(
F IIc31-G(
H NN3I(
J GGIK(
L LLOM(
N JJsOO(
V 		#y1 3IyIDN-iCDN ;F+I62;;= R]*#Mbdbmbmbo --IIi%GGIJJsOIIc3GGIJJsOIIc;'
r   r   r   c                 b   | j                  |      }|j                  d   }|j                  |dd      j                  dd      }| j	                  |      }| j                  |      |z   }| j                  |      |z   }| j                  |      }|j                  d      }| j                  |      S )Nr   r{   r-   r+   r   r.   )
r   r/   r0   r1   r   r   r   r   meanr   )r'   r   featr7   seqpooleds         r   rA   zGravitonCIFAR.forward  s    }}Q 

1ll5#r*44Q: mmC  nnS!C' ll3#% mmC  av&&r   )
   ry      T)rD   rE   rF   rG   rH   boolr   r   rJ   rA   rK   rL   s   @r   rq   rq      sV     @C9=I
C I
 I
I
26I
V' '%,, 'r   rq   c                    | j                  |      } t        j                         }t        j                  | j                         |d      }t        j                  j                  ||      }g g g g d}	t        |      D ]  }
| j                          d}d\  }}|D ]  \  }}|j                  |      |j                  |      }}|j                           | |      } |||      }|j                          t        j                  j                  j                  | j                         d       |j                          ||j!                         z  }|j#                  d	      \  }}||j%                  d
      z  }||j'                  |      j)                         j!                         z  } |j                          |t+        |      z  }d|z  |z  }| j-                          d\  }}}t        j.                         5  |D ]  \  }}|j                  |      |j                  |      }} | |      } |||      }||j!                         z  }|j#                  d	      \  }}||j%                  d
      z  }||j'                  |      j)                         j!                         z  } 	 ddd       |t+        |      z  }d|z  |z  }|	d   j1                  |       |	d   j1                  |       |	d   j1                  |       |	d   j1                  |       t3        d|
d	z   dd| d|dd|dd|dd|dd        |	S # 1 sw Y   xY w)z.Training with gradient clipping for stability.rU   )lrweight_decay)T_max)
train_loss	train_acc	test_losstest_acc        )r   r   rP   )max_normr+   r   rV   )r   r   r   Nr   r   r   r   zEpoch 2d/z
 | Train: .4fz.1fz
% | Test: %)tor    CrossEntropyLossoptimAdamW
parameterslr_schedulerCosineAnnealingLRrangetrain	zero_gradbackwardr   utilsclip_grad_norm_stepitemr   sizeeqrX   lenevalno_gradappendprint)modeltrainloader
testloaderdeviceepochsr   	criterion	optimizer	schedulerresultsepochrunning_losscorrecttotalinputstargetsoutputslossr9   	predictedr   r   r   test_correct
test_totalr   s                             r   train_modelr   %  s+    HHVE##%IE,,.2DII""44Yf4MIbrrRGv 68* 	:OFG$ii/F1CGF!FmGWg.DMMO HHNN**5+;+;+=*LNNDIIK'L";;q>LAyW\\!_$Ey||G,0027799G!	:$ 	!C$44
7NU*	 	

.7+	<]]_ 		C#- C"())F"3WZZ5G- '2TYY[(	&{{1~9gll1o-
	W 5 9 9 ; @ @ BBC		C J/	,&3$$Z0##I.##I.
""8,uQwrl!F8 ,"3'q3 8 oQxnA7 	8i68p N/		C 		Cs   =B)M  M		c            	      6   t        j                  t         j                  j                         rdnd      } t	        d|  d       t        j                  t        j                  dd      t        j                         t        j                         t        j                  dd	      g      }t        j                  t        j                         t        j                  dd	      g      }t        j                  j                  d
dd|      }t        j                  j                  d
dd|      }t        |ddd      }t        |ddd      }t	        d       t	        d       t	        d       t        dddd      }t!        |||| dd      }t	        d       t	        d       t	        d       t        dddd      }	t!        |	||| dd      }
t	        d       t	        d       t	        d       t#        |d         }t#        |
d         }t	        d|dd       t	        d|dd       t%        |d      rGt%        |j&                  d       r1t	        d!|j&                  j(                  j+                         d"       t        j,                  ||
d#d$       ||
fS )%NcudacpuzDevice: 
    r   rw   )gHPs?gec]?g~jt?)gۊe?ggDio?g|?5^?z../dataT)rootr   download	transformFry   )
batch_sizeshufflenum_workersz<============================================================z0Training PHYSICS-MODEL (Gravitational + Lorentz)r   )rr   r   r   rs      rb   )r   r   z=
============================================================z&Training BASELINE (Standard Attention)zRESULTS SUMMARYr   zPhysics Model - Best Test Acc: z.2fr   zBaseline     - Best Test Acc: r   rS   zLearned gravity scale: r   )physics_resultsbaseline_resultszgraviton_comparison.pth)r   r   r   is_availabler   
transformsCompose
RandomCropRandomHorizontalFlipToTensor	NormalizetorchvisiondatasetsCIFAR10r   rq   r   r   hasattrr   rS   r   save)r   transform_traintransform_testtrainsettestsetr   r   model_physics	results_pmodel_baseline	results_bbest_physicsbest_baselines                r   mainr   j  so   \\EJJ$;$;$=&5IF	HVHB
  !((b!,'')57OP	* O  ''57OP) N
 ##++$QUap+qH""**	QUao*pGX#tQRSKGUPQRJ 
&M	
<=	&M!bC1Z^_MM;
FSUZ_`I 
-	
23	&M"rSA[`aNNKVTV[`aI 
-	
	&My,-L	*-.M	+L+=Q
?@	*=*=Q
?@}k*w}7N7NP_/`'(?(?(M(M(R(R(TUX'YZ[ 
JJ$% !"
 ir   __main__)r-   )2   rb   )rG   r   torch.nnr    torch.nn.functional
functionalr5   torch.optimr   torch.utils.datar   r   torchvision.transformsr   r3   rJ   rH   r   Moduler   rN   r`   rj   rq   r   r   rD    r   r   <module>r      s         '  + 0 03 0 0
"ryy "D7"RYY 7"t299 B; ;2j'BII j'bBJ: z zF r   