diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java index 88874e808b1ba630112262acb8afd818135263b2..0fcecfa9fbc57ae0ab4909d32b03adc49cf8319b 100644 --- a/AMOEBAonAMAK/src/agents/context/Context.java +++ b/AMOEBAonAMAK/src/agents/context/Context.java @@ -111,9 +111,19 @@ public class Context extends AmoebaAgent { Range r; //Pair<Double, Double> radiuses = getAmas().getHeadAgent().getMaxRadiusesForContextCreation(p); + //TODO use neihbors sizes to define radiuses for creation !!!!!!!!!!! Pair<Double, Double> radiuses = getAmas().getHeadAgent().getRadiusesForContextCreation(p); - r = new Range(this, p.getValue() - radiuses.getA(), p.getValue() + radiuses.getB(), 0, true, true, p); + if(getAmas().data.meanNeighborhoodRaduises != null) { + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("Range creation by mean", this.getName(), p.getName(), getAmas().data.meanNeighborhoodRaduises.get(p).toString()))); + r = new Range(this, p.getValue() - getAmas().data.meanNeighborhoodRaduises.get(p), p.getValue() + getAmas().data.meanNeighborhoodRaduises.get(p), 0, true, true, p, getAmas().data.meanNeighborhoodStartIncrements.get(p), getAmas().data.meanNeighborhoodEndIncrements.get(p)); + }else { + r = new Range(this, p.getValue() - radiuses.getA(), p.getValue() + radiuses.getB(), 0, true, true, p); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("Range creation by init", this.getName(), p.getName(), radiuses.getA().toString()))); + } + // r = new Range(this, v.getValue() - radius, v.getValue() + radius, 0, true, // true, v, world); @@ -179,20 +189,29 @@ public class Context extends AmoebaAgent { Experiment firstPoint = new Experiment(this); ArrayList<Percept> var = getAmas().getPercepts(); - for (Percept v : var) { + for (Percept p : var) { Range r; //Pair<Double, Double> radiuses = getAmas().getHeadAgent().getMaxRadiusesForContextCreation(v); - Pair<Double, Double> radiuses = getAmas().getHeadAgent().getRadiusesForContextCreation(v); + //TODO use neihbors sizes to define radiuses for creation !!!!!!!!!!! + Pair<Double, Double> radiuses = getAmas().getHeadAgent().getRadiusesForContextCreation(p); - r = new Range(this, v.getValue() - radiuses.getA(), v.getValue() + radiuses.getB(), 0, true, true, v); + if(getAmas().data.meanNeighborhoodRaduises != null) { + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("Range creation by mean", this.getName(), p.getName(), getAmas().data.meanNeighborhoodRaduises.get(p).toString()))); + r = new Range(this, p.getValue() - getAmas().data.meanNeighborhoodRaduises.get(p), p.getValue() + getAmas().data.meanNeighborhoodRaduises.get(p), 0, true, true, p, getAmas().data.meanNeighborhoodStartIncrements.get(p), getAmas().data.meanNeighborhoodEndIncrements.get(p)); + }else { + r = new Range(this, p.getValue() - radiuses.getA(), p.getValue() + radiuses.getB(), 0, true, true, p); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("Range creation by init", this.getName(), p.getName(), radiuses.getA().toString()))); + } - ranges.put(v, r); - ranges.get(v).setValue(v.getValue()); + ranges.put(p, r); + ranges.get(p).setValue(p.getValue()); - firstPoint.addDimension(v, v.getValue()); + firstPoint.addDimension(p, p.getValue()); - v.addContextProjection(this);; + p.addContextProjection(this);; } //expand(); diff --git a/AMOEBAonAMAK/src/agents/context/Range.java b/AMOEBAonAMAK/src/agents/context/Range.java index 5c50499b190b270bb394e0ec81e9e8935449329c..9a5b5d074c70c536628e211a473aa823c3c37173 100644 --- a/AMOEBAonAMAK/src/agents/context/Range.java +++ b/AMOEBAonAMAK/src/agents/context/Range.java @@ -129,6 +129,48 @@ public class Range implements Serializable, Comparable, Cloneable { startIncrement = 0.25 * world.getMappingErrorAllowed() * percept.getMinMaxDistance(); endIncrement = startIncrement; } + + public Range(Context context, double start, double end, double extendedrangeatcreation, boolean start_inclu, + boolean end_inclu, Percept p, double startIncr, double endIncr) { + super(); + + world = context.getAmas().getEnvironment(); + + AVT_deceleration = world.getAVT_deceleration(); + AVT_acceleration = world.getAVT_acceleration(); + AVT_minRatio = world.getAVT_percentAtStart(); + + this.percept = p; + if (isPerceptEnum()) { + this.setStart_inclu(start_inclu); + this.setEnd_inclu(end_inclu); + this.setStart(Math.round(start)); + this.setEnd(Math.round(end)); + } else { + this.setStart_inclu(start_inclu); + this.setEnd_inclu(end_inclu); + this.setStart(start - Math.abs(extendedrangeatcreation * start)); + this.setEnd(end + Math.abs(extendedrangeatcreation * end)); + } + this.context = context; + id = maxid; + maxid++; + + /* Initialization of AVT : a better way to do that should be developped */ +// this.AVT_deltaStart = (end - start) * AVT_minRatio + 0.0001; +// this.AVT_deltaEnd = (end - start) * AVT_minRatio + 0.0001; + this.AVT_deltaStart = getLenght() * 0.2 + 0.0001; + this.AVT_deltaEnd = getLenght() * 0.2 + 0.0001; + ////// System.out.println(world.getScheduler().getTick() + "\t" + + ////// context.getName() + "\t" + percept.getName()+ "\t" + "Creation" + "\t" + + ////// "START" + "\t" + AVT_deltaStart); + ////// System.out.println(world.getScheduler().getTick() + "\t" + + ////// context.getName() + "\t" + percept.getName()+ "\t" + "Creation" + "\t" + + ////// "END" + "\t" + AVT_deltaEnd); + + startIncrement =startIncr; + endIncrement = endIncr; + } /** * Extends the range to the specified target value. @@ -389,7 +431,7 @@ public class Range implements Serializable, Comparable, Cloneable { lastEndDirection = -1; // shrinking direction if (endCriticality == 1) { // negative feedback -> increment decreases - endIncrement /= 2; + endIncrement /= 3; } else if (endCriticality == 0) { // positive feedback -> increment increases endIncrement = Math.min(percept.getRadiusContextForCreation(), endIncrement * 2); // endIncrement *=2; @@ -574,7 +616,7 @@ public class Range implements Serializable, Comparable, Cloneable { lastStartDirection = -1; if (startCriticality == 1) { - startIncrement /= 2; + startIncrement /= 3; } else if (startCriticality == 0) { startIncrement = Math.min(percept.getRadiusContextForCreation(), startIncrement * 2); // startIncrement *=2; @@ -1636,5 +1678,13 @@ public class Range implements Serializable, Comparable, Cloneable { return this.contains(percept.getValue(), context.getEnvironment().getContextCreationNeighborhood(context, percept)) || this.contains(percept.getValue(), context.getEnvironment().getContextCreationNeighborhood(context, percept)); } + + public double getStartIncrement() { + return startIncrement; + } + + public double getEndIncrement() { + return endIncrement; + } } diff --git a/AMOEBAonAMAK/src/agents/head/Head.java b/AMOEBAonAMAK/src/agents/head/Head.java index 2202cdbdf03e3b618615e0a74da54c6d29290e83..d43646b7668fd0c6bd24a71f4a89eaa0a93567ba 100644 --- a/AMOEBAonAMAK/src/agents/head/Head.java +++ b/AMOEBAonAMAK/src/agents/head/Head.java @@ -16,6 +16,7 @@ import agents.context.CustomComparator; import agents.context.Experiment; import agents.percept.Percept; import kernel.AMOEBA; +import kernel.AmoebaData; import ncs.NCS; import utils.Pair; import utils.PrintOnce; @@ -77,6 +78,11 @@ public class Head extends AmoebaAgent { @Override public void onAct() { + getAmas().data.meanNeighborhoodVolume = null; + getAmas().data.meanNeighborhoodRaduises = null; + getAmas().data.meanNeighborhoodEndIncrements = null; + getAmas().data.meanNeighborhoodStartIncrements = null; + getAmas().data.currentCriticalityPrediction = 0; getAmas().data.currentCriticalityMapping = 0; getAmas().data.currentCriticalityConfidence = 0; @@ -115,6 +121,16 @@ public class Head extends AmoebaAgent { int nb=0; Double meanNeighborsLastPredictions = null; + double neighborhoodVolumesSum = 0; + HashMap<Percept,Double> neighborhoodRangesSums = new HashMap<Percept,Double>(); + HashMap<Percept,Double> neighborhoodStartIncrementSums = new HashMap<Percept,Double>(); + HashMap<Percept,Double> neighborhoodEndIncrementSums = new HashMap<Percept,Double>(); + for (Percept pct : getAmas().getPercepts()) { + neighborhoodRangesSums.put(pct, 0.0); + neighborhoodStartIncrementSums.put(pct, 0.0); + neighborhoodEndIncrementSums.put(pct, 0.0); + } + ArrayList<Context> usedNeighbors = new ArrayList<Context>(); @@ -122,6 +138,13 @@ public class Head extends AmoebaAgent { meanNeighborsLastPredictions = 0.0; for (Context ctxt : activatedNeighborsContexts) { + + neighborhoodVolumesSum += ctxt.getVolume(); + for (Percept pct : ctxt.getRanges().keySet()) { + neighborhoodRangesSums.put(pct, neighborhoodRangesSums.get(pct) + ctxt.getRanges().get(pct).getRadius()); + neighborhoodStartIncrementSums.put(pct, neighborhoodStartIncrementSums.get(pct) + ctxt.getRanges().get(pct).getStartIncrement()); + neighborhoodEndIncrementSums.put(pct, neighborhoodEndIncrementSums.get(pct) + ctxt.getRanges().get(pct).getEndIncrement()); + } if(ctxt.lastPrediction != null) { usedNeighbors.add(ctxt); @@ -135,8 +158,28 @@ public class Head extends AmoebaAgent { else { meanNeighborsLastPredictions = null; } + getAmas().data.meanNeighborhoodVolume = neighborhoodVolumesSum / activatedNeighborsContexts.size(); + + getAmas().data.meanNeighborhoodRaduises = new HashMap<Percept, Double>(); + for (Percept pct : getAmas().getPercepts()) { + getAmas().data.meanNeighborhoodRaduises.put(pct, neighborhoodRangesSums.get(pct)/activatedNeighborsContexts.size()); + getAmas().data.meanNeighborhoodStartIncrements.put(pct, neighborhoodStartIncrementSums.get(pct)/activatedNeighborsContexts.size()); + getAmas().data.meanNeighborhoodEndIncrements.put(pct, neighborhoodEndIncrementSums.get(pct)/activatedNeighborsContexts.size()); + } + } + + + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodVolume", getAmas().data.meanNeighborhoodVolume.toString()))); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodRaduises", getAmas().data.meanNeighborhoodRaduises.toString()))); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodStartIncrements", getAmas().data.meanNeighborhoodStartIncrements.toString()))); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodEndIncrements", getAmas().data.meanNeighborhoodEndIncrements.toString()))); + if(meanNeighborsLastPredictions != null) { // System.out.println("####################### NEIGHBORS #############################"); // System.out.println("ORACLE BEFORE" + getAmas().data.oracleValue); @@ -159,6 +202,62 @@ public class Head extends AmoebaAgent { + }else { + double neighborhoodVolumesSum = 0; + HashMap<Percept,Double> neighborhoodRangesSums = new HashMap<Percept,Double>(); + HashMap<Percept,Double> neighborhoodStartIncrementSums = new HashMap<Percept,Double>(); + HashMap<Percept,Double> neighborhoodEndIncrementSums = new HashMap<Percept,Double>(); + for (Percept pct : getAmas().getPercepts()) { + neighborhoodRangesSums.put(pct, 0.0); + neighborhoodStartIncrementSums.put(pct, 0.0); + neighborhoodEndIncrementSums.put(pct, 0.0); + } + + + + if(activatedNeighborsContexts.size()>0) { + + + for (Context ctxt : activatedNeighborsContexts) { + + neighborhoodVolumesSum += ctxt.getVolume(); + for (Percept pct : ctxt.getRanges().keySet()) { + neighborhoodRangesSums.put(pct, neighborhoodRangesSums.get(pct) + ctxt.getRanges().get(pct).getRadius()); + neighborhoodStartIncrementSums.put(pct, neighborhoodStartIncrementSums.get(pct) + ctxt.getRanges().get(pct).getStartIncrement()); + neighborhoodEndIncrementSums.put(pct, neighborhoodEndIncrementSums.get(pct) + ctxt.getRanges().get(pct).getEndIncrement()); + } + + + } + + getAmas().data.meanNeighborhoodVolume = neighborhoodVolumesSum / activatedNeighborsContexts.size(); + + getAmas().data.meanNeighborhoodRaduises = new HashMap<Percept, Double>(); + getAmas().data.meanNeighborhoodStartIncrements = new HashMap<Percept, Double>(); + getAmas().data.meanNeighborhoodEndIncrements = new HashMap<Percept, Double>(); + for (Percept pct : getAmas().getPercepts()) { + getAmas().data.meanNeighborhoodRaduises.put(pct, neighborhoodRangesSums.get(pct)/activatedNeighborsContexts.size()); + getAmas().data.meanNeighborhoodStartIncrements.put(pct, neighborhoodStartIncrementSums.get(pct)/activatedNeighborsContexts.size()); + getAmas().data.meanNeighborhoodEndIncrements.put(pct, neighborhoodEndIncrementSums.get(pct)/activatedNeighborsContexts.size()); + } + + + + + + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodVolume", getAmas().data.meanNeighborhoodVolume.toString()))); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodRaduises", getAmas().data.meanNeighborhoodRaduises.toString()))); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodStartIncrements", getAmas().data.meanNeighborhoodStartIncrements.toString()))); + getAmas().getEnvironment() + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEIGHBORDBOOD", "meanNeighborhoodEndIncrements", getAmas().data.meanNeighborhoodEndIncrements.toString()))); + } + + + + } diff --git a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java index f984ebe3760c85448c5f8e3cdfbd7817b1892753..e45a609046f00935391259c8c64c99004e27b526 100644 --- a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java +++ b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Launcher.java @@ -82,6 +82,7 @@ public class F_N_Launcher extends Application implements Serializable { amoeba.data.numberOfPointsForRegression = regressionPoints; amoeba.getEnvironment().setMappingErrorAllowed(mappingErrorAllowed); + // Exemple for adding a tool in the toolbar Slider slider = new Slider(0.01, 0.1, mappingErrorAllowed); slider.setShowTickLabels(true); diff --git a/AMOEBAonAMAK/src/gui/ContextRendererFX.java b/AMOEBAonAMAK/src/gui/ContextRendererFX.java index d2c6643fbe37de243ba5f9092f2d79fff705daf0..a57e7828e5c88c39c31a04aa007c8e9f93801f6e 100644 --- a/AMOEBAonAMAK/src/gui/ContextRendererFX.java +++ b/AMOEBAonAMAK/src/gui/ContextRendererFX.java @@ -41,7 +41,8 @@ public class ContextRendererFX extends RenderStrategy { } private void updateColor() { - setColorWithPrediction(); + //setColorWithPrediction(); + setColorWithCoefs(); } private void setColorWithCoefs() { diff --git a/AMOEBAonAMAK/src/kernel/AmoebaData.java b/AMOEBAonAMAK/src/kernel/AmoebaData.java index 35866c4d4f1b7b16c9e8e158dc82d13defa3609c..4f885da68e0a85759113b1c53b3423b760548982 100644 --- a/AMOEBAonAMAK/src/kernel/AmoebaData.java +++ b/AMOEBAonAMAK/src/kernel/AmoebaData.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.HashMap; import agents.head.DynamicPerformance; +import agents.percept.Percept; /** * A Plain Old Java Object for storing parameters for the Head. Keep it as simple as possible for ease of serialization.<br/> * Make sure that all member are : public, serializable, and with a default constructor (taking no parameters). @@ -81,4 +82,9 @@ public class AmoebaData implements Serializable { public double initRegressionPerformance = 1.0; public double averageRegressionPerformanceIndicator; + + public Double meanNeighborhoodVolume; + public HashMap<Percept, Double> meanNeighborhoodRaduises; + public HashMap<Percept, Double> meanNeighborhoodStartIncrements; + public HashMap<Percept, Double> meanNeighborhoodEndIncrements; } \ No newline at end of file diff --git a/AMOEBAonAMAK/src/kernel/World.java b/AMOEBAonAMAK/src/kernel/World.java index e248a189449055d43fff29bc5ac33ff3d1e90fdf..0f17d86b8de04ed9e14e5b89b0a437d91918a9a4 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.ERROR; + public static TRACE_LEVEL minLevel = TRACE_LEVEL.EVENT; private AMOEBA amoeba;