package version7_2.spaceMemory;

/**
 * signature of an interaction
 * @author simon gay
 */
public class Pattern {

	public static int length1=SpaceMemory.size1*SpaceMemory.size2*3 + 8; //   7 "general" interaction >O, >X, >F, v, ^ + 1 always true
	
	public float[] pattern;
	
	public float maxPattern;
	public float maxPattern1;
	public float maxPattern2;
	
	public Pattern(){
		pattern=new float[length1];
		for (int i=0;i<length1;i++){
			pattern[i]=0;
		}
		maxPattern=0;
		maxPattern1=0;
		maxPattern2=0;
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// signatures related functions
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// prediction of success of this interaction in context img
	public float prediction(float[] img){
		float result=0;
		for (int i=0;i<length1;i++){
			result+=pattern[i]*img[i];
		}
		result= (float) ( 1 / (1+Math.exp(-result)))*2-1;
		
		return result;
	}
	
	// update signatures weights according to the result res of enaction and a context img
	public void learn(float[] img, float output){
		maxPattern1=0;
		maxPattern2=0;
		
		float result=prediction(img);
		float delta=output-result;
		
		for (int i=0;i<length1;i++){

			pattern[i]+= 0.01 * delta * img[i];
			
			if (Math.abs(pattern[i])>maxPattern) maxPattern=Math.abs(pattern[i]);
			if (i< length1-8 && Math.abs(pattern[i])>maxPattern1) maxPattern1=Math.abs(pattern[i]);
			if (i>=length1-8 && Math.abs(pattern[i])>maxPattern2) maxPattern2=Math.abs(pattern[i]);
		}
	}
}
