
    iF'                        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mZmZ ddlZddlmZ  ej&                  d       ej(                  j+                  d        ed        ed        ed        G d d	ej.                        Z G d
 dej.                        Z G d d      ZddZd Zd Zedk(  r eddd       yy)zy
Resonant Training Framework - Simplified & Fast
Core concept: Phase-aligned gradient updates with cross-agent resonance
    N)
DataLoader)datasets
transforms*   <============================================================z(RESONANT TRAINING FRAMEWORK (Simplified)c                   0     e Zd ZdZ fdZd ZddZ xZS )ResonantLinearz0Linear layer with phase-coupled gradient updatesc                 H   t         |           t        j                  t	        j
                  ||      dz        | _        t        j                  t	        j                  |            | _        t	        j                  d      dz  t        j                  z  | _        d| _        y )N皙?            )super__init__nn	Parametertorchrandnweightzerosbiasrandnppiphase	coherence)selfin_featuresout_features	__class__s      ex02.pyr   zResonantLinear.__init__   sm    ll5;;|[#IC#OPLL\!:;	 ZZ^a'"%%/
    c                     dt        j                  | j                        z  }| j                  d|z   z  }t	        j
                  ||| j                        S )N{Gz?   )r   sinr   r   Flinearr   )r   xperturbationeffective_weights       r!   forwardzResonantLinear.forward#   sE    eii

33;;!l*:;xx+TYY77r"   c                    t        j                  t        j                  |      t        j                  d            j                         }|| j                  z
  }| xj                  |t        j                  |      z  z  c_        y)z%Align phase toward gradient direction      ?N)r   atan2tensoritemr   r   r&   )r   gradient_magnitudelrtargetdiffs        r!   align_phasezResonantLinear.align_phase)   sW    U\\*<=u||C?PQVVX

"

b266$<''
r"   )r   )__name__
__module____qualname____doc__r   r,   r6   __classcell__r    s   @r!   r	   r	      s    :8(r"   r	   c                   >     e Zd Zdddgdf fd	Zd Zd	dZd Z xZS )
ResonantMLPi        
   c                     t         |           |g|z   |gz   }t        j                  t	        t        |      dz
        D cg c]  }t        ||   ||dz             c}      | _        y c c}w )Nr%   )r   r   r   
ModuleListrangelenr	   layers)r   
input_sizehidden_sizesoutput_sizesizesir    s         r!   r   zResonantMLP.__init__1   sl    |+{m;mm3u:>*%
 58U1Q3Z0%
  %
s   A+c                     |j                  |j                  d      d      }t        | j                        D ]>  \  }} ||      }|t	        | j                        dz
  k  s*t        j                  |      }@ |S )Nr   r%   )viewsize	enumeraterF   rE   r'   relu)r   r)   rK   layers       r!   r,   zResonantMLP.forward9   si    FF166!9b!!$++. 	HAuaA3t{{#a''FF1I	 r"   c           	         t        j                         5  t        | j                        D ]  \  }}|j                  xj
                  ||d| d   z  z  c_        |j                  xj
                  ||d| d   z  z  c_        |d| d   j                         j                         j                         }|j                  ||        	 ddd       y# 1 sw Y   yxY w)zUpdate weights + align phaseszlayers.z.weightz.biasN)r   no_gradrP   rF   r   datar   absmeanr1   r6   )r   	gradientsr3   phase_lrrK   rR   grad_mags          r!   resonant_updatezResonantMLP.resonant_updateA   s    ]]_ 	6%dkk2 65!!R)gaS4H*I%II!

2	GA3e2D(E#EE$wqc%9:>>@EEGLLN!!(H56	6 	6 	6s   B5CCc           	         | j                   D cg c]  }|j                   }}t        j                  |D cg c]%  }t        j                  |j                               ' c}      }t        j                  |D cg c]%  }t        j                  |j                               ' c}      }t        j                  |dz  |dz  z         S c c}w c c}w c c}w )zPhase coherence across layersr   )rF   r   r   rW   cosr1   r&   sqrt)r   lphasespmean_xmean_ys         r!   compute_coherencezResonantMLP.compute_coherenceK   s    #';;/a!''//F;q"&&*;<F;q"&&*;<wwvqy619,-- 0;;s   C
*C;*C)r$   r   )r7   r8   r9   r   r,   r[   rd   r;   r<   s   @r!   r>   r>   0   s"    "%S#JB 6.r"   r>   c                   $    e Zd ZdZd ZddZd Zy)ResonantAgentz&Single AI agent with resonant trainingc                     || _         t               | _        t        j                  j                  ddt        j                  z        | _        d| _        g | _	        g | _
        y )Nr   r   r.   )idr>   modelr   randomuniformr   r   	frequencyloss_historyphase_history)r   agent_ids     r!   r   zResonantAgent.__init__V   sI     ]
YY&&q!BEE'2
r"   c                    | j                   j                          | j                   j                          | j                  |      } |||      }|j                          t        j
                  j                  j                  | j                   j                         |       t        d | j                   j                         D              }| xj                  dt        j                  |dz        z  z  c_
        | j                  j                  | j                         | j                  j                  |j!                                |j#                  d      |k(  j                         j!                         }|j!                         |fS )Nmax_normc              3      K   | ]:  }|j                   j                         j                         j                          < y wN)gradrV   sumr1   ).0ra   s     r!   	<genexpr>z+ResonantAgent.train_step.<locals>.<genexpr>f   s,     RQqvvzz|'')..0Rs   A A皙?r$   r%   )ri   train	zero_gradbackwardr   r   utilsclip_grad_norm_
parametersrv   r   r   r&   rn   appendrm   r1   argmax)	r   r)   y	criterion	grad_clipoutputlossrZ   corrects	            r!   
train_stepzResonantAgent.train_step^   s   



A#&&tzz'<'<'>&SR$**:O:O:QRR

dRVVHtO444
!!$**-  -==#q(--/446yy{G##r"   c                     i }| j                   j                         D ]=  \  }}|j                  |j                  j                         j	                         ||<   ? |S rt   )ri   named_parametersru   detachclone)r   rX   nameparams       r!   collect_gradientszResonantAgent.collect_gradientsn   sX    	::668 	>KD%zz%"'**"3"3"5";";"=	$	> r"   N)      @)r7   r8   r9   r:   r   r   r   r   r"   r!   rf   rf   S   s    0 $ r"   rf         r?   c                    t        j                  t         j                  j                         rdnd      }t	        d|        t        j                  t        j                         t        j                  dd      g      }t        t        j                  ddd|      |d	      }t        t        j                  dd
|      |      }t        j                         }t	        d| d       t	        d       t        |      D cg c]  }t        |       }	}|	D ]  }
|
j                   j#                  |        g }g }t        |       D ]i  }g }g }d}d}|D ]  \  }}|j#                  |      |j#                  |      }}g }|	D ]a  }
|
j%                  |||      \  }}|j'                  |       ||z  }||j)                  d      z  }|j'                  |
j+                                c t-        j.                  |	D cg c]  }|j0                   c}      }|d d d f   |d d d f   z
  }dt-        j2                  |      z  }|j'                  t-        j4                  t-        j6                  t-        j2                  |                         t9        |	      D ]  \  }}
i }||   j;                         D ]]  \  }}|j=                         }t        |      D ]  }||k(  r	|d|||f   z  ||   |   z  z  }  t        j>                  |ddd      ||<   _ |
j                   jA                  |dd         tC        t-        j4                  |            } |j'                  |        tC        t-        j4                  |            }!|j'                  |!       ||z  }"t	        d|dz    d| dd|!dd |"d       l tE        |	|      }#t	        d!       t	        d       tG               j#                  |      }$tI        jJ                  |$jM                         d"      }%g }&t        |       D ]G  }d}'d}d}|D ]  \  }}|j#                  |      |j#                  |      }}|%jO                           |$|      }( ||(|      }|jQ                          t         j                  jR                  jU                  |$jM                         d#$       |%jW                          |'|jY                         z  }'||(j[                  d      |k(  j]                         jY                         z  }||j)                  d      z  } |&j'                  |'t_        |      z         ||z  }"t	        d|dz    d|&d%   dd |"d       J ta        |$|      })tc        jd                  dd&d'(      \  }*}+|+d   jg                  |d)d*+       |+d   jg                  |&d,d-+       |+d   ji                  d.       |+d   jk                  d/       |+d   jm                  d0       |+d   jo                          |+d   jq                  dd1       |+d   jg                  |d2d34       |+d   ji                  d.       |+d   jk                  d5       |+d   jm                  d6       |+d   jq                  dd1       t9        |	      D ])  \  }}
|+d3   jg                  |
jr                  d7| d89       + |+d3   ji                  d:       |+d3   jk                  d;       |+d3   jm                  d<       |+d3   jo                          |+d3   jq                  dd1       tc        jt                          tc        jv                  d=d>?       tc        jx                          t	        d@       t	        dA       t	        dB       t	        dC|#d       t	        dD|)d       t	        dE|#|)z
  dFz  dGdH       y c c}w c c}w )INcudacpuz	
Device: )g_)Ǻ?)gGr?rU   T)rz   download	transform)
batch_sizeshuffleF)rz   r   )r   u   
🧠 Resonant Training (z agents)z2--------------------------------------------------r   g333333?g333333?r   r.   g      )nanposinfneginfr$   ry   )r3   rY   zEpoch r%   z: Loss=z.4fz, Coherence=z.3fz, Acc=u!   
⚡ Standard Training (baseline))r3   r   rq   rM   r   )      )figsizezb-oResonant)labelzr--sStandardEpochLosszTraining Loss)alphapurpler   )	linewidth	CoherencezPhase CoherencezAgent gffffff?)r   r   StepPhasezPhase Evolutionzresonant_results.png   )dpiz=
============================================================RESULTSr   zResonant System: zStandard Network: zDifference: d   z+.2f%)=r   devicer   is_availableprintr   ComposeToTensor	Normalizer   r   MNISTr   CrossEntropyLossrD   rf   ri   tor   r   rO   r   r   arrayr   r]   rW   rV   rP   itemsr   
nan_to_numr[   floatevaluate_agentsr>   optimSGDr   r{   r|   r}   r~   stepr1   r   rv   rE   evaluate_singlepltsubplotsplot
set_xlabel
set_ylabel	set_titlelegendgridrn   tight_layoutsavefigshow),n_epochsn_agentsr   r   r   train_loadertest_loaderr   rK   agentsagentresonant_lossescoherence_historyepochepoch_lossesepoch_coherencesepoch_correctepoch_totalr)   r   local_gradientsr   r   ar`   
phase_diffcouplingblended_gradientsr   ru   blendedjavg_lossr   accresonant_accstandard	optimizerstandard_losses
epoch_lossr   standard_accfigaxess,                                               r!   run_experimentr   v   sc   \\EJJ$;$;$=&5IF	Jvh
 ""Y	2$ I
 vTDINtL vUi@K
 ##%I 
&xj
9:	(O(-h81mA8F8 vOx ,a  	WDAq44<fqA !O B % 0 0Ay Ag##D)(qvvay(&&u'>'>'@AB XX71qww78F46$'?:JRVVJ//H##BGGBFF266*3E,F$GH &f- 	W5$&!"1!"4":":"< jJD$"jjlG"8_ T6$4(1a4.#8?1;Md;S#SST /4.>.>wCX[dh.i%d+j ++,=$QU+V	W'	W> ./x("''"234	  +k)uQwiwxnL3vVYZ]U^_`Y,a^ #6;7L 
.0	(O}'H		(--/D9IOx Q
  
	%DAq44<fqA!a[FVQ'DMMOHHNN**8+>+>+@3*ONN$))+%JfmmA.!388:??AAM166!9$K
	% 	zC,==>k)uQwiwr':3&?vc#YOP%Q( #8[9L Q73ICGLL%zL:GLL&
L;GwGvGo&GNNGLLSL!GLL"HL:GwG{#G'(GLLSL! f% I5QU((&CHIGvGwG'(GNNGLLSL!KK&C0HHJ 
/	)	(O	l3/
01	|C0
12	L,5s:4@
BCs 92 8s   _;_c                     d}d}|D ]d  \  }}| D ]Z  }|j                  |      j                  d      }|||k(  j                         j                         z  }||j	                  d      z  }\ f ||z  S Nr   r%   )ri   r   rv   r1   rO   )r   loaderr   totalr)   r   r   preds           r!   r   r   
  s    GE 1 	E;;q>((+D	(--//GQVVAYE	 U?r"   c                 B   d}d}| j                          t        j                         5  |D ]T  \  }} | |      j                  d      }|||k(  j	                         j                         z  }||j                  d      z  }V 	 d d d        ||z  S # 1 sw Y   ||z  S xY wr   )evalr   rT   r   rv   r1   rO   )ri   r   r   r   r)   r   r   s          r!   r   r     s    GE	JJL	  	DAq8??1%D	(--//GQVVAYE		 U? U?s   ABB__main__)r   r   r   )r   r   r?   )r:   r   torch.nnr   torch.nn.functional
functionalr'   torch.optimr   torch.utils.datar   torchvisionr   r   numpyr   matplotlib.pyplotpyplotr   manual_seedrj   seedr   Moduler	   r>   rf   r   r   r   r7   r   r"   r!   <module>r      s   
      ' ,     "  		r  h 0 1 h(RYY (2 ."))  .F   FQDh	
 zAc: r"   