diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java index 82040098ea00eb8f3a6b9fb72095110d71c70da4..848d7ba1b2875546e4c16d8b60339354c981ece3 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 7642c27ffe1e101b08775bbfdaeb144127e5ca3f..4732abce35a184aea31dc1ba1554a20410e831ec 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 bd2afe649ac45cfd6b0e034874fc7b64311b292a..a502cbb146a9da0df70560e7ab45641c97941cd8 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 a0ff995d8e5b8555b9ce0d46fe527f33194efc94..60c5ff28f4584c378c46df26b4b8882c7af82391 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 d1af7d0c22c5880f1b3f202e8b65ba996ebb53ba..43b8991db9489400d1dc10e5701bba2338c2fefb 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 fb5832f84555b420a9311e8dc4de9228c540f7b4..583fd1c3bac535aa98b59aec6820f9b4c81793f0 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 f6143cedf79383b5c682e047e7bc659808834f28..145587d28cb3d00784af81d1acc9109b7adca5f8 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 d4dd97466e8c86522557a29e07625d08845bd6ef..44f17659e94c4158cb169a9b2a48759d6eaee801 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 5fe709fea42dfd30530f773a93033cd64684e139..e248a189449055d43fff29bc5ac33ff3d1e90fdf 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;