From cfcdc97703aad3a38a9400954a26fe81aec4c755 Mon Sep 17 00:00:00 2001 From: BrunoDatoMeneses <bruno.dato.meneses@gmail.com> Date: Tue, 4 Jun 2019 13:43:25 +0200 Subject: [PATCH] ADD: n dim launcher and stability XP on regression --- AMOEBA3/Ressources/nDimensionLauncher.xml | 1 - AMOEBA3/src/experiments/FILE.java | 13 + .../experiments/Regression/F_N_Launcher.java | 8 +- .../Regression/RegressionManager.java | 144 ++++++++++ .../experiments/Regression/StabilityXP.java | 130 +++++++++ .../src/experiments/XmlConfigGenerator.java | 3 +- .../src/experiments/nDimensionLauncher.xml | 19 ++ .../nDimensionsLaunchers/F_N_Launcher.java | 14 +- .../nDimensionsLaunchers/F_N_Manager.java | 69 ++++- .../twoDimensionsLaunchers/F_XY_Launcher.java | 2 +- .../twoDimensionsLaunchers/F_XY_Manager.java | 6 +- AMOEBA3/src/mas/Pair.java | 30 ++ AMOEBA3/src/mas/Quadruplet.java | 50 ++++ AMOEBA3/src/mas/Triplet.java | 40 +++ AMOEBA3/src/mas/agents/context/Context.java | 20 +- AMOEBA3/src/mas/agents/context/Range.java | 2 +- AMOEBA3/src/mas/agents/head/Head.java | 266 +++++++++++++----- .../LocalModelMillerRegression.java | 25 +- AMOEBA3/src/mas/kernel/AMOEBA.java | 2 +- AMOEBA3/src/mas/kernel/Scheduler.java | 6 +- AMOEBA3/src/mas/kernel/World.java | 12 +- .../twoDim/GrapheTwoDimPanelNCSMemories.java | 76 +++-- .../twoDim/GrapheTwoDimPanelStandard.java | 70 ++--- 23 files changed, 802 insertions(+), 206 deletions(-) create mode 100644 AMOEBA3/src/experiments/Regression/RegressionManager.java create mode 100644 AMOEBA3/src/experiments/Regression/StabilityXP.java create mode 100644 AMOEBA3/src/experiments/nDimensionLauncher.xml create mode 100644 AMOEBA3/src/mas/Pair.java create mode 100644 AMOEBA3/src/mas/Quadruplet.java create mode 100644 AMOEBA3/src/mas/Triplet.java diff --git a/AMOEBA3/Ressources/nDimensionLauncher.xml b/AMOEBA3/Ressources/nDimensionLauncher.xml index c5c4f1d0..53bafe46 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 0eb7a1dc..f77dfc4b 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 bdd212a3..08d980cd 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 00000000..46f815e0 --- /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 00000000..786ffa69 --- /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 ef35c668..00f5086a 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 00000000..147a1f45 --- /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 ffe39ef4..9c8ff701 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 5deb8c40..4ed2f187 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 df0b2af9..171cf033 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 70984b25..65b8ab02 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 00000000..d6dc4ceb --- /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 00000000..3491f2dc --- /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 00000000..273d1ed3 --- /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 15b43103..2986cccb 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 04f0303d..2fcf6f94 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 b24cdd26..83d84ebd 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 f6a4e649..36a5f60d 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 a1cc501d..30c89c54 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 295ecaf1..d670fece 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 f31c6a4e..20a81027 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 02656d71..cb84d81c 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 1bf6898b..44392751 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);"); -- GitLab