From db2ec0e81ddc98e23ea5ea8d2767567529f890ea Mon Sep 17 00:00:00 2001
From: BrunoDatoMeneses <bruno.dato.meneses@gmail.com>
Date: Tue, 9 Jul 2019 19:39:44 +0200
Subject: [PATCH] STAT: before neOCampus day 2019

---
 AMOEBAonAMAK/src/agents/context/Context.java  | 83 ++++++++++++++++++-
 AMOEBAonAMAK/src/agents/context/Range.java    | 11 ++-
 AMOEBAonAMAK/src/agents/head/Head.java        | 62 ++++++++++----
 AMOEBAonAMAK/src/agents/percept/Percept.java  |  2 +-
 .../src/experiments/UnityLauncher/Main.java   | 11 +--
 .../src/experiments/UnityLauncher/Sender.java |  4 +-
 .../UnityLauncher/SocketServer.java           |  4 +-
 .../nDimensionsLaunchers/F_N_Manager.java     |  2 +-
 AMOEBAonAMAK/src/kernel/World.java            |  2 +-
 9 files changed, 147 insertions(+), 34 deletions(-)

diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java
index 82040098..848d7ba1 100644
--- a/AMOEBAonAMAK/src/agents/context/Context.java
+++ b/AMOEBAonAMAK/src/agents/context/Context.java
@@ -86,6 +86,7 @@ public class Context extends AmoebaAgent {
 		
 		regressionPerformance = new DynamicPerformance(successesBeforeDiminution, errorsBeforeAugmentation, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), augmentationFactorError, diminutionFactorError, minError);
 		getAmas().getEnvironment().trace(TRACE_LEVEL.EVENT,new ArrayList<String>(Arrays.asList("CTXT CREATION", this.getName())));
+		getAmas().addSpatiallyAlteredContextForUnityUI(this);
 	}
 
 	public Context(AMOEBA amoeba, Context bestNearestContext) {
@@ -96,6 +97,8 @@ public class Context extends AmoebaAgent {
 		criticalities = new Criticalities(5);
 		
 		regressionPerformance = new DynamicPerformance(successesBeforeDiminution, errorsBeforeAugmentation, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), augmentationFactorError, diminutionFactorError, minError);
+		getAmas().addSpatiallyAlteredContextForUnityUI(this);
+		
 		//TODO in amak, cannot kill a agent before its 1st cycle
 		//NCSDetection_Uselessness();
 
@@ -819,7 +822,7 @@ public class Context extends AmoebaAgent {
 			
 
 			if (currentDistance > pct.getMappingErrorAllowedMin()) {
-				getEnvironment().trace(TRACE_LEVEL.DEBUG,new ArrayList<String>(Arrays.asList("VOID",pct.getName(), ""+this,""+ctxt)) );
+				getEnvironment().trace(TRACE_LEVEL.DEBUG,new ArrayList<String>(Arrays.asList("VOID",pct.getName(), ""+this,""+ctxt, "distance", ""+currentDistance)) );
 				voidDistances.put(pct, currentDistance);
 				bounds.put(pct, this.voidBounds(ctxt, pct));
 			}
@@ -2277,6 +2280,9 @@ public class Context extends AmoebaAgent {
 	public void destroy() {
 		getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(
 				Arrays.asList("-----------------------------------------", this.getName(), "DIE")));
+		
+		getAmas().addToKillContextForUnityUI(this);
+		
 		for (Context ctxt : getAmas().getContexts()) {
 			ctxt.removeContext(this);
 		}
@@ -2367,4 +2373,79 @@ public class Context extends AmoebaAgent {
 		return regressionPerformance.getPerformanceIndicator();
 	}
 	
+	
+	
+	
+	/**
+	 * Compute the color of a {@link Context} based on the coefficients of its {@link LocalModel}
+	 * @param coefs
+	 * @return
+	 */
+	public String getColorForUnity() {
+		
+		Double[] coefs = localModel.getCoef();
+		
+		double upperBound = 255;
+		double dispersion = 100;
+		
+		
+		Double r = 0.0;
+		Double g = 0.0;
+		Double 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==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 if(coefs.length==1) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
+				r = 255.0;
+			}
+		}else {
+			r = 0.0;
+			g = 255.0;
+			b = 0.0;
+		}
+		
+		
+		Double[] ret = new Double[3];
+		ret[0] = r / 255.0d;
+		ret[1] = g / 255.0d;
+		ret[2] = b / 255.0d;
+		
+		return ret[0] + "," + ret[1] + "," + ret[2] + ",100";
+	}
+	
+	public static double normalizePositiveValues(double upperBound, double dispersion, double value) {
+		return upperBound * 2 * (-0.5 + 1 / (1 + Math.exp(-value / dispersion)));
+	}
+	
+	public boolean isFlat() {
+		for(Percept pct:getAmas().getPercepts()) {
+			if(ranges.get(pct).getLenght()<0.00001) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
 }
diff --git a/AMOEBAonAMAK/src/agents/context/Range.java b/AMOEBAonAMAK/src/agents/context/Range.java
index 7642c27f..4732abce 100644
--- a/AMOEBAonAMAK/src/agents/context/Range.java
+++ b/AMOEBAonAMAK/src/agents/context/Range.java
@@ -797,6 +797,9 @@ public class Range implements Serializable, Comparable, Cloneable {
 	 */
 	public boolean isTooSmall() {
 		
+		if((end - start) < percept.getMappingErrorAllowedMin()) {
+			world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.context.getName(), this.percept.getName(), "TOO SMALL DISTANCE", "" + (end - start))));
+		}
 
 		return ((end - start) < percept.getMappingErrorAllowedMin()) && !this.isPerceptEnum();
 	}
@@ -1498,8 +1501,8 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			
 
-			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContext().contains(this.context)) {
-				context.getAmas().addSpatiallyAlteredContext(this.context);
+			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContextForUnityUI().contains(this.context)) {
+				context.getAmas().addSpatiallyAlteredContextForUnityUI(this.context);
 			}
 		}
 
@@ -1563,8 +1566,8 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			
 
-			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContext().contains(this.context)) {
-				context.getAmas().addSpatiallyAlteredContext(this.context);
+			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContextForUnityUI().contains(this.context)) {
+				context.getAmas().addSpatiallyAlteredContextForUnityUI(this.context);
 			}
 		}
 
diff --git a/AMOEBAonAMAK/src/agents/head/Head.java b/AMOEBAonAMAK/src/agents/head/Head.java
index bd2afe64..a502cbb1 100644
--- a/AMOEBAonAMAK/src/agents/head/Head.java
+++ b/AMOEBAonAMAK/src/agents/head/Head.java
@@ -218,7 +218,7 @@ public class Head extends AmoebaAgent {
 
 	private void playWithOracle() {
 
-		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("\n------------------------------------------------------------------------------------"
 				+ "---------------------------------------- PLAY WITH ORACLE")));
 		
 		
@@ -250,6 +250,8 @@ public class Head extends AmoebaAgent {
 					"*********************************************************************************************************** BEST CONTEXT")));
 		}
 
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 1", "" + (bestContext != null))));
+		
 		executionTimes[0]=System.currentTimeMillis()- executionTimes[0];
 
 		executionTimes[1]=System.currentTimeMillis();
@@ -260,6 +262,7 @@ public class Head extends AmoebaAgent {
 		selfAnalysationOfContexts4();
 		executionTimes[2]=System.currentTimeMillis()- executionTimes[2];
 		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 2", "" + (bestContext != null))));
 
 		executionTimes[3]=System.currentTimeMillis();
 		NCSDetection_IncompetentHead(); /*
@@ -268,7 +271,8 @@ public class Head extends AmoebaAgent {
 		 */
 		executionTimes[3]=System.currentTimeMillis()- executionTimes[3];
 		
-
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 3", "" + (bestContext != null))));
+		
 		executionTimes[4]=System.currentTimeMillis();
 		NCSDetection_Concurrence(); /* If result is good, shrink redundant context (concurrence NCS) */
 		executionTimes[4]=System.currentTimeMillis()- executionTimes[4];
@@ -287,7 +291,7 @@ public class Head extends AmoebaAgent {
 		NCSDetection_ChildContext();
 		
 		//if(getAmas().getCycle()>1000)
-		NCSDetection_PotentialRequest();
+		//NCSDetection_PotentialRequest();
 		
 		criticalities.addCriticality("spatialCriticality",
 				(getMinMaxVolume() - getVolumeOfAllContexts()) / getMinMaxVolume());
@@ -970,11 +974,24 @@ public class Head extends AmoebaAgent {
 		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
 				+ "---------------------------------------- NCS DETECTION CONCURRENCE")));
 		
+		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null", "" + (bestContext != null))));
+		
+		if(bestContext != null) {
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()", "" + (bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator() ))));
+			
+		}
+		
+
 		/* If result is good, shrink redundant context (concurrence NCS) */
 		if (bestContext != null && bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()) {
 		//if (bestContext != null && criticity <= predictionPerformance.getPerformanceIndicator()) {
 
 				for (int i = 0; i<activatedContexts.size();i++) {
+					
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("activatedContexts.get(i) != bestContext", "" + ( activatedContexts.get(i) != bestContext))));
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("!activatedContexts.get(i).isDying()", "" + ( !activatedContexts.get(i).isDying()))));
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("", "" + ( activatedContexts.get(i).getLocalModel().distance(activatedContexts.get(i).getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()))));
 
 					if (activatedContexts.get(i) != bestContext && !activatedContexts.get(i).isDying() && activatedContexts.get(i).getLocalModel().distance(activatedContexts.get(i).getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()) {
 		
@@ -993,16 +1010,24 @@ public class Head extends AmoebaAgent {
 		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
 				+ "---------------------------------------- NCS DETECTION INCOMPETENT HEAD")));
 		
-		
-		if (activatedContexts.isEmpty()
-				|| (criticity > predictionPerformance.getPerformanceIndicator() && !oneOfProposedContextWasGood())) {
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 22", "" + (bestContext != null))));
+		if(activatedContexts.isEmpty()	|| ((bestContext.getLocalModel().distance(bestContext.getCurrentExperiment())) > bestContext.regressionPerformance.getPerformanceIndicator() && !oneOfProposedContextWasGood())) {
 
+			
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 23", "" + (bestContext != null))));
 			Context c = getNearestGoodContext(activatedNeighborsContexts);
 			// Context c = getSmallestGoodContext(activatedNeighborsContexts);
 
-			if (c != null)
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 24", "" + (bestContext != null))));
+			
+			if (c != null) {
 				c.solveNCS_IncompetentHead(this);
+			}
+				
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 25", "" + (bestContext != null))));
 			bestContext = c;
+			
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 26", "" + (bestContext != null))));
 
 			/* This allow to test for all contexts rather than the nearest */
 			/*
@@ -1199,22 +1224,24 @@ public class Head extends AmoebaAgent {
 
 		}
 
-		activatedContextsCopyForUpdates = new ArrayList<Context>(activatedContexts);
-		for (Context activatedContext : activatedContexts) {
+		
+		
+		for (int i = 0; i< activatedContexts.size() ; i++) {
 			
-			activatedContext.criticalities.updateMeans();
+			activatedContexts.get(i).criticalities.updateMeans();
 			
-			if (activatedContext.criticalities.getCriticalityMean("distanceToRegression") != null) {
-				activatedContext.regressionPerformance.update(activatedContext.criticalities.getCriticalityMean("distanceToRegression"));
-				getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("UPDATE REGRESSION PERFORMANCE", activatedContext.getName(), ""+activatedContext.regressionPerformance.getPerformanceIndicator())));
+			if (activatedContexts.get(i).criticalities.getCriticalityMean("distanceToRegression") != null) {
+				activatedContexts.get(i).regressionPerformance.update(activatedContexts.get(i).criticalities.getCriticalityMean("distanceToRegression"));
+				getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("UPDATE REGRESSION PERFORMANCE", activatedContexts.get(i).getName(), ""+activatedContexts.get(i).regressionPerformance.getPerformanceIndicator())));
 			}
 			
 			
-			activatedContext.analyzeResults4(this);
+			activatedContexts.get(i).analyzeResults4(this);
 
 		}
-		activatedContexts = activatedContextsCopyForUpdates;
+		
 
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("NCS DECTECTION USELESSNESS IN SELF ANALISIS")));
 		for (Context ctxt : activatedNeighborsContexts) {
 
 			if (!activatedContexts.contains(ctxt)) {
@@ -2500,7 +2527,7 @@ public class Head extends AmoebaAgent {
 	
 	public Double getAverageRegressionPerformanceIndicator() {
 		
-		
+		int numberOfRegressions = 0;
 		if(activatedNeighborsContexts.size()>0) {
 			double meanRegressionPerformanceIndicator = 0.0;
 			
@@ -2509,12 +2536,13 @@ public class Head extends AmoebaAgent {
 
 				if(ctxt.regressionPerformance != null) {
 					meanRegressionPerformanceIndicator += ctxt.regressionPerformance.performanceIndicator;
+					numberOfRegressions+=1;
 				}
 				
 				
 			}
 			
-			return meanRegressionPerformanceIndicator/activatedNeighborsContexts.size();
+			return meanRegressionPerformanceIndicator/numberOfRegressions;
 		}
 		else{
 			return initRegressionPerformance;
diff --git a/AMOEBAonAMAK/src/agents/percept/Percept.java b/AMOEBAonAMAK/src/agents/percept/Percept.java
index a0ff995d..60c5ff28 100644
--- a/AMOEBAonAMAK/src/agents/percept/Percept.java
+++ b/AMOEBAonAMAK/src/agents/percept/Percept.java
@@ -620,7 +620,7 @@ public class Percept extends AmoebaAgent {
 	}
 	
 	public double getMappingErrorAllowedMin() {
-		return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 0.5;
+		return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 0.4;
 	}
 	
 	public double getMappingErrorAllowedOverMapping() {
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java
index d1af7d0c..43b8991d 100644
--- a/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java
@@ -30,13 +30,13 @@ public class Main implements Runnable {
 	public static final double spaceSize = 50.0	;
 	public static final int nbOfModels = 3	;
 	public static final int normType = 2	;
-	public static final boolean randomExploration = true;
+	public static final boolean randomExploration = false;
 	public static final boolean limitedToSpaceZone = true;
 	public static final double mappingErrorAllowed = 0.03;
 	public static final double explorationIncrement = 1.0	;
 	public static final double explorationWidht = 0.5	;
 	
-	public static final int nbCycle = 1000;
+	public static final int nbCycle = 10000;
 	
 	private SocketServer server;
 	
@@ -76,7 +76,7 @@ public class Main implements Runnable {
 		Configuration.commandLineMode = false;
 		Configuration.allowedSimultaneousAgentsExecution = 1;
 		Configuration.waitForGUI = true;
-		Configuration.plotMilliSecondsUpdate = 10000;
+		Configuration.plotMilliSecondsUpdate = 20000;
 		
 		AMOEBA amoeba = new AMOEBA();
 		StudiedSystem studiedSystem = new F_N_Manager(spaceSize, dimension, nbOfModels, normType, randomExploration, explorationIncrement,explorationWidht,limitedToSpaceZone);
@@ -85,6 +85,7 @@ public class Main implements Runnable {
 		File file = new File("resources/threeDimensionsLauncherUnity.xml");
 		backupSystem.load(file);
 		
+		
 		amoeba.saver = new SaveHelper(amoeba);
 		amoeba.allowGraphicalScheduler(true);
 		amoeba.setRenderUpdate(true);		
@@ -129,7 +130,7 @@ public class Main implements Runnable {
 				while (!sender.acq("CTXTS", amoeba.getCycle())) {
 					try        
 					{
-					    Thread.sleep(100);
+					    Thread.sleep(10);
 					} 
 					catch(InterruptedException ex) 
 					{
@@ -145,7 +146,7 @@ public class Main implements Runnable {
 				while (!sender.acq("KILL", amoeba.getCycle())) {
 					try        
 					{
-					    Thread.sleep(100);
+					    Thread.sleep(10);
 					} 
 					catch(InterruptedException ex) 
 					{
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java
index fb5832f8..583fd1c3 100644
--- a/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java
@@ -36,7 +36,7 @@ public class Sender {
 			
 			
 		}
-		System.out.println(message);
+		//System.out.println(message);
 		server.sendMessage(message);
 	}
 	
@@ -48,7 +48,7 @@ public class Sender {
 			
 			
 		}
-		System.out.println(message);
+		//System.out.println(message);
 		server.sendMessage(message);
 	}
 	
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java
index f6143ced..145587d2 100644
--- a/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java
@@ -29,7 +29,7 @@ public class SocketServer {
 			// out.close();
 
 		} catch (IOException e) {
-			System.err.println("D�connection ");
+			System.err.println("D�connection ");
 		}
 
 	}
@@ -53,7 +53,7 @@ public class SocketServer {
 		}
 		
 		counter ++;
-		System.out.println("MSG :\t" + message);
+		//System.out.println("MSG :\t" + message);
 		String delimsTags = "[ _~]+";
 		String[] tokens = message.split(delimsTags);
 		
diff --git a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java
index d4dd9746..44f17659 100644
--- a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java
+++ b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java
@@ -441,7 +441,7 @@ private double[] subZoneCenter3D(int nb) {
 		
 		for(int nb = 0; nb<numberOfModels-1; nb++) {
 			
-			if(distance(xRequest,modelCenterZones[nb]) < spaceSize/2) {
+			if(distance(xRequest,modelCenterZones[nb]) < spaceSize*0.75) {
 				return modeli(nb, xRequest);
 			}
 			
diff --git a/AMOEBAonAMAK/src/kernel/World.java b/AMOEBAonAMAK/src/kernel/World.java
index 5fe709fe..e248a189 100644
--- a/AMOEBAonAMAK/src/kernel/World.java
+++ b/AMOEBAonAMAK/src/kernel/World.java
@@ -34,7 +34,7 @@ public class World extends Environment {
 	
 	
 	
-	public static TRACE_LEVEL minLevel = TRACE_LEVEL.DEBUG;
+	public static TRACE_LEVEL minLevel = TRACE_LEVEL.ERROR;
 	
 	private AMOEBA amoeba;
 
-- 
GitLab