
    ii                          d dl Z G d d      Zy)    Nc                   H    e Zd ZdZd
dZddZd ZddZddZd Z		 	 ddZ
y	)EmergentTruthLearnera=  
    Self-learning system that discovers truths without labels.
    
    Philosophy: What doesn't break is truth.
    By testing classifier predictions on random noise and measuring
    stability, we discover which patterns the classifier considers
    "real" - these are emergent truths that can guide learning.
    c                    || _         t        j                  |df      | _        t        j                  |t              | _        t        j                  |      | _        d| _        d| _        || _	        d| _
        d| _        y)z
        Args:
            classifier: MLPClassifier instance
            buffer_size: Size of memory buffer for stable samples
          )dtyper   FN)
classifiernpzerostruth_buffer_Xinttruth_buffer_labelstruth_buffer_stability
buffer_idxbuffer_fullbuffer_sizetotal_stable_found	iteration)selfr   r   s      ;/home/per/Documents/python/state to state/emergent_truth.py__init__zEmergentTruthLearner.__init__   so     % !hhS'9:#%88Ks#C &(hh{&;# & #$    c                 \   t         j                  j                  |d      }ddlm}  || j
                  dd      }|j                  ||      }|d   j                  d   }|dkD  r1| j                  |d   |d	   |d
          | xj                  |z  c_	        | xj                  dz  c_
        |S )a'  
        Core self-learning: Find emergent truths in random noise.
        
        The classifier's stable predictions on noise reveal its
        internal truth about what patterns belong to which classes.
        
        Returns:
            n_stable: Number of stable samples found
        r   r   )StabilityAnalyzer   g?)n_perturbationsnoise_level)	thresholdXlabels	stability   )r	   randomrandnstability_analyzerr   r   find_stable_samplesshape_add_to_truth_bufferr   r   )r   	n_samplesstability_thresholdX_noiser   analyzerstable_infon_stables           r   discover_from_noisez(EmergentTruthLearner.discover_from_noise"   s     ))//)S1 	9$T__bVZ[227FY2Z s#))!,a<%%C H%K(
 ##x/#!r   c                 D   t        |      }t        |      D ]  }| j                  | j                  z  }||   | j                  |<   ||   | j
                  |<   ||   | j                  |<   | xj                  dz  c_        | j                  | j                  k\  sd| _         y)z&Add stable samples to circular buffer.r!   TN)lenranger   r   r   r   r   r   )r   r   r   r    niidxs          r   r'   z)EmergentTruthLearner._add_to_truth_bufferA   s    Fq 	(A//D$4$44C'(tD$,21ID$$S)/8|D'',OOq O$"2"22#' 	(r   c                 2   | j                   s t        j                  | j                        }nt        j                  | j                        }| j
                  |   |k\  }| j                  |   |   }| j                  |   |   }| j
                  |   |   }|||fS )z
        Get data for self-supervised training.
        
        Returns:
            X, labels, weights: Filtered by stability, weighted by confidence
        )r   r	   aranger   r   r   r   r   )r   min_stabilitymaskstable_maskr   r   weightss          r   get_self_training_dataz+EmergentTruthLearner.get_self_training_dataN   s     99T__-D99T--.D 11$7=H%k2))$/<--d3K@&'!!r   c                    | j                         \  }}}t        |      |k  ryt        j                  j	                  t        |      |d      }||   }||   }||   }	| j
                  j                  |      }
t        j                  d      |   }t        j                  |	ddt        j                  f   |z  t        j                  |
dz         z         |z  }|
|z
  }t        j                  | j
                  j                  j                  ||	ddt        j                  f   z        |z  }t        j                  ||	ddt        j                  f   z  dd      |z  }t        j                  ||	ddt        j                  f   z  | j
                  j                  j                        }|| j
                  j                  | j
                  j                         z  }t        j                  |j                  |      |z  }t        j                  |dd      |z  }| j
                  j"                  |z  }| j
                  xj$                  |d   |z  z  c_        | j
                  xj&                  |d	   |z  z  c_        | j
                  xj                  |d
   |z  z  c_        | j
                  xj(                  |d   |z  z  c_        |S )a+  
        Train classifier on emergent truths.
        
        Args:
            batch_size: Number of stable samples to train on
            learning_rate_scale: Scale factor for self-learning rate
            
        Returns:
            loss: Training loss, or None if no stable samples
        NF)replace
   g&.>r   T)axiskeepdimsr!         )r;   r0   r	   r"   choicer   forwardeyesumnewaxislogdota1TW2relu_derivativez1learning_rateW1b1b2)r   
batch_sizelearning_rate_scaler   r   r:   r4   X_batchlabels_batchweights_batchprobsone_hotlossdz2dW2db2da1dz1dW1db1lrs                        r   
self_trainzEmergentTruthLearner.self_trainb   sK    "88:67q6J iis1vz5AC&c{ ''0 &&*\*}Q

]3g=ut|@TTUUXbb goffT__''))3q"**}1M+MNQ[[ffS=BJJ77a$OR\\ffS=BJJ779K9K9M9MNDOO33DOO4F4FGGffWYY$z1ffSq40:= __**-@@beck)beck)beck)beck)r   c                 ~   | j                   s| j                  }n| j                  }|dk(  rddi dS | j                  d| }| j                  d| }i }t        d      D ]&  }t        t        j                  ||k(              ||<   ( || j                  z  t        t        j                  |            | j                  |dS )z0Get statistics about discovered emergent truths.r   )buffer_usagemean_stabilityclass_distributionNr>   )re   rf   r   rg   )r   r   r   r   r   r1   r   r	   rF   floatmeanr   )r   n_totalr    r   
class_distcs         r   get_truth_statisticsz)EmergentTruthLearner.get_truth_statistics   s    ooG&&Ga<$%RTUU//9	))(73
r 	5Av{ 34JqM	5 $d&6&66#BGGI$67"&"9"9",	
 	
r   c           	         t         j                  j                  dt        |      t	        |d|z
  z              }||   }||   }| j
                  j                  |t        j                  d      |          | j
                  j                  t        j                  d      |   | j
                  j                  |            }| j                  t	        ||z              }	||	fS )a@  
        Combine supervised learning with self-learning.
        
        Args:
            X_train, y_train: Labeled training data
            batch_size: Total batch size
            self_learning_ratio: Fraction from self-learning
            
        Returns:
            supervised_loss, self_learning_loss
        r   r!   r>   )rS   )r	   r"   randintr0   r   r   updaterE   compute_lossrD   rc   )
r   X_trainy_trainrS   self_learning_ratioidx_supX_supy_supsup_loss	self_losss
             r   combined_training_stepz+EmergentTruthLearner.combined_training_step   s     ))##As7|SqK^G^9_5`a  ubffRj&78??//FF2JuOO##E*
 OOs:@S3S/TOU	""r   N)i  )d   g333333?)g?)   g      ?)r{   g333333?)__name__
__module____qualname____doc__r   r.   r'   r;   rc   rm   rz    r   r   r   r      s5    (>("(.`
0 CF36#r   r   )numpyr	   r   r   r   r   <module>r      s    @# @#r   