
    i                        d dl Zd dlmZ  ed      d   j	                  dd      Z ed      d   dz  j                  e      Z ed	      d   j	                  dd      Z	 ed
      d   dz  j                  e      Z
e	dd Ze
dd Z G d d      Z edddddd      Zd Zd Zd Zd Z	 ej&                  j)                  d dd      Zee   Zee   Zej1                  e       ej3                  e ej4                  d      e          ej7                  ee      \  ZZZeredz  Zej?                  ee      Z ej@                  ejB                  e    ejD                  eejF                        ejH                  z   z
  dz        Z%edz  d k(  r-edkD  rdndZ&erdndZ' e(deddeddedd ed!d"e& d#e'        ed$kD  red%k  res e(d&edd'ed       yedz  Zed(kD  r	 e(d)       y@)*    N)readz../X_train.wav   i  z../y_train.wav	   z../X_test.wavz../y_test.wavi  c                   d    e Zd Z	 	 	 ddZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZddZd Zd Zy)CC_MLPClassifierc                    t         j                  j                  ||      dz  | _        t        j                  d|f      | _        t         j                  j                  ||      dz  | _        t        j                  d|f      | _        t         j                  j                  ||      dz  | _        t        j                  d|f      | _	        || _
        || _        || _        g | _        g | _        y )N{Gz?r   )nprandomrandnW1zerosb1W2b2Mbcollapse_thresholdenergy_budgetcycle_check	M_historyerror_history)self
input_sizehidden_sizeoutput_sizer   r   r   s          c01.py__init__zCC_MLPClassifier.__init__   s     ))//*k:TA((A{+,))//+{;dB((A{+, k:TA1k*+ #5*&     c                 .    t        j                  d|      S )Nr   )r   maximumr   xs     r   reluzCC_MLPClassifier.relu$   s    zz!Qr    c                 6    t        j                  |dkD  dd      S )Nr   r   )r   wherer#   s     r   relu_derivativez CC_MLPClassifier.relu_derivative'   s    xxAq!$$r    c                     t        j                  |t        j                  |dd      z
        }|t        j                  |dd      z  S )Nr   Taxiskeepdims)r   expmaxsum)r   r$   exp_xs      r   softmaxzCC_MLPClassifier.softmax*   s:    q266!!d;;<rvve!d;;;r    c                 v   t        j                  || j                        | j                  z   | _        | j                  | j                        | _        t        j                  | j                  | j                        | j                  z   | _	        | j                  | j                        | _        | j                  S N)r   dotr   r   z1r%   a1r   r   z2r1   output)r   Xs     r   forwardzCC_MLPClassifier.forward.   sv    &&DGG$tww.))DGG$&&$''*TWW4ll477+{{r    c                     |j                   d   }t        j                  |t        j                  |dz         z         |z  }|S )Nr   g&.>)shaper   r/   log)r   y_truey_predmlosss        r   compute_losszCC_MLPClassifier.compute_loss5   s<    LLOvv} 5566:r    c                    |j                   d   }||z
  }t        j                  | j                  j                  |      |z  }t        j
                  |dd      |z  }t        j                  || j                  j                        }|| j                  | j                        z  }	t        j                  |j                  |	      |z  }
t        j
                  |	dd      |z  }|
|||fS )Nr   Tr*   )	r<   r   r4   r6   Tr/   r   r(   r5   )r   r9   r>   r?   r@   dz2dW2db2da1dz1dW1db1s               r   backwardzCC_MLPClassifier.backward:   s    LLOvoffTWWYY$q(ffSq4014ffS$''))$D((11ffQSS#"ffSq4014Cc!!r    c                    | j                  |      }| j                  |||      \  }}}}| xj                  d|z  z  c_        | xj                  d|z  z  c_        | xj                  d|z  z  c_        | xj
                  d|z  z  c_        y )Nr
   )r:   rL   r   r   r   r   )r   r9   r>   r?   rJ   rK   rF   rG   s           r   updatezCC_MLPClassifier.updateE   sr    a!]]1ff=S#s4#:4#:4#:4#:r    c                 R    | j                  |      }t        j                  |d      S )Nr   r+   )r:   r   argmax)r   r9   probabilitiess      r   predictzCC_MLPClassifier.predictM   s     QyyQ//r    c                 T    | j                  |      }t        j                  ||k(        S r3   )rS   r   mean)r   r9   r>   ys       r   scorezCC_MLPClassifier.scoreQ   s"    LLOwwqF{##r    c                 r   t        j                  || j                        | j                  z   }| j                  |   |z
  }t        j
                  t         j                  j                  |d            }| j                  j                  |       t        | j                        | j                  kD  r| j                  j                  d       | j                         }|| j                  kD  rG|sE| j                  |xx   ||z  z  cc<   | xj                  ||j                  d      z  z  c_        d}nd}|||fS )z
        Conditional Collapse of M based on entropy/error.
        
        CCT Principles:
        - Only update when error > collapse_threshold
        - Detect periodicity to avoid oscillation
        - Pay with energy only when necessary
        r   rP   r   TFr   r4   r   r   r   rU   linalgnormr   appendlenr   pop_detect_oscillationr   )	r   r9   ytenergy_weight
activationerrentropyis_periodiccollapse_occurreds	            r   collapse_manifestation_Mz)CC_MLPClassifier.collapse_manifestation_MW   s    VVAtww'$&&0
ffRj:% ''"))..1.56 	!!'*t!!"T%5%55""1%..0 T,,,[FF2J-#--JFFmchhAh&666F $ !&);66r    c                    t        | j                        | j                  k  ryt        j                  | j                        }t        j
                  |      }t        j
                  t        j                  |            }|dk  r|dkD  ryy)z/Detect if M is oscillating (periodic behavior).F皙?r
   T)r]   r   r   r   arrayvardiff)r   historyvariancediff_variances       r   r_   z$CC_MLPClassifier._detect_oscillationy   sp    t!!"T%5%55 ((4--. 66'?rwww/0 c>md2r    c                    t        j                  || j                        | j                  z   }| j                  |   |z
  }t        j
                  t         j                  j                  |d            }| j                  j                  |       t        | j                        | j                  kD  r| j                  j                  d       | j                         }|rd}n|dk  rd}n|| j                  k  rd}nd}|dkD  rB| j                  |xx   ||z  z  cc<   | xj                  ||j                  d      z  z  c_        |||fS )	a  
        Adaptive M update using CCT energy efficiency.
        
        Strategy: 
        - If system is stable (low entropy): minimal update
        - If system is unstable (high entropy): full update
        - If system is oscillating: freeze M, let MLP adapt
        r   rP   r   g        ri   gMbP?r
   g?rY   )r   r9   r`   rb   rc   rd   re   lrs           r   update_M_adaptivez"CC_MLPClassifier.update_M_adaptive   s    VVAtww'$&&0
ffRj:%''"))..1.56!!'*t!!"T%5%55""1%..0 Bs]Bt...B B 8FF2J"s("JFFb3888+++FK''r    N)g      ?      ?
   )r
   )__name__
__module____qualname__r   r%   r(   r1   r:   rB   rL   rN   rS   rW   rg   r_   rr    r    r   r   r      sM    $'" , %<
	"0$ 7D"&(r    r   d   rt   g?rs      )r   r   r   r   r   r   i`     r
   ACTIVE	CONSERVEDOSCILLATINGSTABLEzStep 4dz
 | Score: z.4fz | Entropy: z | LR: z.3fz | Energy: z
 | State: g\(\?ri   u   
✓ COLLAPSE ACHIEVED: Score z
, Entropy i  zMax iterations reached))numpyr   scipy.io.wavfiler   reshapeX_trainastypeinty_trainX_testy_testX20yt20r   ftotal_collapse_opstotal_energy_savedoscillation_freezesir   randintidxr9   r`   r:   rN   eyerr   rd   lr_usedre   rW   rU   r   r4   r   r   total_errorenergy_status
osc_statusprintrx   r    r   <module>r      sf    ! 
 
#
+
+B
4 !!$q(
0
0
5	o	q	!	)	)"c	2


"Q
&	.	.s	3Udmet}c( c(N     

))

Auc
*CA	B IIaLHHQr
2 %&$7$72$>!GWk q  GGArNE"''133r7fbffQo&;<q@AK3w!|$+dN&1]x
aV:eC[ 1!# 'SM "& ("|	% 	& t|#k/c{*WSMRSFA4x&'M r    