docs: private void takeSnapshot(){
  
      	this.index = computeStabilityIndex();
      	 
      	if (this.index >= this.theta_stab)
      		if (addedPermanent == 0){
      			this.ensemble[this.ensemble.length-MAXPERMANENT+addedPermanent] = getBestAdaptiveClassifier().copy();
      			addedPermanent++;
      		}
      		else{
      			
      			Classifier candidate = getBestAdaptiveClassifier().copy();
      			
      			boolean duplicate = false;
      			for (int j=0;j<Math.min(MAXPERMANENT,addedPermanent);j++){
          			Classifier lastSnapshot=this.ensemble[this.ensemble.length-MAXPERMANENT+j];
          			
          			int[][] votes=new int[2][tau_size];
          			for (int k=0;k<tau_size;k++){
          				votes[0][k]=Utils.maxIndex(candidate.getVotesForInstance(recentChunk.get(k)));	
          				votes[1][k]=Utils.maxIndex(lastSnapshot.getVotesForInstance(recentChunk.get(k)));	
          			}
          			double kappa=computeKappa(votes[0],votes[1]);
          			
          			if (kappa>=this.theta_diff){
          				duplicate = true; break;
          			} 
      			}
      			if (!duplicate){
          			this.ensemble[this.ensemble.length-MAXPERMANENT+(addedPermanent%MAXPERMANENT)]=candidate;
      				addedPermanent++;
      			}	
      		}	
      	}