
    h+!                        S r SSKrSSKJr  SSKJr  SSKJs  Jr  SSK	r
SSKJrJrJr  SSKr " S S\R                   5      r " S S5      rS'S	 jrS(S jr\S:X  Ga  \" S5        \" S5        \" S5        \" SSS/SS9r\" \SSSS9r\" S\" S \R5                  5        5       5       35        \" S\R6                   35        \" S\R8                   35        \" S\R:                   35        \" S5        \" S5        \" S5        \" SS
S9u  rrr r!\RE                  \\\ \!5      u  r#r$\" S\#S-  S  S!35        \" S"\R:                   S#\$S-  S  S!35        \" S$\$\#-
  S-  S  S!35        \" S%5        \" S&5        gg))zw
MAML Implementation - Model-Agnostic Meta-Learning
Learns to learn: finds initialization that enables fast adaptation
    N)ListTupleDictc                   T   ^  \ rS rSrSrS\S\\   S\4U 4S jjrS rS r	S	 r
S
rU =r$ )	MAMLModel   zSimple neural network for MAML
input_sizehidden_sizesoutput_sizec                 L  > [         TU ]  5         / nUnU HN  nUR                  [        R                  " XV5      5        UR                  [        R
                  " 5       5        UnMP     UR                  [        R                  " XS5      5        [        R                  " U6 U l        g N)super__init__appendnnLinearReLU
Sequentialnetwork)selfr	   r
   r   layers	prev_sizehidden_size	__class__s          K/home/james-whalen/eden-agi-project/real_capabilities/learning/meta/maml.pyr   MAMLModel.__init__   su    	'KMM"))I;<MM"'')$#I (
 	bii	78}}f-    c                 $    U R                  U5      $ r   r   )r   xs     r   forwardMAMLModel.forward   s    ||Ar   c                     [         R                  " U R                  5        Vs/ s H  oR                  S5      PM     sn5      $ s  snf )zGet flattened parameters)torchcat
parametersview)r   ps     r   get_flat_paramsMAMLModel.get_flat_params!   s2    yydoo.?@.?&&*.?@AA@s   Ac                     SnU R                  5        HE  nUR                  5       nUR                  R                  XX$-    R	                  U5      5        X$-  nMG     g)z$Set parameters from flattened vectorr   N)r'   numeldatacopy_view_as)r   flat_paramsoffsetr)   r-   s        r   set_flat_paramsMAMLModel.set_flat_params%   sL    "AGGIEFFLLFN;CCAFGOF #r   r   )__name__
__module____qualname____firstlineno____doc__intr   r   r!   r*   r3   __static_attributes____classcell__)r   s   @r   r   r      s9    (.3 .d3i .c .B r   r   c                   t    \ rS rSrSr    SS\R                  S\S\S\S\	4
S jjr
S	 rS
 rS rS rS rSrg)MAML-   z^
Model-Agnostic Meta-Learning
Learns initialization that enables fast adaptation to new tasks
modelinner_lrouter_lrinner_stepsfirst_orderc                     Xl         X l        X0l        X@l        XPl        [
        R                  " U R                   R                  5       US9U l        g )Nlr)	r@   rA   rB   rC   rD   optimAdamr'   meta_optimizer)r   r@   rA   rB   rC   rD   s         r   r   MAML.__init__3   s?     
  &&#jj)>)>)@XNr   c                    U R                   R                  5        Vs/ s H  o3R                  5       PM     nn[        U R                  5       H  nU R                  X5      n[        R                  " Xb5      n[        R                  R                  UUU R                  (       + SS9n[        XH5       VV	s/ s H  u  p9U	b  X0R                  U	-  -
  OUPM     nnn	M     U$ s  snf s  sn	nf )zA
Inner loop: Adapt to a specific task
Returns adapted parameters
T)create_graphallow_unused)r@   r'   clonerangerC   _forward_with_paramsFcross_entropyr%   autogradgradrD   ziprA   )
r   	support_x	support_yr)   adapted_paramssteplogitslossgradsgs
             r   
inner_loopMAML.inner_loopC   s     .2ZZ-B-B-DE-D'')-DE$**+D..yIF??65D NN''!%!1!11!	 ( E  66DA *+MMA%%A=6  N ,& + F s   C4"C$c                 F   UnSnU R                   R                   H  n[        U[        R                  5      (       a)  X#   nX#S-      n[
        R                  " XU5      nUS-  nMK  [        U[        R                  5      (       d  Ml  [
        R                  " U5      nM     U$ )z&Forward pass using specific parametersr         )	r@   r   
isinstancer   r   rR   linearr   relu)r   r    params	param_idxmoduleweightbiass          r   rQ   MAML._forward_with_params`   s     	jj((F&")),,*!m,HHQ-Q	FBGG,,FF1I ) r   c                     U R                   R                  5         SnSnU Hu  u  pEpgU R                  XE5      nU R                  Xh5      n	[        R
                  " X5      n
X*-  nU	R                  SS9nX:H  R                  5       R                  5       nX<-  nMw     U[        U5      -  nU[        U5      -  nUR                  5         U R                   R                  5         UR                  5       UR                  5       4$ )zj
One meta-training step on a batch of tasks

task_batch: List of (support_x, support_y, query_x, query_y)
r   rb   dim)rJ   	zero_gradr_   rQ   rR   rS   argmaxfloatmeanlenbackwardrZ   item)r   
task_batch
total_loss	total_accrW   rX   query_xquery_yrY   query_logits
query_losspredaccavg_lossavg_accs                  r   meta_train_stepMAML.meta_train_stepq   s     	%%'
	6@2I'!__YBN  44WML?J $J  &&1&-D?))+002CI 7A" J/c*o-  "}}..r   c                 t   [         R                  " U R                  5      n[        R                  " UR                  5       U R                  S9n[        U R                  5       HQ  nUR                  5         U" U5      n[        R                  " Xb5      nUR                  5         UR                  5         MS     U$ )zB
Adapt model to a new task (for evaluation)
Returns adapted model
rF   )copydeepcopyr@   rH   SGDr'   rA   rP   rC   rp   rR   rS   ru   rZ   )r   rW   rX   adapted_model	optimizerrZ   r[   r\   s           r   adapt_to_taskMAML.adapt_to_task   s    
 djj1IIm668T]]K	$**+D!"9-F??65DMMONN , r   c                 h   U R                   R                  5         [        R                  " 5          U R                  U5      nUR	                  SS9nXd:H  R                  5       R                  5       R                  5       nSSS5        U R                  X5      nUR                  5         [        R                  " 5          U" U5      n	U	R	                  SS9n
X:H  R                  5       R                  5       R                  5       nSSS5        WU4$ ! , (       d  f       N= f! , (       d  f       WW4$ = f)zH
Evaluate on a single task
Returns accuracy before and after adaptation
rb   rn   N)	r@   evalr%   no_gradrq   rr   rs   rv   r   )r   rW   rX   rz   r{   logits_beforepred_before
acc_beforer   logits_after
pred_after	acc_afters               r   evaluate_taskMAML.evaluate_task   s     	

]]_ JJw/M'..1.5K%0779>>@EEGJ  **9@ 	]]_(1L%,,,3J#.557<<>CCEI 
 9$$ _ _
 9$$s   AD=AD 
D 
D1)rD   rA   rC   rJ   r@   rB   N){Gz?MbP?   F)r5   r6   r7   r8   r9   r   Modulerr   r:   boolr   r_   rQ   r   r   r   r;    r   r   r>   r>   -   sn     !OyyO O 	O
 O O :""/H"%r   r>   
   c                 ~   U c   [         R                  R                  SS5      n Uc.  [         R                  R                  S[         R                  5      n[         R                  R                  SSUS45      nU [         R                  " X1-   5      -  n[
        R                  " U5      [
        R                  " U5      4$ )uO   
Create a sinusoid regression task
Classic MAML benchmark: y = A * sin(x + φ)
g?g      @r   r   rb   )nprandomuniformpisinr%   FloatTensor)	amplitudephase	n_samplesr    ys        r   create_sinusoid_taskr      s    
 II%%c3/	}		!!!RUU+
		"a)Q0ABFF19%%AQ!2!21!555r      c                 Z   [         R                  R                  U 5        [         R                  R                  U5      nU[         R                  R                  U5      -  n[         R                  R                  5       n[         R                  R                  X5      nXS-  U-   S:  R                  [        5      n[        R                  " USUS-   5      n[        R                  " USUS-   5      n[        R                  " XQS-  S 5      n	[        R                  " XaS-  S 5      n
XxX4$ )zX
Create a binary classification task
Different tasks have different decision boundaries
r   Nrc   )r   r   seedrandnlinalgnormastyper:   r%   r   
LongTensor)task_idr   
n_featureswbXr   rW   rX   rz   r{   s              r   create_classification_taskr      s    
 IINN7 			
#A	BIINN1A
		A 				.A	
Qs#A !!!MY\"23I  =IqL!12IQ,- 01GqA/0G11r   __main__zG
======================================================================zMAML: QUICK TESTzF======================================================================(   rc   )r	   r
   r   r   r   r   )rA   rB   rC   z
Model Parameters: c              #   @   #    U  H  oR                  5       v   M     g 7fr   )r-   ).0r)   s     r   	<genexpr>r      s     $K8J1WWYY8Js   z
Inner LR: z
Outer LR: zInner Steps: z Testing inner loop adaptation...)r   z
Accuracy before adaptation: d   z.1f%zAccuracy after z steps: zImprovement: u   
✅ MAML implementation readyz   Next: Meta-training loop)NNr   )r   r   )%r9   r%   torch.nnr   torch.optimrH   torch.nn.functional
functionalrR   numpyr   typingr   r   r   r   r   r   r>   r   r   r5   printr@   mamlsumr'   rA   rB   rC   rW   rX   rz   r{   r   r   r   r   r   r   <module>r      s         $ $ 		 @O% O%d6 22 z	-	
	&M 2r(JEu!DD	 $K8H8H8J$K!K L
MN	Jt}}o
&'	Jt}}o
&'	M$**+
,- 
-	
,-	&M-GUW-X*Iy'7 ..y)WgVJ		*:c>#*>a
@A	OD,,-XimC5H
JK	M9z136s;1
=>	
+,	
'(9 r   