
    i1I                        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ZddlmZmZ ddlmZ e G d d             Z e       Z G d d	      Z G d
 de
      Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        ZddZedk(  r;ej>                  jA                         rdndZ! e"de!         eee!      Z# e"d       yy)a	  
=============================================================
MMA-CCT LIGHT: Memory-Efficient Neutrino Detector
CCT-ODE Framework - Minimal Implementation

Target: <500MB GPU memory, runs on laptop CPU
=============================================================
    N)Dataset
DataLoader)DictOptional)	dataclassc                       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<   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)Config@   d_model   n_heads   n_layers2   max_hits   
n_features	n_classesi  train_samplesi  val_samplestest_samples皙?signal_ratio    
batch_size   epochsgMbP?lr      @rare_weightN)__name__
__module____qualname__r   int__annotations__r   r   r   r   r   r   r   r   r   floatr   r   r   r         $/home/per/Documents/neutrino/ex02.pyr	   r	      s     GSGSHcHcJIs M3KL#L% JFCBKr(   r	   c                   &    e Zd ZdZd ZdedefdZy)SimpleNeutrinoSimulatorz Minimal neutrino event simulatorc                      d| _         d| _        y )Nr   )signal_countbg_countselfs    r)   __init__z SimpleNeutrinoSimulator.__init__8   s    r(   	is_signalreturnc                 l   |rB| xj                   dz  c_         t        j                  j                  d      dz   }t        j                  j	                  dd      }t        j                  j	                  dt        j
                        }t        j                  j	                  ddt        j
                  z        }t        j                  |      t        j                  |      z  t        j                  |      t        j                  |      z  t        j                  |      g}t        j                  j                  dd      }n"| xj                  dz  c_	        t        j                  j                  d	      dz   }t        j                  j	                  d
d      }t        j                  j	                  dt        j
                        }t        j                  j	                  ddt        j
                  z        }t        j                  |      t        j                  |      z  t        j                  |      t        j                  |      z  t        j                  |      g}d}t        j                  j                  |d      dz  }|dkD  rt        j                  |dz         dz  |d   |d   |d   |dz  |dddf   j                         dz  |dddf   j                         dz  |dddf   j                         dz  |dddf   j                         dz  |dddf   j                         dz  |dddf   j                         dz  |dk\  r|dz  ndg}	ndgdz  }	|dz  }t        |      t        j                   k  rIt        j"                  t        j                   t        |      z
  df      }
t        j$                  ||
g      }n|dt        j                    }t'        j(                  |      t'        j(                  |	      t'        j*                  |rdndt&        j,                        ||dS )zGenerate a single event   (            ?g      I@r   r      
   {Gz?      ?r   ư>r   Ng     @@        r   )dtype)hitsfeatureslabelnum_hitsenergy)r-   nprandompoissonuniformpisincosrandintr.   randnlog10meanstdlenCONFIGr   zerosvstacktorchFloatTensortensorlong)r0   r2   rD   rE   thetaphi	directionflavorrA   rB   paddings              r)   simulatez SimpleNeutrinoSimulator.simulate<   s?    "yy((,q0HYY&&sD1F II%%a/E))##Aq255y1Cus+us+uI YY&&q!,F MMQMyy((,q0HYY&&tS1FII%%a/E))##Aq255y1Cus+us+uI
 F yyx+b0 a<$'#-!ilIaL4QT
!E)QT
!E)QT
!E)QT
 4'QT
 4'QT
 4' &!H urzH e| t9v&hh#d) ;Q?@G99dG_-D()D %%d+))(3\\y!auzzJ 
 	
r(   N)r!   r"   r#   __doc__r1   boolr   r_   r'   r(   r)   r+   r+   5   s     *H
$ H
4 H
r(   r+   c                   "    e Zd ZdZd Zd Zd Zy)TinyDatasetzMemory-efficient datasetc                    || _         || _        t        ||z        }||z
  }g | _        t	        |      D ]-  }| j                  j                  |j                  d             / t	        |      D ]-  }| j                  j                  |j                  d             / t        j                  j                  | j                         y )NF)r2   T)
num_samples	simulatorr$   datarangeappendr_   rF   rG   shuffle)r0   re   r   rf   
num_signalnum_bg_s          r)   r1   zTinyDataset.__init__   s    &" |34
z)	 v 	BAIIY//%/@A	B z" 	AAIIY//$/?@	A 			$))$r(   c                     | j                   S N)re   r/   s    r)   __len__zTinyDataset.__len__   s    r(   c                      | j                   |   S ro   )rg   )r0   idxs     r)   __getitem__zTinyDataset.__getitem__   s    yy~r(   N)r!   r"   r#   r`   r1   rp   rs   r'   r(   r)   rc   rc      s    "%* r(   rc   c                   *     e Zd ZdZ fdZddZ xZS )TinyAttentionz5Minimal attention mechanism with sensitivity trackingc                     t         |           || _        || _        ||z  | _        t        j                  ||dz        | _        y )Nr9   )superr1   r   r   d_knnLinearproj)r0   r   r   	__class__s      r)   r1   zTinyAttention.__init__   s@    g% IIgw{3	r(   c                    |j                   \  }}}| j                  |      }|j                  ||d| j                  | j                        }|j                  ddddd      }|d   |d   |d   }
}	}t        j                  ||	j                  dd            t        j                  | j                        z  }||j                  |dk(  d      }t        j                  |d	      }|rWt        j                  |d	      }t        j                  |t        j                  |d
z         z  d	      j!                          }nd}t        j                  ||
      }|j                  dd      j                  |||      }||fS )zZ
        x: [batch, seq, d_model]
        Returns: [batch, seq, d_model], entropy
        r9   r   r   r5   r   r=   g    edimg|=r?   )shaper{   reshaper   rx   permuterV   matmul	transposemathsqrtmasked_fillFsoftmaxsumlogrP   )r0   xmasktrack_entropyBLDqkvQKVscoresattnprobentropyouts                   r)   forwardzTinyAttention.forward   sM   
 ''1a iilkk!Q4<<:kk!Q1a(a&#a&#a&a1 aR!45		$((8KK''	48FyyR( 99V,Dyy		$,(?!?RHMMOOGG ll4#mmAq!))!Q2G|r(   )NFr!   r"   r#   r`   r1   r   __classcell__r|   s   @r)   ru   ru      s    ?4!r(   ru   c                   ,     e Zd ZdZd fd	ZddZ xZS )TinyCCTLayerzSingle CCT-ODE layer (minimal)c           	         t         |           t        ||      | _        t	        j
                  t	        j                  ||      t	        j                         t	        j                  |      t	        j                  ||            | _	        t	        j                  |      | _        t	        j                  |      | _        d| _        y )Nr?   )rw   r1   ru   r   ry   
Sequentialrz   GELUDropoutff	LayerNormnorm1norm2layer_entropy)r0   r   r   dropoutr|   s       r)   r1   zTinyCCTLayer.__init__   s    !'73	--IIgw'GGIJJwIIgw'	
 \\'*
\\'*
 r(   c                     | j                  | j                  |      |d      \  }}|j                         | _        ||z   }|| j	                  | j                  |            z   }|S )NTr   )r   r   itemr   r   r   )r0   r   r   r   r   s        r)   r   zTinyCCTLayer.forward   sY    yyADyIW$\\^G

1&&r(   )r   ro   r   r   s   @r)   r   r      s    (!r(   r   c                   0     e Zd ZdZ fdZddZd Z xZS )LightNeutrinoCCTu   
    Memory-efficient CCT-ODE Neutrino Detector.
    
    Architecture:
    - Hit embedding → Small Transformer (2 layers)
    - Feature MLP
    - Simple fusion + Classification
    c           
      F   t         |           || _        t        j                  t        j
                  d|j                        t        j                  |j                        t        j                               | _	        t        j                  t        j                  d|j                  |j                        dz        | _        t        j                  t!        |j"                        D cg c]"  }t%        |j                  |j&                        $ c}      | _        t        j                  t        j
                  |j*                  |j                        t        j                  |j                        t        j                         t        j
                  |j                  |j                              | _        t        j
                  |j                  dz  |j                        | _        t        j                  t        j                  |j                        t        j
                  |j                  |j                  dz        t        j                         t        j0                  d      t        j
                  |j                  dz  |j2                              | _        t        j                  t        j
                  |j                  d      t        j                         t        j
                  dd      t        j6                               | _        g | _        y c c}w )Nr9   r5   g{Gz?r   r      )rw   r1   configry   r   rz   r   r   r   	hit_embed	ParameterrV   rN   r   hit_pos
ModuleListrh   r   r   r   
hit_layersr   feature_netfusionr   r   
classifierSigmoidrare_detectorlayer_entropies)r0   r   rm   r|   s      r)   r1   zLightNeutrinoCCT.__init__   s    IIa(LL(GGI
 ||EKK6??FNN$SVZ$Z[--6??+)
 8)
  ==IIf''8LL(GGIIIfnnfnn5	
 ii 2FNNC--LL(IIfnnfnn&9:GGIJJsOIIfnn)6+;+;<
  ]]IIfnnb)GGIIIb!JJL	
  "C)
s   ,'Lc                    |j                   d   }| j                  |      | j                  z   }|j                         j	                  d      dkD  j                         }| j                  D ]*  } |||j                  d      j                  d            }, |j                  d      }||z  j	                  d      |j	                  d      dz   z  }| j                  |      }	t        j                  ||	gd      }
| j                  |
      }t        j                  |      }| j                  |      }| j                  |      }|r)| j                  D cg c]  }|j                    c}| _        ||||	||r| j"                  d	S g d	S c c}w )
zR
        hits: [batch, max_hits, 3]
        features: [batch, n_features]
        r   r=   r   gh㈵>r5   r   )r   r>   )logits	rare_probhit_repr	feat_reprfused	entropies)r   r   r   absr   r&   r   	unsqueezer   rV   catr   r   gelur   r   r   r   )r0   rA   rB   r   r   hit_xhit_masklayer
hit_pooledfeat_repjointr   r   r   ls                  r)   r   zLightNeutrinoCCT.forward.  s   
 JJqM t$t||3HHJNNrN*T188: __ 	JE%h&8&8&;&E&Ea&HIE	J %%b)h&+++2hllql6ID6PQ
 ##H- 		:x0b9E"u ' &&u-	 =A__#MAOO#MD  ""!1>--
 	
 EG
 	
 $Ns   F
c                     g | _         y ro   )r   r/   s    r)   resetzLightNeutrinoCCT.reset]  s
    !r(   )T)r!   r"   r#   r`   r1   r   r   r   r   s   @r)   r   r      s    ."`-
^"r(   r   c                   *     e Zd ZdZd fd	Zd Z xZS )CCTLossz2Conditional Collapse Theory loss - minimal versionc                 b    t         |           || _        t        j                         | _        y ro   )rw   r1   r    ry   CrossEntropyLossce)r0   r    r|   s     r)   r1   zCCTLoss.__init__h  s&    &%%'r(   c                 h   | j                  |d   |      }|dk(  j                         }| j                   |d   j                         |z  j	                         z  }t        |j                  dg             }||z   d|z  z   }||j                         |j                         ||j                         dfS )Nr   r5   r   r   r;   )r   rarer   total)r   r&   r    squeezerP   r   getr   )r0   outputslabelsloss_cesignal_mask	loss_rareentropy_penaltyr   s           r)   r   zCCTLoss.forwardm  s    '''(+V4 {))+%%%)=)E)E)G+)U([([(]]	 gkk+r:;)#d_&<<,,.NN$&ZZ\	
 
 	
r(   )r   r   r   s   @r)   r   r   e  s    <(

r(   r   cpuc                    t        d       t        d       t        d       t        d       t               }t        | j                  | j                  |      }t        | j
                  | j                  t                     }t        | j                  | j                  t                     }t        || j                  d      }t        || j                        }t        || j                        }t        dt        |       d       t        d	t        |       d       t        d
t        |       d       t        d       t        |       j                  |      }	t        d |	j                         D              }
t        d|
d       |
dz  }|dz  }t        d|dd       t        | j                        }t!        j"                  |	j                         | j$                  d      }t         j&                  j)                  || j*                        }t        d       t        d       t-        d      }t/        | j*                        D ]  }|	j1                          d}d}d}|D ]+  }|d   j                  |      }|d   j                  |      }|d   j                  |      }|j3                           |	||      } |||      \  }}|j5                          t6        j8                  j:                  j=                  |	j                         d       |j?                          ||jA                         z  }|d    jC                  d!      }|||k(  j                         jA                         z  }||jE                  d      z  }|	jG                          . |j?                          |t        |      z  }||z  }|	jI                          d}d} d}!t7        jJ                         5  |D ]  }|d   j                  |      }|d   j                  |      }|d   j                  |      } |	||d"#      } |||      \  }}||jA                         z  }|d    jC                  d!      }| ||k(  j                         jA                         z  } |!|jE                  d      z  }!|	jG                           	 d$d$d$       |t        |      z  }| |!z  }"t        d%|d!z   d&d'| j*                   d(|d)d'|d)d*|d)d'|"d)       ||k  s|}t7        jL                  |	jO                         d+        t        d       t        d,       |	jQ                  t7        jR                  d+             |	jI                          g g g }%}$}#t7        jJ                         5  |D ]  }|d   j                  |      }|d   j                  |      }|d   j                  |      } |	||d"#      }|d    jC                  d!      }|#jU                  |jW                         jY                                |$jU                  |jW                         jY                                |%jU                  |d-   j[                  d.      jW                         jY                                |	jG                          
 	 d$d$d$       t]        j^                  |#      }#t]        j^                  |$      }$t]        j^                  |%      }%|#|$k(  ja                         }&|#d!k(  |$d!k(  z  j                         }'|#dk(  |$dk(  z  j                         }(|#d!k(  |$dk(  z  j                         })|#dk(  |$d!k(  z  j                         }*|'|'|)z   d/z   z  }+|'|'|*z   d/z   z  },d0|+z  |,z  |+|,z   d/z   z  }-	 dd1l1m2}.  |.|$|%      }/t        d3       t        d4       t        d       t        d5|&d6       t        d7|+d6       t        d8|,d6       t        d9|-d6       t        d:|/d6       t        d;       t        d<|'d=d>|*d=       t        d?|)d=d@|(d=       t        d       |	S # 1 sw Y   xY w# 1 sw Y   xY w#  d2}/Y xY w)AzTrain the light CCT modelz2==================================================z)MMA-CCT LIGHT - Memory Efficient Trainingz
[1/4] Creating datasets...T)r   rj   )r   z	  Train: z samplesz  Val: z  Test: z
[2/4] Creating model...c              3   V   K   | ]!  }|j                   s|j                          # y wro   )requires_gradnumel).0ps     r)   	<genexpr>z"train_light_cct.<locals>.<genexpr>  s     N1aooQWWYNs   ))z  Parameters: ,r   i   z  Est. memory: z.1fz MB (weights only))r    r;   )r   weight_decay)T_maxz
[3/4] Training...z2--------------------------------------------------infr   rA   rB   rC   r8   r   r5   Fr   NzEpoch 2d/z
 | Train: z.3fz | Val: zlight_cct_best.ptz
[4/4] Evaluating...r   r=   r>   r   )roc_auc_scorer<   z3
==================================================RESULTSzAccuracy:  z.4fzPrecision: zRecall:    zF1 Score:  zROC-AUC:   z
Confusion Matrix:z  TP: 4dz  FN: z  FP: z  TN: )3printr+   rc   r   r   r   r   r   r   rR   r   tor   
parametersr   r    optimAdamWr   lr_schedulerCosineAnnealingLRr   r&   rh   train	zero_gradbackwardrV   ry   utilsclip_grad_norm_stepr   argmaxsizer   evalno_gradsave
state_dictload_state_dictloadextendr   tolistr   rF   arrayrP   sklearn.metricsr   )0r   devicesimtrain_dsval_dstest_dstrain_loader
val_loadertest_loadermodel
num_paramsmemory_bytes	memory_mb	criterion	optimizer	schedulerbest_val_lossepoch
epoch_lossepoch_correctepoch_totalbatchrA   rB   r   r   lossrm   preds
train_loss	train_accval_lossval_correct	val_totalval_acc	all_preds
all_labelsall_rareaccuracytptnfpfn	precisionrecallf1r   aucs0                                                   r)   train_light_cctr6    s    
(O	
56	(O 

()
!
#C6//1D1DcJH++V-@-@BYB[\F&--v/B/BD[D]^Gh63D3DdSLFv/@/@AJW1B1BCK	Ic(m_H
-.	GCK=
)*	HS\N(
+, 

%&V$''/EN(8(8(:NNJ	N:a.
)* >L	*I	OIc?*<
=> F$6$67IE,,.6994PI""44Yfmm4TI 

 	(O%LMv}}% >@
! 	E=##F+DZ(++F3H7^&&v.F!D(+G0GD!MMOHHNN**5+;+;+=sCNN$))+%JH%,,Q/Eevo22499;;M6;;q>)KKKM%	( 	#l"33
!K/	 	

	]]_ 	# V}''/ ,//7w**62heD#GV4aDIIK')003446;;==V[[^+		  c*o-	)uQwrl!FMM? 3"3'q3 8s^1WSM3 	4 m#$MJJu'')+>?}>@@ 
(O 

!"	%**%89:	JJL&("b8zI	   	E=##F+DZ(++F3H7^&&v.FD(%@GH%,,Q/EUYY[//12fjjl1134OOGK088<@@BIIKLKKM	 #I*%Jxx!H Z'--/H>jAo
.	3	3	5B>jAo
.	3	3	5B>jAo
.	3	3	5B>jAo
.	3	3	5Bb2gn%I27T>"F	
Y	9v#5#<	=B1J1 
/	)	(O	K~
&'	K	#
'(	Ks|
$%	K3x
 !	KCy
!"	!	F2b'2w
'(	F2b'2w
'(	(OLk	 	H Bs&   %C
`<Da	a <a		aa__main__cudazUsing device: z"
Model saved to: light_cct_best.pt)r   )$r`   rV   torch.nnry   torch.nn.functional
functionalr   torch.optimr   torch.utils.datar   r   r   numpyrF   typingr   r   dataclassesr   r	   rS   r+   rc   Moduleru   r   r   r   r6  r!   r8  is_availabler  r   r  r'   r(   r)   <module>rC     s         0   ! !   , 
O
 O
d' F-BII -`299 4j"ryy j"b
bii 
Bh^ zzz..0VeF	N6(
#$FF+E	
/0 r(   