diff --git a/AMOEBA3/Ressources/nDimensionLauncher.xml b/AMOEBA3/Ressources/nDimensionLauncher.xml
index c5c4f1d04fc2cb6b1ab59271a32942f1278fdbfe..53bafe46db4a06ecdc8e41e68e05d4e749953f86 100644
--- a/AMOEBA3/Ressources/nDimensionLauncher.xml
+++ b/AMOEBA3/Ressources/nDimensionLauncher.xml
@@ -9,7 +9,6 @@
 	<StartingAgents>
 		<Sensor Name="px0" Source="x0"></Sensor>
 		<Sensor Name="px1" Source="x1"></Sensor>
-		<Sensor Name="px2" Source="x2"></Sensor>
 		<Controller Name="Controller" Oracle="test"></Controller>
 
 	</StartingAgents>
diff --git a/AMOEBA3/src/experiments/FILE.java b/AMOEBA3/src/experiments/FILE.java
index 0eb7a1dcd430edfc7dca95b4bd3ff7fa0c5db807..f77dfc4b3562041866dc9cde737d075134df62e9 100644
--- a/AMOEBA3/src/experiments/FILE.java
+++ b/AMOEBA3/src/experiments/FILE.java
@@ -12,6 +12,7 @@ public class FILE {
 	
 	PrintWriter pw;
 
+	String manualMessage;
 	
 	public FILE(String folder, String name){
 		    try {
@@ -56,6 +57,18 @@ public class FILE {
 			message += info + ";"  ;
 		}
 		pw.println(message);
+	} 
+	
+	public void initManualMessage() {
+		manualMessage = "";
+	}
+	
+	public void addManualMessage(String subMessage) {
+		manualMessage += subMessage + ";";
+	}
+	
+	public void sendManualMessage() {
+		pw.println(manualMessage);
 	}
 	
 public static void main(String[] args) {
diff --git a/AMOEBA3/src/experiments/Regression/F_N_Launcher.java b/AMOEBA3/src/experiments/Regression/F_N_Launcher.java
index bdd212a37fcd8ef216a96e4dbd41d5d79a6f94c6..08d980cd34ae2f815b8990d5ee5281fb2cb0bee5 100644
--- a/AMOEBA3/src/experiments/Regression/F_N_Launcher.java
+++ b/AMOEBA3/src/experiments/Regression/F_N_Launcher.java
@@ -18,9 +18,9 @@ public class F_N_Launcher implements Serializable {
 
 	public static final boolean viewer = true;
 	public static final double oracleNoiseRange = 10;
-	public static final double learningSpeed = 0.01;
-	public static final int regressionPoints = 100;
-	public static final int dimension = 30	;
+	public static final double learningSpeed = 0.001;
+	public static final int regressionPoints = 1000;
+	public static final int dimension = 2	;
 
 	public static void main(String[] args) {
 		launch(viewer);
@@ -30,7 +30,7 @@ public class F_N_Launcher implements Serializable {
 		
 		String XMLConfigFile = "nDimensionLauncher.xml";
 		
-		XmlConfigGenerator.makeXML(XMLConfigFile, dimension);
+		//XmlConfigGenerator.makeXML(XMLConfigFile, dimension);
 	
 		
 		
diff --git a/AMOEBA3/src/experiments/Regression/RegressionManager.java b/AMOEBA3/src/experiments/Regression/RegressionManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..46f815e0d24ca8d8bbbd743d8507565622dfb4ad
--- /dev/null
+++ b/AMOEBA3/src/experiments/Regression/RegressionManager.java
@@ -0,0 +1,144 @@
+package experiments.Regression;
+
+import java.util.ArrayList;
+
+import mas.Pair;
+import mas.agents.AbstractPair;
+import mas.agents.context.Context;
+import mas.agents.context.Experiment;
+import mas.agents.localModel.Regression;
+import mas.agents.percept.Percept;
+
+public class RegressionManager {
+	
+	
+	/** The n parameters. */
+	private int dimension;
+	
+	/** The regression. */
+	transient private Regression regression;
+
+	
+	/** The coef. */
+	private double[] coefs;
+	
+	private double spaceSize;
+	
+	public RegressionManager(int dim, double spcsize) {
+		this.dimension = dim;
+		this.spaceSize = spcsize;
+		regression = new Regression(dimension,true);
+	}
+	
+	public RegressionManager(int dim, double spcsize, double[] coeficients) {
+		this.dimension = dim;
+		this.spaceSize = spcsize;
+		regression = new Regression(dimension,true);
+		coefs = coeficients;
+	}
+	
+	
+	public void setCoefs(double[] newCoefs) {
+		coefs = newCoefs;
+	}
+	
+	public double[] getCoefs() {
+		return coefs;
+	}
+	
+	
+	
+	public void updateModelWithArtificialPoints(int numberOfPoints, double noise) {
+		
+		regression = new Regression(dimension,true);
+		
+		Pair<double[][], double[]> artificialSituations = getRandomlyDistributedArtificialExperiments(numberOfPoints, noise);
+		
+			
+		for (int i =0;i<numberOfPoints;i++) {
+			
+			regression.addObservation(artificialSituations.getA()[i], artificialSituations.getB()[i]);
+			
+		}
+			
+			
+		int i = 0;
+		while (regression.getN() < dimension + 2) { //TODO : to improve
+			
+			regression.addObservation(artificialSituations.getA()[i%numberOfPoints], artificialSituations.getB()[i%numberOfPoints]);
+			i++;
+			
+			System.out.println("ADING Observations " + regression.getN());
+			
+		}
+		
+
+		
+		coefs = regression.regress().getParameterEstimates();
+		
+
+		
+
+		
+	}
+	
+	
+	private Pair<double[][], double[]> getRandomlyDistributedArtificialExperiments(int amount, double noise){
+		
+		double[][] artificalExperiments = new double[amount][dimension];
+		double[] artificalResults = new double[amount];
+		
+
+		
+		for (int i = 0; i < amount;i ++) {
+			
+			for(int j = 0;j<dimension;j++) {
+				
+				double startRange = - spaceSize;
+				double endRange = spaceSize;
+				artificalExperiments[i][j] = startRange + (Math.random()*(endRange - startRange));
+			}
+			artificalResults[i] = this.getProposition(artificalExperiments[i], noise);
+			
+		}
+		
+		return new Pair<double[][], double[]>(artificalExperiments, artificalResults);
+	}
+	
+	public double getProposition(double[] situation) {
+		
+		
+			
+		double result = coefs[0];
+
+		if (coefs[0] == Double.NaN) System.exit(0);
+		
+		for (int i = 1 ; i < coefs.length ; i++) {
+			
+			if (Double.isNaN(coefs[i])) coefs[i] = 0;
+			result += coefs[i] * situation[i-1];
+
+		}
+	
+		return result;
+	}
+	
+	public double getProposition(double[] situation, double noise) {
+		
+		
+		
+		double result = coefs[0];
+
+		if (coefs[0] == Double.NaN) System.exit(0);
+		
+		for (int i = 1 ; i < coefs.length ; i++) {
+			
+			if (Double.isNaN(coefs[i])) coefs[i] = 0;
+			result += coefs[i] * situation[i-1];
+
+		}
+	
+		return result - noise + (Math.random()*2*noise);
+	}
+	
+}
diff --git a/AMOEBA3/src/experiments/Regression/StabilityXP.java b/AMOEBA3/src/experiments/Regression/StabilityXP.java
new file mode 100644
index 0000000000000000000000000000000000000000..786ffa69336699b1dd147ce4d6b47957e63dcf5e
--- /dev/null
+++ b/AMOEBA3/src/experiments/Regression/StabilityXP.java
@@ -0,0 +1,130 @@
+package experiments.Regression;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import experiments.FILE;
+
+public class StabilityXP {
+
+	public static final int dimension = 30	;
+	public static final int regressionPoints = 50;
+	public static final int cycles = 100000	;
+	public static final double spaceSize = 50.0	;
+	public static final double noise = 1.0	;
+	public static final double coefsMarges = 255	;
+	
+	static double[] initCoefs = new double[dimension+1];
+	static double[] errors = new double[dimension+1];
+	
+	public static void main(String[] args) {
+		
+		
+		String fileName = fileName(new ArrayList<String>(Arrays.asList(
+				"03012019","RegressionStability",
+				"Dim",""+dimension,
+				"RegressionPoints",""+regressionPoints,
+				"Cyles",""+cycles,
+				"SpaceSize",""+spaceSize,
+				"Noise",""+noise,
+				"CoefsMarges",""+coefsMarges
+				)));
+		
+		FILE file = new FILE("Regression",fileName);
+		
+		for(int i = 0; i<=dimension; i++) {
+			
+			initCoefs[i] = (int) ((Math.random() * 2 * coefsMarges) - coefsMarges);
+			if(initCoefs[i]==0) initCoefs[i]=1;
+		}
+		
+		
+		
+		RegressionManager regressionManager = new RegressionManager(dimension, spaceSize, initCoefs);
+		
+		display(initCoefs);
+		
+		for(int i=0;i<cycles;i++) {
+			
+			regressionManager.updateModelWithArtificialPoints(regressionPoints, noise);
+			
+			updateErrors(regressionManager.getCoefs());
+			
+			if(i%100000==0) System.out.println(i);
+			
+			writeMessage(file,errors,i);
+			
+		}
+		
+		display(regressionManager.getCoefs());
+		display(errors);
+		System.out.println(errorsSum());
+		System.out.println(((float)(errorsMean()*100)) + " %");
+		
+		file.close();
+		
+	}
+	
+	
+	public static void writeMessage(FILE file, double[] values, int cycle) {
+		
+		file.initManualMessage();
+		
+		for(int i = 0; i< values.length;i++) {
+			file.addManualMessage(""+values[i]);
+			
+		}
+		
+		file.addManualMessage(""+errorsSum());
+		
+		file.addManualMessage(""+errorsMean());
+		file.addManualMessage(""+cycle);
+		
+		file.sendManualMessage();
+		
+	}
+	
+	public static void display(double[] coefs) {
+		
+		for(int i = 0; i<coefs.length;i++) {
+			System.out.print(coefs[i] + "\t");
+		}
+		System.out.println("");
+	}
+	
+	public static void updateErrors(double[] newCoefs) {
+
+		
+		for(int i = 0 ; i< newCoefs.length;i++) {
+			errors[i] = Math.abs(newCoefs[i]-initCoefs[i])/Math.abs(initCoefs[i]);
+		}
+		
+	}
+	
+	public static double errorsSum() {
+		double sum = 0.0;
+		for(int i=0;i<errors.length;i++) {
+			sum+=errors[i];
+		}
+		return sum;
+	}
+	
+	public static double errorsMean() {
+		double mean = 0.0;
+		for(int i=0;i<errors.length;i++) {
+			mean+=errors[i];
+		}
+		return mean/errors.length;
+	}
+	
+	public static String fileName(ArrayList<String> infos) {
+		String fileName = "";
+		
+		for(String info : infos) {
+			fileName += info + "_";
+		}
+		
+		return fileName;
+	}
+
+}
diff --git a/AMOEBA3/src/experiments/XmlConfigGenerator.java b/AMOEBA3/src/experiments/XmlConfigGenerator.java
index ef35c6685ee402626b64f5c875e6a140cf6096e9..00f5086a85ab7d5363024529ae1cf8a115749274 100644
--- a/AMOEBA3/src/experiments/XmlConfigGenerator.java
+++ b/AMOEBA3/src/experiments/XmlConfigGenerator.java
@@ -59,9 +59,10 @@ public class XmlConfigGenerator {
 	public static void main(String[] args) {
 		// TODO Auto-generated method stub
 
+		
 		String XMLConfigFile = "nDimensionLauncher.xml";
 		
-		XmlConfigGenerator.makeXML(XMLConfigFile, 4);
+		XmlConfigGenerator.makeXML(XMLConfigFile, 2);
 		
 		
 	}
diff --git a/AMOEBA3/src/experiments/nDimensionLauncher.xml b/AMOEBA3/src/experiments/nDimensionLauncher.xml
new file mode 100644
index 0000000000000000000000000000000000000000..147a1f45074db50b4a20522b934812d00ed286cc
--- /dev/null
+++ b/AMOEBA3/src/experiments/nDimensionLauncher.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<System>
+
+	<!-- General config options -->
+	<Configuration>
+		<Learning allowed = "true" creationOfNewContext = "true" loadPresetContext = "false"></Learning>	
+	</Configuration>
+
+	<StartingAgents>
+		<Sensor Name="px0" Source="x0"></Sensor>
+		<Sensor Name="px1" Source="x1"></Sensor>
+		<Sensor Name="px2" Source="x2"></Sensor>
+		<Sensor Name="px3" Source="x3"></Sensor>
+		<Sensor Name="px4" Source="x4"></Sensor>
+		<Controller Name="Controller" Oracle="test"></Controller>
+
+	</StartingAgents>
+
+</System>
\ No newline at end of file
diff --git a/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Launcher.java b/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Launcher.java
index ffe39ef4ac46d48c14ca323fc2efb3cf437c20bd..9c8ff7013ebb4618b7d31295e81232e8399d3802 100644
--- a/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Launcher.java
+++ b/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Launcher.java
@@ -17,10 +17,11 @@ public class F_N_Launcher implements Serializable {
 
 
 	public static final boolean viewer = true;
-	public static final double oracleNoiseRange = 0.1;
-	public static final double learningSpeed = 0.01;
-	public static final int regressionPoints = 100;
-	public static final int dimension = 3	;
+	public static final double oracleNoiseRange = 0.0;
+	public static final double learningSpeed = 0.001;
+	public static final int regressionPoints = 1000;
+	public static final int dimension = 2	;
+	public static final double spaceSize = 50.0	;
 
 	public static void main(String[] args) {
 		launch(viewer);
@@ -30,7 +31,7 @@ public class F_N_Launcher implements Serializable {
 		
 		String XMLConfigFile = "nDimensionLauncher.xml";
 		
-		XmlConfigGenerator.makeXML(XMLConfigFile, dimension);
+		
 	
 		
 		
@@ -42,13 +43,14 @@ public class F_N_Launcher implements Serializable {
 		
 		/* Error parameter */
 		amoeba.setDataForErrorMargin(1, 0.5, 0.5, 1, 20000, 20000);
+		//amoeba.setDataForErrorMargin(1000, 0.5, 0.5, 1, 20, 20);
 		
 		/* Other parameters */
 		amoeba.setRememberState(false);
 		amoeba.setGenerateCSV(false);
 		
 
-		F_N_Manager f_N_Manager = new F_N_Manager(50.0, dimension);
+		F_N_Manager f_N_Manager = new F_N_Manager(spaceSize, dimension);
 		
 		
 		amoeba.getScheduler().getHeadAgent().learningSpeed = learningSpeed;
diff --git a/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Manager.java b/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Manager.java
index 5deb8c406ee36c5f81d09111297642381b431ad9..4ed2f18784983b24df57fa52422274e541ef9255 100644
--- a/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Manager.java
+++ b/AMOEBA3/src/experiments/nDimensionsLaunchers/F_N_Manager.java
@@ -43,11 +43,23 @@ public class F_N_Manager implements StudiedSystem, Serializable{
 		for(int i = 0; i<dimension; i++) {
 			x[i] = 0.0;
 			
-			modelCoefs1[i] = (int) (Math.random() * 255);
-			modelCoefs2[i] = (int) (Math.random() * 255);
+			modelCoefs1[i] = (int) (Math.random() * 500 - 255);
+			modelCoefs2[i] = (int) (Math.random() * 500 - 255);
 		}
-		modelCoefs1[dimension] = (int) (Math.random() * 255);
-		modelCoefs2[dimension] = (int) (Math.random() * 255);
+		modelCoefs1[dimension] = (int) (Math.random() * 500 - 255);
+		modelCoefs2[dimension] = (int) (Math.random() * 500 - 255);
+		
+		
+		System.out.print(modelCoefs1[modelCoefs1.length-1] + "\t");
+		for(int i =0;i<modelCoefs1.length-1;i++) {
+			System.out.print(modelCoefs1[i] + "\t");
+		}
+		System.out.println("");
+		System.out.print(modelCoefs2[modelCoefs2.length-1] + "\t");
+		for(int i =0;i<modelCoefs2.length-1;i++) {
+			System.out.print(modelCoefs2[i] + "\t");
+		}
+		System.out.println("");
 	}
 	
 	
@@ -99,6 +111,23 @@ public class F_N_Manager implements StudiedSystem, Serializable{
 		
 	}
 	
+	public double model(double x0, double x1) {
+		
+		/* Disc */
+		//return (y*y + x*x < spaceSize*spaceSize ) ? 2*x + y : 5*x - 8*y;
+		
+		/* Square */
+		return (x1 > -spaceSize && x1 < spaceSize && x0 < spaceSize && x0 > -spaceSize) ? model1(x0,x1) : model2(x0,x1) ;
+		//return model1();
+		
+		/* Triangle */
+		//return (y > x) ? 2*x + y : 5*x - 8*y;
+		
+		/* Split */
+		//return ( x <= 0 ) ? 2*x + y : 5*x - 8*y;
+		
+	}
+	
 	public double model1() {
 		double result = 0.0;
 		for(int i = 0; i<dimension;i++) {
@@ -117,6 +146,22 @@ public class F_N_Manager implements StudiedSystem, Serializable{
 		return result;		
 	}
 	
+	public double model1(double x0, double x1) {
+		double result = 0.0;
+		result += x0*modelCoefs1[0];
+		result += x1*modelCoefs1[1];
+		result += modelCoefs1[dimension];
+		return result;		
+	}
+	
+	public double model2(double x0, double x1) {
+		double result = 0.0;
+		result += x0*modelCoefs2[0];
+		result += x1*modelCoefs2[1];
+		result += modelCoefs2[dimension];
+		return result;		
+	}
+	
 	/* (non-Javadoc)
 	 * @see kernel.StudiedSystem#getOutput()
 	 */
@@ -174,14 +219,14 @@ public class F_N_Manager implements StudiedSystem, Serializable{
 	public HashMap<String, Double> getOutputRequest(HashMap<String, Double> values) {
 		HashMap<String, Double> out = new HashMap<String, Double>();
 
-//		double xValue = values.get("px");
-//		double yValue = values.get("py");
-//		
-//		result = model(xValue, yValue);
-//		
-//		out.put("px",xValue);
-//		out.put("py",yValue);
-//		out.put("oracle",result);
+		double xValue = values.get("px0");
+		double yValue = values.get("px1");
+		
+		result = model(xValue, yValue);
+		
+		out.put("px0",xValue);
+		out.put("px1",yValue);
+		out.put("oracle",result);
 		return out;
 	}
 
diff --git a/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Launcher.java b/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Launcher.java
index df0b2af98c1e676e84662e85daa82ec42df732d8..171cf0333ba129df3cd6d2c69756b9e4581dd57a 100644
--- a/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Launcher.java
+++ b/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Launcher.java
@@ -54,7 +54,7 @@ public class F_XY_Launcher implements Serializable {
 			}
 			
 			
-			if(amoeba.getScheduler().requestAsked()) {
+			if(amoeba.getScheduler().requestAsked()) { 
 				amoeba.manual = true;
 				//System.out.println("                                                                                                     MANUAL REQUEST");
 				amoeba.learn(new HashMap<String, Double>(f_XY_Manager.getOutputRequest(amoeba.getScheduler().getManualRequest())));
diff --git a/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Manager.java b/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Manager.java
index 70984b2508ae4392993ee7700f5b108e21218826..65b8ab0289e642c8be69739519492f5872175d4b 100644
--- a/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Manager.java
+++ b/AMOEBA3/src/experiments/twoDimensionsLaunchers/F_XY_Manager.java
@@ -55,11 +55,11 @@ public class F_XY_Manager implements StudiedSystem, Serializable{
 		//return (y*y + x*x < spaceSize*spaceSize ) ? 2*x + y : 5*x - 8*y;
 		
 		/* Square */
-		//return (y > -spaceSize && y < spaceSize && x < spaceSize && x > -spaceSize) ? 2*x + y : 5*x - 8*y ;
+		return (y > -spaceSize && y < spaceSize && x < spaceSize && x > -spaceSize) ? 2*x + y : 5*x - 8*y ;
 		//return 5*x - 8*y ;
 		
 		/* Triangle */
-		return (y > x) ? 2*x + y : 5*x - 8*y;
+//		/return (y > x) ? 2*x + y : 5*x - 8*y;
 		
 		/* Split */
 		//return ( x <= 0 ) ? 2*x + y : 5*x - 8*y;
@@ -71,7 +71,7 @@ public class F_XY_Manager implements StudiedSystem, Serializable{
 	 */
 	@Override
 	public HashMap<String, Double> getOutput() {
-		HashMap<String, Double> out = new HashMap<String, Double>();
+		HashMap<String, Double> out = new HashMap<String, Double>(); 
 
 		result = model(x, y);
 		
diff --git a/AMOEBA3/src/mas/Pair.java b/AMOEBA3/src/mas/Pair.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6dc4cebef3297ffeb85e9a60b8eae2790279381
--- /dev/null
+++ b/AMOEBA3/src/mas/Pair.java
@@ -0,0 +1,30 @@
+package mas;
+
+public class Pair<A,B> {
+
+	public  A a;
+    public  B b;
+
+    public Pair(A a, B b) {
+        this.a = a;
+        this.b = b;
+    }
+    
+    public A getA() {
+    	return a;
+    }
+    
+    public B getB() {
+    	return b;
+    }
+    
+    public void setA(A a) {
+    	 this.a = a;
+    }
+    
+    public void setB(B b) {
+   	 this.b = b;
+   }
+}
+
+
diff --git a/AMOEBA3/src/mas/Quadruplet.java b/AMOEBA3/src/mas/Quadruplet.java
new file mode 100644
index 0000000000000000000000000000000000000000..3491f2dc6f9fb8151bd8d448fa1581cf494e999b
--- /dev/null
+++ b/AMOEBA3/src/mas/Quadruplet.java
@@ -0,0 +1,50 @@
+package mas;
+
+public class Quadruplet<A,B,C,D> {
+
+	public  A a;
+    public  B b;
+    public  C c;
+    public  D d;
+
+    public Quadruplet(A a, B b, C c, D d) {
+        this.a = a;
+        this.b = b;
+        this.c = c;
+        this.d = d;
+    }
+    
+    public A getA() {
+    	return a;
+    }
+    
+    public B getB() {
+    	return b;
+    }
+    
+    public C getC() {
+    	return c;
+    }
+    
+    public D getD() {
+    	return d;
+    }
+    
+    public void setA(A a) {
+    	 this.a = a;
+    }
+    
+    public void setB(B b) {
+   	 this.b = b;
+   }
+    
+    public void setC(C c) {
+      	 this.c = c;
+      }
+    
+    public void setD(D d) {
+     	 this.d = d;
+     }
+}
+
+
diff --git a/AMOEBA3/src/mas/Triplet.java b/AMOEBA3/src/mas/Triplet.java
new file mode 100644
index 0000000000000000000000000000000000000000..273d1ed36fc66f9e679dce1dd775fc14dfdad08b
--- /dev/null
+++ b/AMOEBA3/src/mas/Triplet.java
@@ -0,0 +1,40 @@
+package mas;
+
+public class Triplet<A,B,C> {
+
+	public  A a;
+    public  B b;
+    public  C c;
+
+    public Triplet(A a, B b, C c) {
+        this.a = a;
+        this.b = b;
+        this.c = c;
+    }
+    
+    public A getA() {
+    	return a;
+    }
+    
+    public B getB() {
+    	return b;
+    }
+    
+    public C getC() {
+    	return c;
+    }
+    
+    public void setA(A a) {
+    	 this.a = a;
+    }
+    
+    public void setB(B b) {
+   	 this.b = b;
+   }
+    
+    public void setC(C c) {
+      	 this.c = c;
+      }
+}
+
+
diff --git a/AMOEBA3/src/mas/agents/context/Context.java b/AMOEBA3/src/mas/agents/context/Context.java
index 15b43103ab91c91e3b56c1f2b8847e956a288631..2986cccb8c7791b082248d7f3a5e55579b69eabc 100644
--- a/AMOEBA3/src/mas/agents/context/Context.java
+++ b/AMOEBA3/src/mas/agents/context/Context.java
@@ -297,6 +297,8 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 //		experiments.add(newPoint);
 //		localModel.updateModel(this);
 		
+		localModel.updateModel(this.getCurrentExperiment(),world.getScheduler().getHeadAgent().learningSpeed,world.getScheduler().getHeadAgent().numberOfPointsForRegression);
+		
 		this.world.getScheduler().addAlteredContext(this);
 		this.setName(String.valueOf(this.hashCode()));
 		this.world.startAgent(this);
@@ -396,7 +398,8 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 		firstPoint.setOracleProposition(this.headAgent.getOracleValue());
 		//world.trace(new ArrayList<String>(Arrays.asList(this.getName(),"NEW EXP", firstPoint.toString())));
 		experiments.add(firstPoint);
-		localModel.updateModel(this);
+		
+		localModel.updateModel(this.getCurrentExperiment(),world.getScheduler().getHeadAgent().learningSpeed,world.getScheduler().getHeadAgent().numberOfPointsForRegression);
 		this.world.getScheduler().addAlteredContext(this);
 		this.setName(String.valueOf(this.hashCode()));
 		this.world.startAgent(this);
@@ -1016,7 +1019,7 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 					
 				}
 				else {
-					solveNCS_Conflict(head);
+					solveNCS_BadPrediction(head);
 					this.world.getScheduler().addAlteredContext(this);
 				}
 			}
@@ -1052,9 +1055,10 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 			confidence++;	
 			
 		}else {
-			if(this != closestContextToOracle){
-				this.solveNCS_Conflict(head);
+			if(this != closestContextToOracle) {
+				this.solveNCS_BadPrediction(head);
 			}
+			
 		}
 		
 //		if (head.getCriticity(this) > head.getErrorAllowed()) {
@@ -1234,7 +1238,7 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 	
 	public void solveNCS_BetterNeighbor(Context betterContext) {
 		world.trace(new ArrayList<String>(Arrays.asList(this.getName(), betterContext.getName(), "*********************************************************************************************************** SOLVE NCS BETTER NEIGHBOR")));
-		localModel = new LocalModelMillerRegression(world, this, betterContext.getLocalModel().getCoef(), betterContext.getLocalModel().getFirstExperiments());
+		localModel = new LocalModelMillerRegression(world, this, betterContext.getLocalModel().getCoef(), betterContext.getLocalModel().getFirstExperiments()); 
 	}
 	
 	public void NCSDetection_OverMapping() {
@@ -1313,7 +1317,7 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 				modelsDifference += Math.abs(this.getLocalModel().getCoef()[i] - ctxt.getLocalModel().getCoef()[i]);
 			}
 			
-			world.trace(new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(), ""+modelsDifference, "MODELS DIFFERENCE", ""+ errorAllowed)));
+			//world.trace(new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(), ""+modelsDifference, "MODELS DIFFERENCE", ""+ errorAllowed)));
 			if(modelsDifference<errorAllowed) {
 				return true;
 			}else {
@@ -1458,7 +1462,7 @@ public class Context extends AbstractContext implements Serializable,Cloneable{
 		
 	}
 	
-	public void solveNCS_Conflict(Head head) {
+	public void solveNCS_BadPrediction(Head head) {
 
 		world.trace(new ArrayList<String>(Arrays.asList(this.getName(), "*********************************************************************************************************** SOLVE NCS CONFLICT")));
 		world.raiseNCS(NCS.CONTEXT_CONFLICT_FALSE);		
@@ -2519,7 +2523,7 @@ private AbstractPair<Percept, Context> getPerceptForAdaptationWithOverlapingCont
 
 		
 		if (head.getCriticity(this) > head.getErrorAllowed()) {
-			solveNCS_Conflict(head);
+			solveNCS_BadPrediction(head);
 			this.world.getScheduler().addAlteredContext(this);
 		}
 		else {		
diff --git a/AMOEBA3/src/mas/agents/context/Range.java b/AMOEBA3/src/mas/agents/context/Range.java
index 04f0303decf9564b0a765eaf25185cd2c2918b22..2fcf6f94f04e251f281728186009dc15060db9c2 100644
--- a/AMOEBA3/src/mas/agents/context/Range.java
+++ b/AMOEBA3/src/mas/agents/context/Range.java
@@ -391,7 +391,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 	}
 	
 	private void adaptEnd(double oracleValue, double increment) {
-		world.trace(new ArrayList<String>(Arrays.asList(""+increment, "INCREMENT")));
+		world.trace(new ArrayList<String>(Arrays.asList(""+increment, "INCREMENT"))); 
 		
 		classicEndAdapt(oracleValue, increment);
 		//adaptEndWithSplitting(oracleValue, increment);
diff --git a/AMOEBA3/src/mas/agents/head/Head.java b/AMOEBA3/src/mas/agents/head/Head.java
index b24cdd2648d0885bae546eb1fee39f6f62675e59..83d84ebd9e59ddab52893729cd48ee6ec8f8435f 100644
--- a/AMOEBA3/src/mas/agents/head/Head.java
+++ b/AMOEBA3/src/mas/agents/head/Head.java
@@ -10,6 +10,7 @@ import mas.kernel.Config;
 import mas.kernel.Launcher;
 import mas.kernel.NCSMemory;
 import mas.kernel.World;
+import mas.Quadruplet;
 import mas.agents.AbstractPair;
 import mas.agents.Agent;
 import mas.agents.percept.Percept;
@@ -311,6 +312,7 @@ public class Head extends AbstractHead implements Cloneable{
 		playExecutionTime = System.currentTimeMillis();	
 		if (activatedContexts.size() > 0) {
 			selectBestContext(); //using highest confidence 
+			//selectBestContextWithDistanceToModel();
 		}
 		else {
 			bestContext = lastUsedContext;
@@ -343,7 +345,7 @@ public class Head extends AbstractHead implements Cloneable{
 		endogenousExecutionTime = System.currentTimeMillis() - endogenousExecutionTime;
 		
 		contextSelfAnalisisExecutionTime = System.currentTimeMillis();
-		selfAnalysationOfContexts2();
+		selfAnalysationOfContexts3();
 		contextSelfAnalisisExecutionTime = System.currentTimeMillis() - contextSelfAnalisisExecutionTime;
 		
 		world.getAmoeba().PAUSE("BEFORE HEAD NCS ");
@@ -363,11 +365,11 @@ public class Head extends AbstractHead implements Cloneable{
 		create_New_ContextNCSExecutionTime = System.currentTimeMillis() - create_New_ContextNCSExecutionTime;
 		
 		overmappingNCSExecutionTime = System.currentTimeMillis();
-		NCSDetection_Context_Overmapping();
+		//NCSDetection_Context_Overmapping();
 		overmappingNCSExecutionTime = System.currentTimeMillis() - overmappingNCSExecutionTime;
 		
 		memoryCreationExecutionTime = System.currentTimeMillis();
-		//NCSMemories.add(new NCSMemory(world, new ArrayList<Context>(),"End cycle"));
+		NCSMemories.add(new NCSMemory(world, new ArrayList<Context>(),"End cycle"));
 		memoryCreationExecutionTime = System.currentTimeMillis() - memoryCreationExecutionTime;
 		
 		otherExecutionTime = System.currentTimeMillis();
@@ -1102,98 +1104,203 @@ public class Head extends AbstractHead implements Cloneable{
 	}
 	
 	private void selfAnalysationOfContexts2() {
-		////////System.out.println(world.getScheduler().getTick());
-		/*All context which proposed itself must analyze its proposition*/
-		
+
+			
 		
-		for(Context ctxt : activatedNeighborsContexts) {
+		if(activatedContexts.size()>1) {
+			selfAnalysationOfContextOnSeveralActivatedContexts();
+			
+		}else if(activatedContexts.size() == 1) {
+			
+//			double distanceToOracleForActivatedContext = activatedContexts.get(0).getLocalModel().distance(activatedContexts.get(0).getCurrentExperiment());
+//			//System.out.println(distanceToOracleForActivatedContext + " ******************************************************************DISTANCE TO MODEL : " );
+//			if(activatedNeighborsContexts.size()>1) {
+//				
+//				Context closestContextToOracle = null;
+//				double minDistanceToOraclePredictionInNeighbors = Double.POSITIVE_INFINITY;
+//				double currentDistanceToOraclePrediction = 0.0; 
+//				for(Context contextNeighbor : activatedNeighborsContexts) {
+//					if(contextNeighbor != activatedContexts.get(0)) {
+//						currentDistanceToOraclePrediction = contextNeighbor.getLocalModel().distance(contextNeighbor.getCurrentExperiment());
+//						if(currentDistanceToOraclePrediction<minDistanceToOraclePredictionInNeighbors) {
+//							minDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
+//							closestContextToOracle = contextNeighbor;
+//						} 
+//					}
+//				}
+//				
+//				if(minDistanceToOraclePredictionInNeighbors>distanceToOracleForActivatedContext) {
+//					//System.out.println("OLD COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
+//					activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
+//					//System.out.println("NEW COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
+//					
+//				}else {
+//					closestContextToOracle.solveNCS_IncompetentHead(this);
+//					//activatedContexts.get(0).setLocalModel(new LocalModelMillerRegression(world, activatedContexts.get(0), closestContextToOracle.getLocalModel().getCoef(),closestContextToOracle.getLocalModel().getFirstExperiments()));
+//					//LocalModelAgent remplacementModel = new LocalModelMillerRegression(world, activatedContexts.get(0), closestContextToOracle.getLocalModel().getCoef().clone());
+//					//activatedContexts.get(0).setLocalModel(remplacementModel);
+//					
+//				}
+//
+//				
+//			}else {
+//				//System.out.println("OLD COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
+//				activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
+//				//System.out.println("NEW COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
+//				
+//				
+//			}
+			
+			selfAnalysationOfContextOnUniqueActivatedContext();
 			
-			//ctxt.NCSDetection_BetterNeighbor();
 			
 		}
 		
 		
-		if(activatedContexts.size()>1) {
-			Context closestContextToOracle = null;
-			double minDistanceToOraclePrediction = Double.POSITIVE_INFINITY;
-			double currentDistanceToOraclePrediction = 0.0;
+		
+		for (Context ctxt : activatedNeighborsContexts) {
+
+			if(!activatedContexts.contains(ctxt)) {
+				ctxt.NCSDetection_Uselessness();
+			}
 			
+		}
+	}
+	
+	private void selfAnalysationOfContexts3() {
+
 			
+		
+		if(activatedContexts.size()>1) {
 			
-			for (Context activatedContext : activatedContexts) {
-				////////System.out.println(activatedContexts.get(i).getName());
-				currentDistanceToOraclePrediction = activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment());
-				if(currentDistanceToOraclePrediction<minDistanceToOraclePrediction) {
-					minDistanceToOraclePrediction = currentDistanceToOraclePrediction;
-					closestContextToOracle = activatedContext;
-				}
-					
-			}
+			selfAnalysationOfContextOnSeveralActivatedContexts();
 			
-			//System.out.println(closestContextToOracle.getLocalModel().distance(closestContextToOracle.getCurrentExperiment()) + " ******************************************************************DISTANCE TO MODEL : " );
-			//System.out.println("OLD COEFS " + closestContextToOracle.getLocalModel().coefsToString());
-			closestContextToOracle.getLocalModel().updateModel(closestContextToOracle.getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
-			//System.out.println("NEW COEFS " + closestContextToOracle.getLocalModel().coefsToString());
+		}else if(activatedContexts.size() == 1) {	
 			
-			activatedContextsCopyForUpdates = new ArrayList<Context>(activatedContexts);
-			for (Context activatedContext : activatedContexts) {	
-				activatedContext.analyzeResults3(this, closestContextToOracle);
-					
-			}
-			activatedContexts = activatedContextsCopyForUpdates;
+			selfAnalysationOfContextOnUniqueActivatedContext();
 			
-		}else if(activatedContexts.size() == 1) {
+		}
 			
-			double distanceToOracleForActivatedContext = activatedContexts.get(0).getLocalModel().distance(activatedContexts.get(0).getCurrentExperiment());
-			//System.out.println(distanceToOracleForActivatedContext + " ******************************************************************DISTANCE TO MODEL : " );
-			if(activatedNeighborsContexts.size()>1) {
-				
-				Context closestContextToOracle = null;
-				double minDistanceToOraclePredictionInNeighbors = Double.POSITIVE_INFINITY;
-				double currentDistanceToOraclePrediction = 0.0; 
-				for(Context contextNeighbor : activatedNeighborsContexts) {
-					if(contextNeighbor != activatedContexts.get(0)) {
-						currentDistanceToOraclePrediction = contextNeighbor.getLocalModel().distance(contextNeighbor.getCurrentExperiment());
-						if(currentDistanceToOraclePrediction<minDistanceToOraclePredictionInNeighbors) {
-							minDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
-							closestContextToOracle = contextNeighbor;
-						} 
-					}
-				}
-				
-				if(minDistanceToOraclePredictionInNeighbors>distanceToOracleForActivatedContext) {
-					//System.out.println("OLD COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
-					activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
-					//System.out.println("NEW COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
-					
-				}else {
-					//LocalModelAgent remplacementModel = new LocalModelMillerRegression(world, activatedContexts.get(0), closestContextToOracle.getLocalModel().getCoef().clone());
-					//activatedContexts.get(0).setLocalModel(remplacementModel);
-				}
+		for (Context ctxt : activatedNeighborsContexts) {
 
-				
-			}else {
-				//System.out.println("OLD COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
-				activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
-				//System.out.println("NEW COEFS " + activatedContexts.get(0).getLocalModel().coefsToString());
-				
-				
+			if(!activatedContexts.contains(ctxt)) {
+				ctxt.NCSDetection_Uselessness();
 			}
 			
-			activatedContexts.get(0).analyzeResults3(this, activatedContexts.get(0));
+		}
+	}
+
+	private void selfAnalysationOfContextOnUniqueActivatedContext() {
+		
+		
+		if(activatedNeighborsContexts.size()>0) {
+			double distanceToOracleForActivatedContext = activatedContexts.get(0).getLocalModel().distance(activatedContexts.get(0).getCurrentExperiment());
+			Quadruplet<Context, Double, Context, Double> closestAndFarestContextsToPredictionWithDistance = closestAndFarestContextsToPrediction();
 			
+			double distanceToMin = Math.abs(distanceToOracleForActivatedContext - closestAndFarestContextsToPredictionWithDistance.getB());
+			double distanceToMax = Math.abs(distanceToOracleForActivatedContext - closestAndFarestContextsToPredictionWithDistance.getD());
 			
+			if(distanceToMin<distanceToMax) {
+				world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",activatedContexts.get(0).getName(),  ""+distanceToOracleForActivatedContext)));
+				activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
+				
+			}
+		}else {
+			world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",activatedContexts.get(0).getName(),  ""+activatedContexts.get(0).getLocalModel().distance(activatedContexts.get(0).getCurrentExperiment())))); 
+			activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
 		}
 		
 		
 		
-		for (Context ctxt : activatedNeighborsContexts) {
+		//world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",activatedContexts.get(0).getName(),  ""+activatedContexts.get(0).getLocalModel().distance(activatedContexts.get(0).getCurrentExperiment())))); 
+		//activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
+		activatedContexts.get(0).analyzeResults3(this, activatedContexts.get(0));
+	}
 
-			if(!activatedContexts.contains(ctxt)) {
-				ctxt.NCSDetection_Uselessness();
+	private AbstractPair<Context, Double> maxModelDistanceToOraclePredictionInNeighbors() {
+		Context farestContextToOracle = null;
+		double maxDistanceToOraclePredictionInNeighbors = Double.NEGATIVE_INFINITY;
+		double currentDistanceToOraclePrediction = 0.0; 
+		for(Context contextNeighbor : activatedNeighborsContexts) {
+			if(contextNeighbor != activatedContexts.get(0)) {
+				currentDistanceToOraclePrediction = contextNeighbor.getLocalModel().distance(contextNeighbor.getCurrentExperiment());
+				world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",contextNeighbor.getName(),  ""+currentDistanceToOraclePrediction)));
+				if(currentDistanceToOraclePrediction>maxDistanceToOraclePredictionInNeighbors) {
+					maxDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
+					farestContextToOracle = contextNeighbor;
+				} 
+			}
+		}
+		return new AbstractPair<Context, Double>(farestContextToOracle, maxDistanceToOraclePredictionInNeighbors);
+	}
+	
+	private AbstractPair<Context, Double> minModelDistanceToOraclePredictionInNeighbors() {
+		Context closestContextToOracle = null;
+		double minDistanceToOraclePredictionInNeighbors = Double.POSITIVE_INFINITY;
+		double currentDistanceToOraclePrediction = 0.0; 
+		for(Context contextNeighbor : activatedNeighborsContexts) {
+			if(contextNeighbor != activatedContexts.get(0)) {
+				currentDistanceToOraclePrediction = contextNeighbor.getLocalModel().distance(contextNeighbor.getCurrentExperiment());
+				world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",contextNeighbor.getName(),  ""+currentDistanceToOraclePrediction)));
+				if(currentDistanceToOraclePrediction<minDistanceToOraclePredictionInNeighbors) {
+					minDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
+					closestContextToOracle = contextNeighbor;
+				} 
+			}
+		}
+		return new AbstractPair<Context, Double>(closestContextToOracle, minDistanceToOraclePredictionInNeighbors);
+	}
+	
+	private Quadruplet<Context, Double, Context, Double> closestAndFarestContextsToPrediction() {
+		Context farestContextToOracle = null;
+		double maxDistanceToOraclePredictionInNeighbors = Double.NEGATIVE_INFINITY;
+		Context closestContextToOracle = null;
+		double minDistanceToOraclePredictionInNeighbors = Double.POSITIVE_INFINITY;
+		
+		double currentDistanceToOraclePrediction = 0.0; 
+		for(Context contextNeighbor : activatedNeighborsContexts) {
+			if(contextNeighbor != activatedContexts.get(0)) {
+				currentDistanceToOraclePrediction = contextNeighbor.getLocalModel().distance(contextNeighbor.getCurrentExperiment());
+				world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",contextNeighbor.getName(),  ""+currentDistanceToOraclePrediction)));
+				if(currentDistanceToOraclePrediction>maxDistanceToOraclePredictionInNeighbors) {
+					maxDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
+					farestContextToOracle = contextNeighbor;
+				} 
+				if(currentDistanceToOraclePrediction<minDistanceToOraclePredictionInNeighbors) {
+					minDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
+					closestContextToOracle = contextNeighbor;
+				} 
 			}
+		}
+		return new Quadruplet<Context, Double, Context, Double>(closestContextToOracle, minDistanceToOraclePredictionInNeighbors, farestContextToOracle, maxDistanceToOraclePredictionInNeighbors);
+	}
+
+	private void selfAnalysationOfContextOnSeveralActivatedContexts() {
+		
+		Context closestContextToOracle = null;
+		double minDistanceToOraclePrediction = Double.POSITIVE_INFINITY;
+		double currentDistanceToOraclePrediction = 0.0;
+				
+		
+		for (Context activatedContext : activatedContexts) {
+			currentDistanceToOraclePrediction = activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment());
 			
+			world.trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",activatedContext.getName(),  ""+activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment())))); 
+			if(currentDistanceToOraclePrediction<minDistanceToOraclePrediction) {
+				minDistanceToOraclePrediction = currentDistanceToOraclePrediction;
+				closestContextToOracle = activatedContext;
+			}
+				
 		}
+		
+		closestContextToOracle.getLocalModel().updateModel(closestContextToOracle.getCurrentExperiment(),learningSpeed,numberOfPointsForRegression);
+		
+		activatedContextsCopyForUpdates = new ArrayList<Context>(activatedContexts);
+		for (Context activatedContext : activatedContexts) {	
+			activatedContext.analyzeResults3(this, closestContextToOracle);
+				
+		}
+		activatedContexts = activatedContextsCopyForUpdates;
 	}
 	
 	private void setNearestContextAsBestContext() {
@@ -1572,6 +1679,7 @@ public class Head extends AbstractHead implements Cloneable{
 
 		bc = activatedContexts.get(0);
 		double currentConfidence = bc.getConfidence();
+		
 
 		for (Context context : activatedContexts) {
 			if (context.getConfidence() > currentConfidence) {
@@ -1581,6 +1689,26 @@ public class Head extends AbstractHead implements Cloneable{
 		}
 		bestContext = bc;
 	}
+	
+	private void selectBestContextWithDistanceToModel() {
+		
+		Context bc;
+		
+
+		bc = activatedContexts.get(0);
+		double distanceToModel = bc.getLocalModel().distance(bc.getCurrentExperiment());
+		double currentDistanceToModel;
+
+		for (Context context : activatedContexts) {
+			
+			currentDistanceToModel = context.getLocalModel().distance(context.getCurrentExperiment());
+			if (currentDistanceToModel < distanceToModel) {
+				bc  = context;
+				distanceToModel = currentDistanceToModel;
+			}
+		}
+		bestContext = bc;
+	}
 
 	/**
 	 * Gets the best context.
diff --git a/AMOEBA3/src/mas/agents/localModel/LocalModelMillerRegression.java b/AMOEBA3/src/mas/agents/localModel/LocalModelMillerRegression.java
index f6a4e6491c1cc1248ed7f25e53a2b92aec81644d..36a5f60d6192611fed6be9f5d9c206de8c2f1e98 100644
--- a/AMOEBA3/src/mas/agents/localModel/LocalModelMillerRegression.java
+++ b/AMOEBA3/src/mas/agents/localModel/LocalModelMillerRegression.java
@@ -2,6 +2,7 @@ package mas.agents.localModel;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 
 import mas.kernel.World;
@@ -364,8 +365,10 @@ public class LocalModelMillerRegression extends LocalModelAgent implements Seria
 	
 	public void updateModel(Experiment newExperiment, double weight, int numberOfPointsForRegression) {
 		
+		world.trace(new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "OLD MODEL :", coefsToString()))); 
+		
 		if(firstExperiments.size()< (nParameters + 2)) {
-			firstExperiments.add(newExperiment);
+			firstExperiments.add(newExperiment); 
 			updateModel();
 			
 		}else {
@@ -373,7 +376,7 @@ public class LocalModelMillerRegression extends LocalModelAgent implements Seria
 		}
 		
 		
-		//System.out.println("FST XP " + firstExperiments.size());
+		world.trace(new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "MODEL :", coefsToString()))); 
 	}
 	
 	public void updateModel() {
@@ -625,13 +628,7 @@ public class LocalModelMillerRegression extends LocalModelAgent implements Seria
 
 	}
 	
-	public String coefsToString() {
-		String coefsString = "";
-		for(int i=0;i<coefs.length;i++) {
-			coefsString += coefs[i] + " ";
-		}
-		return coefsString;
-	}
+
 	
 	
 	public double distance(Experiment experiment) {
@@ -662,5 +659,15 @@ public class LocalModelMillerRegression extends LocalModelAgent implements Seria
 	public ArrayList<Experiment> getFirstExperiments() {
 		return firstExperiments;
 	}
+	
+	public String coefsToString() {
+		String coefsString = "";
+		if(coefs != null) {
+			for(int i=0; i<coefs.length; i ++) {
+				coefsString += coefs[i]  + "\t";
+			}
+		}
+		return coefsString;
+	}
 
 }
diff --git a/AMOEBA3/src/mas/kernel/AMOEBA.java b/AMOEBA3/src/mas/kernel/AMOEBA.java
index a1cc501d66c642865506cd3246a90a96040b9778..30c89c547ded777c5a083d152028df97990a51b0 100644
--- a/AMOEBA3/src/mas/kernel/AMOEBA.java
+++ b/AMOEBA3/src/mas/kernel/AMOEBA.java
@@ -110,7 +110,7 @@ public class AMOEBA extends Thread {
 			
 			frame.pack();
 			
-			scheduler.setView(mainPanel);	
+			scheduler.setView(mainPanel);	 
 			scheduler.setWorld(world);
 			this.setScheduler(scheduler);
 			this.start(false);
diff --git a/AMOEBA3/src/mas/kernel/Scheduler.java b/AMOEBA3/src/mas/kernel/Scheduler.java
index 295ecaf12c2b2b3a9acebffe9141b1876ed46c44..d670fecec3cd0760e831c11e157c1cdd1c20ff41 100644
--- a/AMOEBA3/src/mas/kernel/Scheduler.java
+++ b/AMOEBA3/src/mas/kernel/Scheduler.java
@@ -754,8 +754,8 @@ public class Scheduler implements Serializable{
 	public void setManualRequest(Point3 position){		
 		
 		
-		requestPosition.put("px",position.x);
-		requestPosition.put("py",position.y);
+		requestPosition.put("px1",position.x);
+		requestPosition.put("px0",position.y);
 		requestPosition.put("oracle",0.0);
 		
 		
@@ -763,7 +763,7 @@ public class Scheduler implements Serializable{
 		
 	}
 	
-	public HashMap<String, Double> getManualRequest(){				
+	public HashMap<String, Double> getManualRequest(){			 	
 		
 		manualRequest = false;
 		
diff --git a/AMOEBA3/src/mas/kernel/World.java b/AMOEBA3/src/mas/kernel/World.java
index f31c6a4e1e2fa89d7ea7ff4422cb3be270edf119..20a810276273fa4f3ecbb9c8688de3d2cc26fad7 100644
--- a/AMOEBA3/src/mas/kernel/World.java
+++ b/AMOEBA3/src/mas/kernel/World.java
@@ -75,7 +75,7 @@ public class World implements Serializable {
 	private double mappingErrorAllowed = 0.1;
 	
 	public int regressionPoints = 0;
-	
+	 
 //	private int xGraphSize = 2500;
 //	private int yGraphSize = 1500;
 	
@@ -111,11 +111,11 @@ public class World implements Serializable {
 	}
 	
 	public void trace(ArrayList<String> infos) {
-//		String message = "" +this.getScheduler().getTick();
-//		for(String info : infos) {
-//			message += " " + info;
-//		}
-//		System.out.println(message);
+		String message = "" +this.getScheduler().getTick();
+		for(String info : infos) {
+			message += " " + info;
+		}
+		System.out.println(message);
 	}
 	
 	/**
diff --git a/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelNCSMemories.java b/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelNCSMemories.java
index 02656d71d5ae9911e580487d3d7dc65e6bd0b8c3..cb84d81c98928c3a45da827d32a1c6e9ea53c85d 100644
--- a/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelNCSMemories.java
+++ b/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelNCSMemories.java
@@ -401,19 +401,19 @@ public class GrapheTwoDimPanelNCSMemories extends JPanel implements ViewerListen
 		
 		for (Context ctxt : ncsMemory.getOtherContexts()) {
 
-			drawContexts(ctxt, 50);
+			drawContexts(ctxt, 100);
 			
 		}
 		
 		for (Context ctxt : ncsMemory.getContexts()) {
 
-			drawContexts(ctxt, 200);
+			drawContexts(ctxt, 100);
 			
 		}
 		
 		for (Context ctxt : ncsMemory.getPartiallyActivatedContexts()) {
 
-			drawContexts(ctxt, 50);
+			drawContexts(ctxt, 100);
 			
 		}
 	
@@ -505,55 +505,47 @@ public class GrapheTwoDimPanelNCSMemories extends JPanel implements ViewerListen
 		}
 		
 		
+		double upperBound = 255;
+		double dispersion = 100;
+		
+		//node.addAttribute("ui.class","ContextColorDynamic");
+		//node.setAttribute("ui.color", (n.getActionProposal() - min) / (max - min) ); 
+//		node.setAttribute("ui.color", 0.0 ); 
+		
 		Double r = 0.0;
 		Double g = 0.0;
 		Double b = 0.0;
 		double[] coefs = ctxt.getLocalModel().getCoef();
 		//System.out.println("COEFS : " + coefs.length);
-		if(coefs.length>0) {
-			if(coefs.length==1) {
-				//System.out.println(coefs[0]);	
-				b = normalizePositiveValues(255, 5, Math.abs(coefs[0]));
-				if(b.isNaN()) {
-					b = 0.0;
-				}
-			}
-			else if(coefs.length==2) {
-				//System.out.println(coefs[0] + " " + coefs[1]);
-				g =  normalizePositiveValues(255, 5, Math.abs(coefs[0]));
-				b =  normalizePositiveValues(255, 5, Math.abs(coefs[1]));
-				if(g.isNaN()) {
-					g = 0.0;
-				}
-				if(b.isNaN()) {
-					b = 0.0;
-				}
+		
+		if(coefs.length>=3) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			g =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[1]));
+			b =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[2]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
+				r = 255.0;
+				g = 0.0;
+				b = 0.0;
 			}
-			else if(coefs.length>=3) {
-				//System.out.println(coefs[0] + " " + coefs[1] + " " + coefs[2]);
-				r =  normalizePositiveValues(255, 5,  Math.abs(coefs[0]));
-				g =  normalizePositiveValues(255, 5,  Math.abs(coefs[1]));
-				b =  normalizePositiveValues(255, 5,  Math.abs(coefs[2]));
-				if(r.isNaN()) {
-					r = 0.0;
-				}
-				if(g.isNaN()) {
-					g = 0.0;
-				}
-				if(b.isNaN()) {
-					b = 0.0;
-				}
+		}else if(coefs.length==2) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			g =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[1]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
+				r = 255.0;
+				g = 0.0;
 			}
-			else {
+		}else if(coefs.length==1) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
 				r = 255.0;
-				g = 255.0;
-				b = 255.0;
 			}
-		}
-		else {
-			r = 255.0;
+		}else {
+			r = 0.0;
 			g = 255.0;
-			b = 255.0;
+			b = 0.0;
 		}
 		
 		node.addAttribute("ui.class","RGBAColor");
diff --git a/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelStandard.java b/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelStandard.java
index 1bf6898be536dd7ba48aff5d6949eb1cafc89b05..443927514afefa22fbb5e95ab2f9714b0bfcf2c7 100644
--- a/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelStandard.java
+++ b/AMOEBA3/src/visualization/view/system/twoDim/GrapheTwoDimPanelStandard.java
@@ -1607,6 +1607,9 @@ private void startPanelController() {
 
 				Node node = graph.getNode(name);
 
+				double upperBound = 255;
+				double dispersion = 100;
+				
 				//node.addAttribute("ui.class","ContextColorDynamic");
 				//node.setAttribute("ui.color", (n.getActionProposal() - min) / (max - min) ); 
 //				node.setAttribute("ui.color", 0.0 ); 
@@ -1616,52 +1619,41 @@ private void startPanelController() {
 				Double b = 0.0;
 				double[] coefs = n.getLocalModel().getCoef();
 				//System.out.println("COEFS : " + coefs.length);
-				if(coefs.length>0) {
-					if(coefs.length==1) {
-						//System.out.println(coefs[0]);	
-						b = normalizePositiveValues(255, 5, Math.abs(coefs[0]));
-						if(b.isNaN()) {
-							b = 0.0;
-						}
-					}
-					else if(coefs.length==2) {
-						//System.out.println(coefs[0] + " " + coefs[1]);
-						g =  normalizePositiveValues(255, 5, Math.abs(coefs[0]));
-						b =  normalizePositiveValues(255, 5, Math.abs(coefs[1]));
-						if(g.isNaN()) {
-							g = 0.0;
-						}
-						if(b.isNaN()) {
-							b = 0.0;
-						}
+				
+				if(coefs.length>=3) {
+					r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+					g =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[1]));
+					b =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[2]));
+					
+					if(r.isNaN() || g.isNaN() || b.isNaN()) {
+						r = 255.0;
+						g = 0.0;
+						b = 0.0;
 					}
-					else if(coefs.length>=3) {
-						//System.out.println(coefs[0] + " " + coefs[1] + " " + coefs[2]);
-						r =  normalizePositiveValues(255, 5,  Math.abs(coefs[0]));
-						g =  normalizePositiveValues(255, 5,  Math.abs(coefs[1]));
-						b =  normalizePositiveValues(255, 5,  Math.abs(coefs[2]));
-						if(r.isNaN()) {
-							r = 0.0;
-						}
-						if(g.isNaN()) {
-							g = 0.0;
-						}
-						if(b.isNaN()) {
-							b = 0.0;
-						}
+				}else if(coefs.length==2) {
+					r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+					g =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[1]));
+					
+					if(r.isNaN() || g.isNaN() || b.isNaN()) {
+						r = 255.0;
+						g = 0.0;
 					}
-					else {
+				}else if(coefs.length==1) {
+					r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+					
+					if(r.isNaN() || g.isNaN() || b.isNaN()) {
 						r = 255.0;
-						g = 255.0;
-						b = 255.0;
 					}
-				}
-				else {
-					r = 255.0;
+				}else {
+					r = 0.0;
 					g = 255.0;
-					b = 255.0;
+					b = 0.0;
 				}
 				
+
+				
+				
+				
 				node.addAttribute("ui.class","RGBAColor");
 				
 				node.addAttribute("ui.style", "fill-color: rgba(" + r.intValue() + "," + g.intValue() + "," + b.intValue() + ",100);");