diff --git a/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml b/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml index 1e1919cd9d4ddac06922fb27e110b363f61cda0c..aab252c4ba35642f2ad43f4eef92fe71fe13cd1b 100644 --- a/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml +++ b/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml @@ -6,21 +6,16 @@ <Learning allowed = "true" creationOfNewContext = "true" loadPresetContext = "false"></Learning> </Configuration> - <StartingAgents> - <Sensor Name="px0" Enum="false" /> <Sensor Name="px1" Enum="false" /> <Sensor Name="px2" Enum="false" /> + <Sensor Name="px3" Enum="false" /> <Controller Name="Controller"> - <ErrorMargin ErrorAllowed="2000.0" AugmentationFactorError="5.0" DiminutionFactorError="0.4" MinErrorAllowed="0.1" NConflictBeforeAugmentation="40" NSuccessBeforeDiminution="80" /> + <ErrorMargin ErrorAllowed="1.0" AugmentationFactorError="0.5" DiminutionFactorError="0.5" MinErrorAllowed="0.01" NConflictBeforeAugmentation="50" NSuccessBeforeDiminution="50" /> </Controller> - - - </StartingAgents> - </System> diff --git a/AMOEBAonAMAK/resources/threeDimensionsLauncherUnity.xml b/AMOEBAonAMAK/resources/threeDimensionsLauncherUnity.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea0012a0810f27f03e731cb139e54089cb29018e --- /dev/null +++ b/AMOEBAonAMAK/resources/threeDimensionsLauncherUnity.xml @@ -0,0 +1,21 @@ +<?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" Enum="false" /> + <Sensor Name="px1" Enum="false" /> + <Sensor Name="px2" Enum="false" /> + + <Controller Name="Controller"> + <ErrorMargin ErrorAllowed="1.0" AugmentationFactorError="0.5" DiminutionFactorError="0.5" MinErrorAllowed="0.01" NConflictBeforeAugmentation="50" NSuccessBeforeDiminution="50" /> + + </Controller> + </StartingAgents> + +</System> diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java index 55fd51a44ae95f2d0927ef004f79cd4a1763bf08..0f601e60e99fdc66ae0a47bfc242531879d537a6 100644 --- a/AMOEBAonAMAK/src/agents/context/Context.java +++ b/AMOEBAonAMAK/src/agents/context/Context.java @@ -14,12 +14,14 @@ import agents.head.Criticalities; import agents.head.DynamicPerformance; import agents.head.EndogenousRequest; import agents.head.Head; +import agents.head.REQUEST; import agents.percept.Percept; import gui.ContextRendererFX; import gui.RenderStrategy; import kernel.AMOEBA; import ncs.NCS; import utils.Pair; +import utils.TRACE_LEVEL; /** * The core agent of AMOEBA. @@ -62,25 +64,36 @@ public class Context extends AmoebaAgent { public DynamicPerformance regressionPerformance; public Criticalities criticalities ; + public double lastDistanceToModel = -1.0; + public double lastAverageRegressionPerformanceIndicator = -1.0; + + public double augmentationFactorError = 0.5; + public double diminutionFactorError = 0.66; + public double minError = 1; + public int temporalWindowCriticalityMean = 5; + public int successesBeforeDiminution = 5; + public int errorsBeforeAugmentation = 5; - public Context(AMOEBA amoeba) { super(amoeba); buildContext(); - criticalities = new Criticalities(3); - //regressionPerformance = new DynamicPerformance(10, 10, 200, 0.5, 0.5, 1); - regressionPerformance = new DynamicPerformance(3, 3, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), 0.5, 0.5, 1); - getAmas().getEnvironment().trace(new ArrayList<String>(Arrays.asList("CTXT CREATION", this.getName()))); + criticalities = new Criticalities(5); + + 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) { super(amoeba); buildContext(bestNearestContext); getAmas().getEnvironment() - .trace(new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER", this.getName()))); - criticalities = new Criticalities(3); - //regressionPerformance = new DynamicPerformance(10, 10, 200, 0.5, 0.5, 1); - regressionPerformance = new DynamicPerformance(3, 3, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), 0.5, 0.5, 1); + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER", this.getName()))); + 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(); @@ -90,7 +103,7 @@ public class Context extends AmoebaAgent { super(amoeba); buildContext(fatherContext, contextDimensions); getAmas().getEnvironment() - .trace(new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER AND DIM", this.getName()))); + .trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER AND DIM", this.getName()))); } private void buildContextCommon() { @@ -200,7 +213,6 @@ public class Context extends AmoebaAgent { ((LocalModelMillerRegression) this.localModel).setCoef(coef); this.actionProposition = ((LocalModelMillerRegression) fatherContext.localModel) .getProposition(fatherContext); - } getAmas().addAlteredContext(this); @@ -263,7 +275,6 @@ public class Context extends AmoebaAgent { ((LocalModelMillerRegression) this.localModel).setCoef(coef); this.actionProposition = ((LocalModelMillerRegression) bestNearestContext.localModel) .getProposition(bestNearestContext); - } localModel.setFirstExperiments(new ArrayList<Experiment>(bestNearestContext.getLocalModel().getFirstExperiments())); @@ -483,7 +494,7 @@ public class Context extends AmoebaAgent { * @param head the head */ public void solveNCS_IncompetentHead(Head head) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), "*********************************************************************************************************** SOLVE NCS INCOMPETENT HEAD"))); getEnvironment().raiseNCS(NCS.HEAD_INCOMPETENT); @@ -497,7 +508,7 @@ public class Context extends AmoebaAgent { * @param head the head */ public void solveNCS_Concurrence(Head head) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), "*********************************************************************************************************** SOLVE NCS CONCURENCE"))); getEnvironment().raiseNCS(NCS.CONTEXT_CONCURRENCE); @@ -513,7 +524,7 @@ public class Context extends AmoebaAgent { */ public void solveNCS_Uselessness() { if (!isDying()) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), "*********************************************************************************************************** SOLVE NCS USELESSNESS"))); getEnvironment().raiseNCS(NCS.CONTEXT_USELESSNESS); this.destroy(); @@ -588,12 +599,18 @@ public class Context extends AmoebaAgent { } - public void analyzeResults4(Head head, Context closestContextToOracle) { - + public void analyzeResults4(Head head) { + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- ANALYSE RESULTS " + this.getName()))); - if (head.getCriticity(this) < head.getErrorAllowed()) { + lastDistanceToModel = getLocalModel().distance(this.getCurrentExperiment()); + lastAverageRegressionPerformanceIndicator = head.getAverageRegressionPerformanceIndicator(); + if(lastDistanceToModel < lastAverageRegressionPerformanceIndicator) { + //if(getLocalModel().distance(this.getCurrentExperiment()) < head.getAverageRegressionPerformanceIndicator()) { + //if (head.getCriticity(this) < head.getErrorAllowed()) { confidence++; + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.getName(), "CONFIDENCE ++"))); } else { this.solveNCS_BadPrediction(head); } @@ -663,22 +680,22 @@ public class Context extends AmoebaAgent { - public EndogenousRequest boundsToEndogenousRequest(HashMap<Percept, Pair<Double, Double>> bounds) { - HashMap<String, Double> request = new HashMap<String, Double>(); + public HashMap<Percept, Double> boundsToRequest(HashMap<Percept, Pair<Double, Double>> bounds) { + HashMap<Percept, Double> request = new HashMap<Percept, Double>(); for(Percept pct : bounds.keySet()) { if(bounds.get(pct) != null) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList("ENDO REQUESTS BOUNDS", pct.getName(),""+ bounds.get(pct).getA(),""+ bounds.get(pct).getB(), ""+((bounds.get(pct).getB() + bounds.get(pct).getA())/2)) )); - request.put(pct.getName(), (bounds.get(pct).getB() + bounds.get(pct).getA())/2); + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("ENDO REQUESTS BOUNDS", pct.getName(),""+ bounds.get(pct).getA(),""+ bounds.get(pct).getB(), ""+((bounds.get(pct).getB() + bounds.get(pct).getA())/2)) )); + request.put(pct, (bounds.get(pct).getB() + bounds.get(pct).getA())/2); }else { - getEnvironment().trace(new ArrayList<String>(Arrays.asList("ENDO REQUESTS ERROR missing percept bounds"))); + getEnvironment().trace(TRACE_LEVEL.ERROR, new ArrayList<String>(Arrays.asList("ENDO REQUESTS ERROR missing percept bounds"))); } } - return new EndogenousRequest(request, null); + return request; } public EndogenousRequest endogenousRequest(Context ctxt) { @@ -696,8 +713,8 @@ public class Context extends AmoebaAgent { for (Percept pct : getAmas().getPercepts()) { currentDistance = this.distance(ctxt, pct); - if(currentDistance<-(pct.getMappingErrorAllowed()*0.1)) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList("OVERLAP",pct.getName(), ""+this,""+ctxt)) ); + if(currentDistance<-pct.getMappingErrorAllowedMin()) { + getEnvironment().trace(TRACE_LEVEL.DEBUG,new ArrayList<String>(Arrays.asList("OVERLAP",pct.getName(), ""+this,""+ctxt)) ); overlapCounts+=1; overlapDistances.put(pct, Math.abs(currentDistance)); bounds.put(pct, this.overlapBounds(ctxt, pct)); @@ -706,8 +723,8 @@ public class Context extends AmoebaAgent { } - if (currentDistance > (pct.getMappingErrorAllowed()*0.1)) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList("VOID",pct.getName(), ""+this,""+ctxt)) ); + if (currentDistance > pct.getMappingErrorAllowedMin()) { + 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)); } @@ -720,25 +737,25 @@ public class Context extends AmoebaAgent { if (overlapCounts == getAmas().getPercepts().size()) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(getAmas().getPercepts().size() + "OVERLAPS", ""+this,""+ctxt)) ); + getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList(getAmas().getPercepts().size() + "OVERLAPS", ""+this,""+ctxt)) ); - EndogenousRequest request = boundsToEndogenousRequest(bounds); - if(request.getRequest() != null) { - return new EndogenousRequest(request.getRequest(), 5, new ArrayList<Context>(Arrays.asList(this,ctxt))); + HashMap<Percept, Double> request = boundsToRequest(bounds); + if(request != null) { + return new EndogenousRequest(request, bounds, 7, new ArrayList<Context>(Arrays.asList(this,ctxt)), REQUEST.OVERLAP); } } -// else if(overlapCounts == getAmas().getPercepts().size()-1 && voidDistances.size() == 1) { -// -// getEnvironment().trace(new ArrayList<String>(Arrays.asList("VOID", ""+this,""+ctxt)) ); -// -// EndogenousRequest request = boundsToEndogenousRequest(bounds); -// if(request.getRequest() != null) { -// -// if(getAmas().getHeadAgent().isVoid(request.getRequest())) { -// return new EndogenousRequest(request.getRequest(), 7, new ArrayList<Context>(Arrays.asList(this,ctxt))); -// } -// } -// } + else if(overlapCounts == getAmas().getPercepts().size()-1 && voidDistances.size() == 1) { + + getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("VOID", ""+this,""+ctxt)) ); + + HashMap<Percept, Double> request = boundsToRequest(bounds); + if(request != null) { + + if(getAmas().getHeadAgent().isVoid(request)) { + return new EndogenousRequest(request, bounds, 5, new ArrayList<Context>(Arrays.asList(this,ctxt)), REQUEST.VOID); + } + } + } else { return null; } @@ -808,7 +825,7 @@ public class Context extends AmoebaAgent { } public void solveNCS_BetterNeighbor(Context betterContext) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), betterContext.getName(), + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), betterContext.getName(), "*********************************************************************************************************** SOLVE NCS BETTER NEIGHBOR"))); localModel = new LocalModelMillerRegression(this, betterContext.getLocalModel().getCoef(), betterContext.getLocalModel().getFirstExperiments()); @@ -816,8 +833,7 @@ public class Context extends AmoebaAgent { public void NCSDetection_OverMapping() { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), - "*********************************************************************************************************** SOLVE NCS OVERMAPPING"))); + for(Context ctxt : getAmas().getHeadAgent().getActivatedNeighborsContexts()) { @@ -831,19 +847,19 @@ public class Context extends AmoebaAgent { double otherContextDistanceToOraclePrediction = ctxt.getLocalModel().distance(ctxt.getCurrentExperiment()); //double minDistanceToOraclePrediction = Math.min(getAmas().getHeadAgent().getDistanceToRegressionAllowed(), getAmas().getHeadAgent().getDistanceToRegressionAllowed()); - double averageDistanceToOraclePrediction = getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(); + Double averageDistanceToOraclePrediction = getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(); if((currentDistanceToOraclePrediction<averageDistanceToOraclePrediction) && (otherContextDistanceToOraclePrediction<averageDistanceToOraclePrediction)) { - getEnvironment().trace(new ArrayList<String>( Arrays.asList(this.getName(),"currentDistanceToOraclePrediction",""+ currentDistanceToOraclePrediction,"otherContextDistanceToOraclePrediction",""+ otherContextDistanceToOraclePrediction))); + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.getName(),"currentDistanceToOraclePrediction",""+ currentDistanceToOraclePrediction,"otherContextDistanceToOraclePrediction",""+ otherContextDistanceToOraclePrediction))); for(Percept pct : ranges.keySet()) { boolean fusionTest = true; - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),pct.getName(), ""+Math.abs(this.distance(ctxt, pct)), "DISTANCE", "" + getEnvironment().getMappingErrorAllowed()))); - if(Math.abs(this.distance(ctxt, pct)) < pct.getMappingErrorAllowed()/2){ + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),pct.getName(), ""+Math.abs(this.distance(ctxt, pct)), "DISTANCE", "" + getEnvironment().getMappingErrorAllowed()))); + if(Math.abs(this.distance(ctxt, pct)) < pct.getMappingErrorAllowedOverMapping()){ for(Percept otherPct : ranges.keySet()) { @@ -851,8 +867,8 @@ public class Context extends AmoebaAgent { double lengthDifference = Math.abs(ranges.get(otherPct).getLenght() - ctxt.getRanges().get(otherPct).getLenght()); double centerDifference = Math.abs(ranges.get(otherPct).getCenter() - ctxt.getRanges().get(otherPct).getCenter()); - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),otherPct.getName(), ""+lengthDifference,""+centerDifference, "LENGTH & CENTER DIFF", "" + getEnvironment().getMappingErrorAllowed()))); - fusionTest = fusionTest && (lengthDifference < otherPct.getMappingErrorAllowed()/2) && (centerDifference< otherPct.getMappingErrorAllowed()/2); + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),otherPct.getName(), ""+lengthDifference,""+centerDifference, "LENGTH & CENTER DIFF", "" + getEnvironment().getMappingErrorAllowed()))); + fusionTest = fusionTest && (lengthDifference < otherPct.getMappingErrorAllowedOverMapping()) && (centerDifference< otherPct.getMappingErrorAllowedOverMapping()); } } @@ -871,7 +887,7 @@ public class Context extends AmoebaAgent { } private void solveNCS_OverMapping(Context fusionContext) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), "*********************************************************************************************************** SOLVE NCS OVERMAPPING"))); getEnvironment().raiseNCS(NCS.CONTEXT_OVERMAPPING); @@ -882,17 +898,19 @@ public class Context extends AmoebaAgent { } this.setConfidence(Math.max(this.getConfidence(), fusionContext.getConfidence())); - + regressionPerformance.setPerformanceIndicator(Math.max(this.regressionPerformance.getPerformanceIndicator(), fusionContext.regressionPerformance.getPerformanceIndicator())); + + fusionContext.destroy(); getAmas().getHeadAgent().setBadCurrentCriticalityMapping(); } public void solveNCS_ChildContext() { - HashMap<String, Double> request = new HashMap<String, Double>(); + HashMap<Percept, Double> request = new HashMap<Percept, Double>(); for(Percept pct : getAmas().getPercepts()) { - request.put(pct.getName(), getRandomValueInRange(pct)); + request.put(pct, getRandomValueInRange(pct)); } - getEnvironment().trace(new ArrayList<String>(Arrays.asList("NEW ENDO REQUEST","10", ""+request, ""+this.getName()))); + getEnvironment().trace(TRACE_LEVEL.EVENT,new ArrayList<String>(Arrays.asList("NEW ENDO REQUEST","10", ""+request, ""+this.getName()))); getAmas().getHeadAgent().addSelfRequest(request, 10,this); } @@ -971,7 +989,7 @@ public class Context extends AmoebaAgent { } public void solveNCS_BadPrediction(Head head) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), "*********************************************************************************************************** SOLVE NCS CONFLICT"))); getEnvironment().raiseNCS(NCS.CONTEXT_CONFLICT_FALSE); @@ -1186,7 +1204,7 @@ public class Context extends AmoebaAgent { && ranges.get(percept).getEnd() <= bestContextRanges.getEnd())) { if (percept.contextOrder(this, bestContext)) { - getEnvironment().trace(new ArrayList<String>( + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList("ORDER :", percept.getName(), this.getName(), bestContext.getName()))); vol = Math.abs( percept.getEndRangeProjection(this) - percept.getStartRangeProjection(bestContext)); @@ -1195,7 +1213,7 @@ public class Context extends AmoebaAgent { perceptWithBiggerImpact = percept; } } else if (percept.contextOrder(bestContext, this)) { - getEnvironment().trace(new ArrayList<String>( + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList("ORDER :", percept.getName(), bestContext.getName(), this.getName()))); vol = Math.abs( percept.getEndRangeProjection(bestContext) - percept.getStartRangeProjection(this)); @@ -1204,7 +1222,7 @@ public class Context extends AmoebaAgent { perceptWithBiggerImpact = percept; } } else if (percept.contextIncludedIn(bestContext, this)) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList("INCLUSION :", percept.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("INCLUSION :", percept.getName(), bestContext.getName(), this.getName()))); vol = Math.abs(percept.getEndRangeProjection(bestContext) - percept.getStartRangeProjection(bestContext)); @@ -1595,7 +1613,7 @@ public class Context extends AmoebaAgent { boolean contain = ranges.get(pct).contains(pct.getValue()) == 0 ; if (!contain) { - if(ranges.get(pct).getLenght()<(pct.getMappingErrorAllowed()*1.5)) { + if(ranges.get(pct).getLenght()<pct.getMappingErrorAllowedMax()) { ranges.get(pct).adapt(pct.getValue()); } @@ -1614,24 +1632,15 @@ public class Context extends AmoebaAgent { public void shrinkRangesToJoinBorders(Context bestContext) { Percept perceptWithBiggerImpactOnOverlap = getPerceptWithBiggerImpactOnOverlap(getAmas().getPercepts(), bestContext); - // if(perceptWithLesserImpact!=null) world.trace(new - // ArrayList<String>(Arrays.asList(this.getName(),perceptWithLesserImpact.getName(), - // "PERCEPT BIGGER IMPACT"))); + if (perceptWithBiggerImpactOnOverlap == null) { this.destroy(); } else { - // ranges.get(perceptWithBiggerImpactOnOverlap).matchBorderWithBestContext(bestContext); - // ranges.get(perceptWithBiggerImpactOnOverlap).adaptTowardsBorder(bestContext); + ranges.get(perceptWithBiggerImpactOnOverlap).adapt(perceptWithBiggerImpactOnOverlap.getValue()); -// if(testIfOtherContextShouldFinalyShrink(bestContext, perceptWithLesserImpact)){ -// bestContext.getRanges().get(perceptWithLesserImpact).adaptTowardsBorder(this); -// } -// else { -// ranges.get(perceptWithLesserImpact).adaptTowardsBorder(bestContext); -// } } } @@ -1937,13 +1946,21 @@ public class Context extends AmoebaAgent { // s += "\n"; s += "\n"; - s += "Max Prediction " + getLocalModel().getMaxProposition(this) + "\n"; - s += "Min Prediction " + getLocalModel().getMinProposition(this) + "\n"; - + s += "Last Distance to Regression " + lastDistanceToModel + "\n"; + s += "Last Average Distance To Regression Allowed " + lastAverageRegressionPerformanceIndicator +"\n"; s += "Mean Distance To Regression " + criticalities.getCriticalityMean("distanceToRegression") + "\n"; s += "Distance To Regression Allowed " + regressionPerformance.getPerformanceIndicator() +"\n\n"; + + s += "Max Prediction " + getLocalModel().getMaxProposition(this) + "\n"; + s += "Min Prediction " + getLocalModel().getMinProposition(this) + "\n\n"; + + s += "ASKED REQUEST " + waitingRequests.size() + "\n"; + for(EndogenousRequest rqt : waitingRequests) { + s += rqt + "\n"; + } + s += "\n"; - + for (Percept v : ranges.keySet()) { s += v.getName() + " : " + ranges.get(v).toString() + "\n"; @@ -2046,15 +2063,15 @@ public class Context extends AmoebaAgent { @Override public void destroy() { - getEnvironment().trace(new ArrayList<String>( + getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>( Arrays.asList("-----------------------------------------", this.getName(), "DIE"))); + + getAmas().addToKillContextForUnityUI(this); for (Percept percept : getAmas().getPercepts()) { percept.deleteContextProjection(this); } - - super.destroy(); } @@ -2122,6 +2139,7 @@ public class Context extends AmoebaAgent { public void addWaitingRequest(EndogenousRequest request) { waitingRequests.add(request); + getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("ADDED WAITING REQUEST", this.getName(), ""+waitingRequests.size(), ""+request))); } public void deleteWaitingRequest(EndogenousRequest request) { @@ -2132,4 +2150,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 704b4f5c2b9fabf03948ca5c2e97ffd8b36a3f1b..082754b311e52a8b0eab6b7606df584eb60278c6 100644 --- a/AMOEBAonAMAK/src/agents/context/Range.java +++ b/AMOEBAonAMAK/src/agents/context/Range.java @@ -9,6 +9,7 @@ import agents.percept.Percept; import kernel.World; import ncs.NCS; import utils.Pair; +import utils.TRACE_LEVEL; // TODO: Auto-generated Javadoc /** @@ -354,7 +355,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(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("INCREMENT ON END ADAPT", context.getName(), percept.getName(), "" + increment ))); classicEndAdapt(oracleValue, increment); // adaptEndWithSplitting(oracleValue, increment); @@ -402,7 +403,7 @@ public class Range implements Serializable, Comparable, Cloneable { } private void adaptEndWithSplitting(double oracleValue, double increment) { - world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT"))); + world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT"))); ArrayList<Context> bordererContexts = new ArrayList<Context>(); @@ -410,7 +411,7 @@ public class Range implements Serializable, Comparable, Cloneable { for (Context ctxt : context.getAmas().getHeadAgent().getActivatedNeighborsContexts()) { - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(context.getName(), "" + this.distance(ctxt.getRanges().get(this.percept)), "DISTANCE SPLIT", percept.getName(), ctxt.getName()))); @@ -432,7 +433,7 @@ public class Range implements Serializable, Comparable, Cloneable { } if (bordererContextTest) { - world.trace(new ArrayList<String>(Arrays.asList(context.getName(), "END BORDER CONTEXT", + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(context.getName(), "END BORDER CONTEXT", percept.getName(), ctxt.getName()))); bordererContexts.add(ctxt); } @@ -441,7 +442,7 @@ public class Range implements Serializable, Comparable, Cloneable { } if (bordererContexts.size() > 0) { - world.trace(new ArrayList<String>(Arrays.asList("END BORDER CONTEXT", percept.getName()))); + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("END BORDER CONTEXT", percept.getName()))); double minAlternativeIncrement = increment; double alternativeIncrement; for (Context ctxt : bordererContexts) { @@ -525,7 +526,8 @@ public class Range implements Serializable, Comparable, Cloneable { } private void adaptStart(double oracleValue, double increment) { - world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT"))); + world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("INCREMENT ON END ADAPT", context.getName(), percept.getName(), "" + increment ))); + classicStartAdapt(oracleValue, increment); // adaptStartWithSplitting(oracleValue, increment); @@ -597,7 +599,7 @@ public class Range implements Serializable, Comparable, Cloneable { } private void adaptStartWithSplitting(double oracleValue, double increment) { - world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT"))); + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT"))); ArrayList<Context> bordererContexts = new ArrayList<Context>(); if (!(contains(oracleValue) == 0.0)) { @@ -622,7 +624,7 @@ public class Range implements Serializable, Comparable, Cloneable { } if (bordererContextTest) { - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList("START BORDER CONTEXT", percept.getName(), ctxt.getName()))); bordererContexts.add(ctxt); } @@ -631,7 +633,7 @@ public class Range implements Serializable, Comparable, Cloneable { } if (bordererContexts.size() > 0) { - world.trace(new ArrayList<String>(Arrays.asList("START BORDER CONTEXT", percept.getName()))); + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("START BORDER CONTEXT", percept.getName()))); double minAlternativeIncrement = increment; double alternativeIncrement; for (Context ctxt : bordererContexts) { @@ -794,12 +796,12 @@ public class Range implements Serializable, Comparable, Cloneable { * @return boolean representing if the range is too small. */ public boolean isTooSmall() { - if((end - start) < percept.getMappingErrorAllowed()*0.1 && (end - start)>0) { - ////// System.out.println("£££££££££££££££££££££££££££££ mininimalRange :" + - ////// mininimalRange + " ~~~ " + (end - start)); + + 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.getMappingErrorAllowed() / 2)) && !this.isPerceptEnum(); + return ((end - start) < percept.getMappingErrorAllowedMin()) && !this.isPerceptEnum(); } /** @@ -944,9 +946,9 @@ public class Range implements Serializable, Comparable, Cloneable { public void adaptOnOverlap(Range overlappingContextRanges, double border) { - world.trace(new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(), + world.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(), "*********************************************************************************************************** ADAPT ON OVERLAP"))); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.context.getName(), overlappingContextRanges.getContext().getName()))); double increment = Math.min(Math.abs(this.distance(overlappingContextRanges)), getIncrement()); @@ -1003,10 +1005,10 @@ public class Range implements Serializable, Comparable, Cloneable { if (newContext) { - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.context.getName(), "" + context.getRanges().get(pct), overlappingContext.getRanges().get(pct) + "", pct.getName(), "RANGES"))); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.context.getName(), "" + this.context.getRanges().get(pct).getLenght(), this.context.getRanges().get(pct) .overlapDistance(overlappingContext.getRanges().get(pct)) + "", @@ -1033,7 +1035,7 @@ public class Range implements Serializable, Comparable, Cloneable { world.raiseNCS(NCS.CREATE_NEW_CONTEXT); for (Percept pct : context.getAmas().getPercepts()) { - world.trace( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(pct.getName(), "" + newContextDimensions.get(pct).getA(), "" + newContextDimensions.get(pct).getB(), "NEW DIM"))); } @@ -1045,7 +1047,7 @@ public class Range implements Serializable, Comparable, Cloneable { System.out.println("TEST"); System.out.println(newContextDimensionsBis.get(pct).getA()); System.out.println(newContextDimensionsBis.get(pct).getB()); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(pct.getName(), "" + newContextDimensionsBis.get(pct).getA(), "" + newContextDimensionsBis.get(pct).getB(), "NEW DIM"))); } @@ -1058,9 +1060,9 @@ public class Range implements Serializable, Comparable, Cloneable { public void setOnConcurentOverlap(Range overlappingContextRanges, double border) { - world.trace(new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(), + world.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(), "*********************************************************************************************************** SET ON OVERLAP"))); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.context.getName(), overlappingContextRanges.getContext().getName()))); double increment = Math.min(Math.abs(this.distance(overlappingContextRanges)), getIncrement()); @@ -1122,10 +1124,10 @@ public class Range implements Serializable, Comparable, Cloneable { if (newContext) { - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.context.getName(), "" + context.getRanges().get(pct), overlappingContext.getRanges().get(pct) + "", pct.getName(), "RANGES"))); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.context.getName(), "" + this.context.getRanges().get(pct).getLenght(), this.context.getRanges().get(pct) .overlapDistance(overlappingContext.getRanges().get(pct)) + "", @@ -1152,7 +1154,7 @@ public class Range implements Serializable, Comparable, Cloneable { world.raiseNCS(NCS.CREATE_NEW_CONTEXT); for (Percept pct : context.getAmas().getPercepts()) { - world.trace( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(pct.getName(), "" + newContextDimensions.get(pct).getA(), "" + newContextDimensions.get(pct).getB(), "NEW DIM"))); } @@ -1166,7 +1168,7 @@ public class Range implements Serializable, Comparable, Cloneable { System.out.println(newContextDimensionsBis.get(pct).getA()); System.out.println(newContextDimensionsBis.get(pct).getB()); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(pct.getName(), "" + newContextDimensionsBis.get(pct).getA(), "" + newContextDimensionsBis.get(pct).getB(), "NEW DIM"))); } @@ -1185,12 +1187,12 @@ public class Range implements Serializable, Comparable, Cloneable { ArrayList<Pair<Double, Double>> centersAndLengths = new ArrayList<Pair<Double, Double>>(); - world.trace(new ArrayList<String>( + world.trace(TRACE_LEVEL.EVENT, new ArrayList<String>( Arrays.asList(this.context.getName(), overlappingRange.getContext().getName(), "SEEK NON OVERLAPING"))); if (this.getStart() < overlappingRange.getStart() && overlappingRange.getEnd() < this.getEnd()) { - world.trace(new ArrayList<String>(Arrays.asList("CONTAINED", this.percept.getName()))); + world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("CONTAINED", this.percept.getName()))); double center1 = (this.getStart() + overlappingRange.getStart()) / 2; double center2 = (overlappingRange.getEnd() + this.getEnd()) / 2; double length1 = overlappingRange.getStart() - this.getStart(); @@ -1199,13 +1201,13 @@ public class Range implements Serializable, Comparable, Cloneable { centersAndLengths.add(new Pair<Double, Double>(center2, length2)); } else if (this.getStart() < overlappingRange.getStart() && overlappingRange.getStart() < this.getEnd()) { - world.trace(new ArrayList<String>(Arrays.asList("START", this.percept.getName()))); + world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("START", this.percept.getName()))); double center = (this.getStart() + overlappingRange.getStart()) / 2; double length = overlappingRange.getStart() - this.getStart(); centersAndLengths.add(new Pair<Double, Double>(center, length)); } else if (this.getStart() < overlappingRange.getEnd() && overlappingRange.getEnd() < this.getEnd()) { - world.trace(new ArrayList<String>(Arrays.asList("END", this.percept.getName()))); + world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("END", this.percept.getName()))); double center = (overlappingRange.getEnd() + this.getEnd()) / 2; double length = this.getEnd() - overlappingRange.getEnd(); centersAndLengths.add(new Pair<Double, Double>(center, length)); @@ -1458,8 +1460,14 @@ public class Range implements Serializable, Comparable, Cloneable { // } this.start = newStartValue; + + if (this.context != null) { + + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( + Arrays.asList(this.context.getName(), this.percept.getName(), "SET START", "" + newStartValue))); + lastStartTickModification = this.context.getAmas().getCycle(); this.percept.updateContextProjectionStart(this.context); context.getAmas().addLastmodifiedContext(context); @@ -1490,11 +1498,10 @@ public class Range implements Serializable, Comparable, Cloneable { this.context.updateActivatedContextsCopyForUpdate(); - world.trace(new ArrayList<String>( - Arrays.asList(this.context.getName(), this.percept.getName(), "SET START", "" + newStartValue))); + - 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); } } @@ -1519,8 +1526,12 @@ public class Range implements Serializable, Comparable, Cloneable { // } this.end = newEndValue; + if (this.context != null) { + world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( + Arrays.asList(this.context.getName(), this.percept.getName(), "SET END", "" + newEndValue))); + lastEndTickModification = context.getAmas().getCycle(); this.percept.updateContextProjectionEnd(this.context); context.getAmas().addLastmodifiedContext(context); @@ -1551,11 +1562,10 @@ public class Range implements Serializable, Comparable, Cloneable { this.context.updateActivatedContextsCopyForUpdate(); - world.trace(new ArrayList<String>( - Arrays.asList(this.context.getName(), this.percept.getName(), "SET END", "" + newEndValue))); + - 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/context/localModel/LocalModelMillerRegression.java b/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java index 33f6d9a69acec7e4c4c8af5ad65f1d1fe2150d9c..87998fe51fe7f0fbd06036fa3e26bf74c662f8b9 100644 --- a/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java +++ b/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java @@ -8,6 +8,7 @@ import agents.context.Context; import agents.context.Experiment; import agents.percept.Percept; import utils.Pair; +import utils.TRACE_LEVEL; // TODO: Auto-generated Javadoc /** @@ -249,7 +250,8 @@ public class LocalModelMillerRegression extends LocalModel{ public void updateModel(Experiment newExperiment, double weight, int numberOfPointsForRegression) { - context.getAmas().getEnvironment().trace(new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "OLD MODEL :", coefsToString()))); + context.getAmas().getEnvironment().trace(TRACE_LEVEL.INFORM, 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); updateModel(); @@ -258,8 +260,8 @@ public class LocalModelMillerRegression extends LocalModel{ updateModelWithExperimentAndWeight(newExperiment, weight, numberOfPointsForRegression); } - - context.getAmas().getEnvironment().trace(new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "MODEL :", coefsToString()))); + context.getAmas().addSpatiallyAlteredContextForUnityUI(context); + context.getAmas().getEnvironment().trace(TRACE_LEVEL.INFORM,new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "MODEL :", coefsToString()))); } public void updateModel() { diff --git a/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java b/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java index cf949f0be04caa310ac02eee908519083ebf5102..e6c7ea98015042a6cc07c5e84d199b729cb16343 100644 --- a/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java +++ b/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java @@ -3,22 +3,28 @@ package agents.head; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; import org.junit.platform.commons.util.ToStringBuilder; import agents.context.Context; +import agents.percept.Percept; +import utils.Pair; public class EndogenousRequest { private Integer priority; - private HashMap<String, Double> request; + private HashMap<Percept, Double> request; + private HashMap<Percept, Pair<Double, Double>> bounds; private ArrayList<Context> askingContexts; private String name; + private REQUEST requestType; - public EndogenousRequest(HashMap<String, Double> rqst, int prty, ArrayList<Context> contexts) { + public EndogenousRequest(HashMap<Percept, Double> rqst, HashMap<Percept, Pair<Double, Double>> bnds, int prty, ArrayList<Context> contexts, REQUEST type) { request = rqst; + bounds = bnds; priority = prty; askingContexts = contexts; @@ -27,9 +33,11 @@ public class EndogenousRequest { for(Context ctxt: askingContexts) { name += ctxt.getName(); } + + requestType = type; } - public EndogenousRequest(HashMap<String, Double> rqst, Integer prty) { + public EndogenousRequest(HashMap<Percept, Double> rqst, Integer prty) { request = rqst; priority = prty; @@ -39,17 +47,18 @@ public class EndogenousRequest { return priority; } - public HashMap<String, Double> getRequest(){ + public HashMap<Percept, Double> getRequest(){ return request; } public String toString() { - String m=""; + String m="ASK BY "; for(Context ctxt : askingContexts) { m+= ctxt.getName() + " "; } m+=priority + " "; - m+= request; + m+= request + " "; + m+= requestType; return m; } @@ -69,6 +78,25 @@ public class EndogenousRequest { return test; } + public boolean requestInBounds(HashMap<Percept, Double> rqt) { + boolean test = true; + + + Iterator<Percept> it = rqt.keySet().iterator(); + + while(test && it.hasNext()) { + Percept pct = (Percept) it.next(); + test = test && ( (bounds.get(pct).getA() < rqt.get(pct)) && (rqt.get(pct) < bounds.get(pct).getB() )); + } + + + return test; + } + + public REQUEST getType() { + return requestType; + } + } diff --git a/AMOEBAonAMAK/src/agents/head/Head.java b/AMOEBAonAMAK/src/agents/head/Head.java index 61101743d8ac488b42dfec53cade0a761391f1d4..5c003f286b7b0c8cd98cf807e993b55b46cbe4ed 100644 --- a/AMOEBAonAMAK/src/agents/head/Head.java +++ b/AMOEBAonAMAK/src/agents/head/Head.java @@ -5,8 +5,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.List; import java.util.Iterator; +import java.util.List; import java.util.PriorityQueue; import java.util.Queue; @@ -20,6 +20,7 @@ import utils.Pair; import utils.PickRandom; import utils.PrintOnce; import utils.Quadruplet; +import utils.TRACE_LEVEL; /** * The Class Head. @@ -145,8 +146,12 @@ public class Head extends AmoebaAgent { private void playWithOracle() { getAmas().data.executionTimes[0]=System.currentTimeMillis(); + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("\n------------------------------------------------------------------------------------" + + "---------------------------------------- PLAY WITH ORACLE"))); + if (activatedContexts.size() > 0) { - selectBestContext(); // using highest confidence + //selectBestContext(); // using highest confidence + selectBestContextWithDistanceToModel(); // using closest distance // selectBestContextWithDistanceToModel(); } else { bestContext = lastUsedContext; @@ -167,11 +172,12 @@ public class Head extends AmoebaAgent { /* If we have a bestcontext, send a selection message to it */ if (bestContext != null) { bestContext.notifySelection(); - getEnvironment().trace(new ArrayList<String>(Arrays.asList(bestContext.getName(), + getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList(bestContext.getName(), "*********************************************************************************************************** BEST CONTEXT"))); } getAmas().data.executionTimes[0]=System.currentTimeMillis()- getAmas().data.executionTimes[0]; + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 1", "" + (bestContext != null)))); getAmas().data.executionTimes[1]=System.currentTimeMillis(); // endogenousPlay(); @@ -181,6 +187,7 @@ public class Head extends AmoebaAgent { selfAnalysationOfContexts4(); getAmas().data.executionTimes[2]=System.currentTimeMillis()- getAmas().data.executionTimes[2]; + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 2", "" + (bestContext != null)))); getAmas().data.executionTimes[3]=System.currentTimeMillis(); NCSDetection_IncompetentHead(); /* @@ -191,6 +198,7 @@ public class Head extends AmoebaAgent { getAmas().data.executionTimes[4]=System.currentTimeMillis(); + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 3", "" + (bestContext != null)))); NCSDetection_Concurrence(); /* If result is good, shrink redundant context (concurrence NCS) */ getAmas().data.executionTimes[4]=System.currentTimeMillis()- getAmas().data.executionTimes[4]; @@ -207,7 +215,8 @@ public class Head extends AmoebaAgent { NCSDetection_ChildContext(); - NCSDetection_PotentialRequest(); + //if(getAmas().getCycle()>1000) + //NCSDetection_PotentialRequest(); criticalities.addCriticality("spatialCriticality", (getMinMaxVolume() - getVolumeOfAllContexts()) / getMinMaxVolume()); @@ -781,6 +790,9 @@ public class Head extends AmoebaAgent { private void NCSDetection_ChildContext() { + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- NCS DETECTION CHILD CONTEXT"))); + if(bestContext!=null) { if(!bestContext.getLocalModel().finishedFirstExperiments() && getAmas().data.firstContext && getAmas().getCycle()>0 && !bestContext.isDying()) { bestContext.solveNCS_ChildContext(); @@ -823,14 +835,15 @@ public class Head extends AmoebaAgent { private void NCSDetection_Create_New_Context() { /* Finally, head agent check the need for a new context agent */ - + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- NCS DETECTION CREATE NEX CONTEXT"))); boolean newContextCreated = false; getAmas().data.executionTimes[9]=System.currentTimeMillis(); if (activatedContexts.size() == 0) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList( + getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList( "*********************************************************************************************************** SOLVE NCS CREATE NEW CONTEXT"))); getAmas().data.executionTimes[8]=System.currentTimeMillis(); @@ -841,7 +854,7 @@ public class Head extends AmoebaAgent { Context context; if (nearestGoodContext.getA() != null) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList(nearestGoodContext.getA().getName(), + getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList(nearestGoodContext.getA().getName(), "************************************* NEAREST GOOD CONTEXT"))); context = createNewContext(nearestGoodContext.getA()); } else { @@ -872,6 +885,9 @@ public class Head extends AmoebaAgent { } private void NCSDetection_Context_Overmapping() { + + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- NCS DETECTION OVERMAPPING"))); ArrayList<Context> activatedContextsCopy = new ArrayList<Context>(); activatedContextsCopy.addAll(activatedContexts); @@ -885,16 +901,33 @@ public class Head extends AmoebaAgent { } private void NCSDetection_Concurrence() { - /* If result is good, shrink redundant context (concurrence NCS) */ - if (bestContext != null && getAmas().data.criticity <= getAmas().data.predictionPerformance.getPerformanceIndicator()) { + + 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() )))); + + } + - for (int i = 0; i < activatedContexts.size(); i++) { + /* If result is good, shrink redundant context (concurrence NCS) */ + if (bestContext != null && bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()) { + //if (bestContext != null && criticity <= predictionPerformance.getPerformanceIndicator()) { - if (activatedContexts.get(i) != bestContext && !activatedContexts.get(i).isDying() && this - .getCriticity(activatedContexts.get(i)) <= getAmas().data.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())))); - activatedContexts.get(i).solveNCS_Concurrence(this); - } + if (activatedContexts.get(i) != bestContext && !activatedContexts.get(i).isDying() && activatedContexts.get(i).getLocalModel().distance(activatedContexts.get(i).getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()) { + + activatedContexts.get(i).solveNCS_Concurrence(this); + } } } } @@ -904,15 +937,28 @@ public class Head extends AmoebaAgent { * If there isn't any proposition or only bad propositions, the head is * incompetent. It needs help from a context. */ - if (activatedContexts.isEmpty() - || (getAmas().data.criticity > getAmas().data.predictionPerformance.getPerformanceIndicator() && !oneOfProposedContextWasGood())) { + + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- NCS DETECTION INCOMPETENT HEAD"))); + + 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 */ /* @@ -929,6 +975,9 @@ public class Head extends AmoebaAgent { private void NCSDetection_PotentialRequest() { + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- NCS DETECTION POTENTIAL REQUESTS"))); + @@ -945,7 +994,7 @@ public class Head extends AmoebaAgent { if(potentialRequest != null) { addEndogenousRequest(potentialRequest); - getEnvironment().trace(new ArrayList<String>(Arrays.asList("NEW ENDO REQUEST", ""+potentialRequest))); + } } @@ -955,12 +1004,12 @@ public class Head extends AmoebaAgent { } } - getEnvironment().trace(new ArrayList<String>(Arrays.asList("ENDO REQUESTS", ""+endogenousRequests.size()))); -// for(EndogenousRequest endoRequest : endogenousRequests) { -// -// System.out.println(endoRequest); -// -// } + getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("ENDO REQUESTS", ""+endogenousRequests.size()))); + for(EndogenousRequest endoRequest : endogenousRequests) { + + getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("" + endoRequest))); + + } } @@ -1046,6 +1095,9 @@ public class Head extends AmoebaAgent { private void selfAnalysationOfContexts4() { + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------" + + "---------------------------------------- SELF ANALYSIS OF CTXT"))); + double currentDistanceToOraclePrediction; Context closestContextToOracle = null; double minDistanceToOraclePrediction = Double.POSITIVE_INFINITY; @@ -1056,7 +1108,7 @@ public class Head extends AmoebaAgent { getAmas().data.distanceToRegression = currentDistanceToOraclePrediction; getAmas().data.contextNotFinished = false; - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(), "" + activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment())))); if (!activatedContext.getLocalModel().finishedFirstExperiments()) { activatedContext.getLocalModel().updateModel(activatedContext.getCurrentExperiment(), getAmas().data.learningSpeed, @@ -1086,22 +1138,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(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, closestContextToOracle); + 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)) { @@ -1124,14 +1178,14 @@ public class Head extends AmoebaAgent { .abs(distanceToOracleForActivatedContext - closestAndFarestContextsToPredictionWithDistance.getD()); if (distanceToMin < distanceToMax) { - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContexts.get(0).getName(), "" + distanceToOracleForActivatedContext))); activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(), getAmas().data.learningSpeed, getAmas().data.numberOfPointsForRegression); } } else { - getEnvironment().trace(new ArrayList<String>( + getEnvironment().trace(TRACE_LEVEL.DEBUG, 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(), @@ -1153,7 +1207,7 @@ public class Head extends AmoebaAgent { if (contextNeighbor != activatedContexts.get(0)) { currentDistanceToOraclePrediction = contextNeighbor.getLocalModel() .distance(contextNeighbor.getCurrentExperiment()); - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(), "" + currentDistanceToOraclePrediction))); if (currentDistanceToOraclePrediction > maxDistanceToOraclePredictionInNeighbors) { maxDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction; @@ -1172,7 +1226,7 @@ public class Head extends AmoebaAgent { if (contextNeighbor != activatedContexts.get(0)) { currentDistanceToOraclePrediction = contextNeighbor.getLocalModel() .distance(contextNeighbor.getCurrentExperiment()); - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(), "" + currentDistanceToOraclePrediction))); if (currentDistanceToOraclePrediction < minDistanceToOraclePredictionInNeighbors) { minDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction; @@ -1194,7 +1248,7 @@ public class Head extends AmoebaAgent { if (contextNeighbor != activatedContexts.get(0)) { currentDistanceToOraclePrediction = contextNeighbor.getLocalModel() .distance(contextNeighbor.getCurrentExperiment()); - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(), "" + currentDistanceToOraclePrediction))); if (currentDistanceToOraclePrediction > maxDistanceToOraclePredictionInNeighbors) { maxDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction; @@ -1221,7 +1275,7 @@ public class Head extends AmoebaAgent { currentDistanceToOraclePrediction = activatedContext.getLocalModel() .distance(activatedContext.getCurrentExperiment()); - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(), "" + activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment())))); if (currentDistanceToOraclePrediction < minDistanceToOraclePrediction) { minDistanceToOraclePrediction = currentDistanceToOraclePrediction; @@ -1337,15 +1391,17 @@ public class Head extends AmoebaAgent { double d = Double.MAX_VALUE; Context bestContextInNeighbors = null; + Double averageDistanceToModels = getAverageRegressionPerformanceIndicator(); + for (Context c : contextNeighbors) { double currentDistanceToOraclePrediction = c.getLocalModel() .distance(c.getCurrentExperiment()); - getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE FOR FATHER CTXT", c.getName(), + getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE FOR FATHER CTXT", c.getName(), "" + c.getLocalModel().distance(c.getCurrentExperiment())))); - if (currentDistanceToOraclePrediction < getAmas().data.regressionPerformance.getPerformanceIndicator()) { + if (currentDistanceToOraclePrediction < averageDistanceToModels) { if(currentDistanceToOraclePrediction < d) { d = currentDistanceToOraclePrediction; bestContextInNeighbors = c; @@ -1567,6 +1623,8 @@ public class Head extends AmoebaAgent { bestContext = null; } } + + private void selectBestContextWithDistanceToModel() { @@ -2256,9 +2314,13 @@ public class Head extends AmoebaAgent { - public HashMap<String, Double> getSelfRequest(){ - getEnvironment().trace(new ArrayList<String>(Arrays.asList("FUTURE ACTIVE LEARNING", ""+endogenousRequests.element()))); - return endogenousRequests.poll().getRequest(); + public HashMap<Percept, Double> getSelfRequest(){ + getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("FUTURE ACTIVE LEARNING", ""+endogenousRequests.element()))); + EndogenousRequest futureRequest = endogenousRequests.poll(); + for(Context ctxt : futureRequest.getAskingContexts()) { + ctxt.deleteWaitingRequest(futureRequest); + } + return futureRequest.getRequest(); } public void deleteRequest(Context ctxt) { @@ -2269,9 +2331,9 @@ public class Head extends AmoebaAgent { return endogenousRequests.size()>0; } - public void addSelfRequest(HashMap<String, Double> request, int priority, Context ctxt){ + public void addSelfRequest(HashMap<Percept, Double> request, int priority, Context ctxt){ - addEndogenousRequest(new EndogenousRequest(request, priority,new ArrayList<Context>(Arrays.asList(ctxt)))); + addEndogenousRequest(new EndogenousRequest(request, null, priority,new ArrayList<Context>(Arrays.asList(ctxt)), REQUEST.SELF)); } public void addEndogenousRequest(EndogenousRequest request) { @@ -2285,10 +2347,13 @@ public class Head extends AmoebaAgent { EndogenousRequest currentRequest = itr.next(); - if(currentRequest.getAskingContexts().size()>1) { + if(currentRequest.getType() == REQUEST.OVERLAP) { existingRequestTest = existingRequestTest || currentRequest.testIfContextsAlreadyAsked(request.getAskingContexts()); } + if(currentRequest.getType() == REQUEST.VOID) { + existingRequestTest = existingRequestTest || currentRequest.requestInBounds(request.getRequest()); + } } if(!existingRequestTest) { @@ -2296,9 +2361,12 @@ public class Head extends AmoebaAgent { ctxt.addWaitingRequest(request); } endogenousRequests.add(request); + getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEW ADDED ENDO REQUEST", ""+request))); } }else { + request.getAskingContexts().get(0).addWaitingRequest(request); endogenousRequests.add(request); + getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEW ADDED ENDO REQUEST", ""+request))); } @@ -2320,14 +2388,14 @@ public class Head extends AmoebaAgent { } } - public boolean isVoid(HashMap<String, Double> request) { + public boolean isVoid(HashMap<Percept, Double> request) { boolean test; for(Context ctxt : activatedNeighborsContexts) { test = true; for(Percept pct : getAmas().getPercepts()) { - test = test && ctxt.getRanges().get(pct).contains2(request.get(pct.getName())); + test = test && ctxt.getRanges().get(pct).contains2(request.get(pct)); } if(test) { return false; @@ -2338,10 +2406,10 @@ public class Head extends AmoebaAgent { } - public double getAverageRegressionPerformanceIndicator() { - + public Double getAverageRegressionPerformanceIndicator() { - if(activatedNeighborsContexts.size()>1) { + int numberOfRegressions = 0; + if(activatedNeighborsContexts.size()>0) { double meanRegressionPerformanceIndicator = 0.0; for(Context ctxt : activatedNeighborsContexts) { @@ -2349,19 +2417,22 @@ public class Head extends AmoebaAgent { if(ctxt.regressionPerformance != null) { meanRegressionPerformanceIndicator += ctxt.regressionPerformance.performanceIndicator; + numberOfRegressions+=1; } } - return meanRegressionPerformanceIndicator/activatedNeighborsContexts.size(); + return meanRegressionPerformanceIndicator/numberOfRegressions; } - else { - return 200; + else{ + return getAmas().data.initRegressionPerformance; } } + + // ----------------- // AMOEBAonAMAK --- diff --git a/AMOEBAonAMAK/src/agents/head/REQUEST.java b/AMOEBAonAMAK/src/agents/head/REQUEST.java new file mode 100644 index 0000000000000000000000000000000000000000..2cb7d78652523f7ce9f3d3fe3b9ed10f03cf4efe --- /dev/null +++ b/AMOEBAonAMAK/src/agents/head/REQUEST.java @@ -0,0 +1,16 @@ +package agents.head; + +import java.io.Serializable; + +public enum REQUEST implements Serializable { + + OVERLAP, + VOID, + SELF + +} + + + + + diff --git a/AMOEBAonAMAK/src/agents/percept/Percept.java b/AMOEBAonAMAK/src/agents/percept/Percept.java index 9c82b3cb33c58e0fdbf9945a26295088d3497a7c..c58d7e26b8c423973c37f1f709fad22d11362bfe 100644 --- a/AMOEBAonAMAK/src/agents/percept/Percept.java +++ b/AMOEBAonAMAK/src/agents/percept/Percept.java @@ -419,6 +419,18 @@ public class Percept extends AmoebaAgent { public double getMappingErrorAllowed() { return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed(); } + + public double getMappingErrorAllowedMin() { + return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 0.4; + } + + public double getMappingErrorAllowedOverMapping() { + return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 0.5; + } + + public double getMappingErrorAllowedMax() { + return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 1.5; + } // ----------------------- // AMOEBAonAMAK code ---- diff --git a/AMOEBAonAMAK/src/experiments/F_XY_System.java b/AMOEBAonAMAK/src/experiments/F_XY_System.java index d00c161eb53dec5d03ae34d55f7f91b4875f50be..86a0d739f772a9e98e7c03d1aa7b10eaeb764f28 100644 --- a/AMOEBAonAMAK/src/experiments/F_XY_System.java +++ b/AMOEBAonAMAK/src/experiments/F_XY_System.java @@ -3,6 +3,7 @@ package experiments; import java.util.HashMap; import java.util.Random; +import agents.percept.Percept; import kernel.StudiedSystem; /** @@ -76,7 +77,7 @@ public class F_XY_System implements StudiedSystem { } @Override - public void setSelfRequest(HashMap<String, Double> request) { + public void setSelfRequest(HashMap<Percept, Double> request) { // TODO Auto-generated method stub } diff --git a/AMOEBAonAMAK/src/experiments/NDimCube.java b/AMOEBAonAMAK/src/experiments/NDimCube.java index d2400f26ec06abf0bb00f4052278d9c9f97cd28d..8e48b4266d9d9b3c296bd37501d10b6471b7793b 100644 --- a/AMOEBAonAMAK/src/experiments/NDimCube.java +++ b/AMOEBAonAMAK/src/experiments/NDimCube.java @@ -3,6 +3,7 @@ package experiments; import java.util.HashMap; import java.util.Random; +import agents.percept.Percept; import fr.irit.smac.amak.tools.Log; import kernel.StudiedSystem; @@ -123,7 +124,7 @@ public class NDimCube implements StudiedSystem{ } @Override - public void setSelfRequest(HashMap<String, Double> request) { + public void setSelfRequest(HashMap<Percept, Double> request) { // TODO Auto-generated method stub } diff --git a/AMOEBAonAMAK/src/experiments/TestMain.java b/AMOEBAonAMAK/src/experiments/TestMain.java index e6b6aab20fd7f2b79cbff5f074c44c5098245a00..0c1edf926c62fdf0692d299b0789045109b12af0 100644 --- a/AMOEBAonAMAK/src/experiments/TestMain.java +++ b/AMOEBAonAMAK/src/experiments/TestMain.java @@ -7,6 +7,7 @@ import java.util.PriorityQueue; import java.util.Queue; import agents.head.EndogenousRequest; +import fr.irit.smac.amak.tools.Log.Level; @@ -23,16 +24,47 @@ public class TestMain { return n*fact(n-1); } } + + public enum Level { + FATAL(60), ERROR(50), IMPORTANT(40), WARNING(30), INFORM(20), DEBUG(10); + + private final int order; + + Level(final int order) { + this.order = order; + } + + public boolean isGE(final Level _other) { + return order >= _other.order; + } + } + + public static Level minLevel = Level.IMPORTANT; + + private static void trace(final Level _level, final String _message) { + if (_level.isGE(minLevel)) { + System.out.println(_message); + } + } + + public static void main(String[] args) { // TODO Auto-generated method stub - testPriorityQueue(); + testLvlTrace(); } + public static void testLvlTrace() { + trace(Level.DEBUG, "DEBUG"); + trace(Level.WARNING, "WARNING"); + trace(Level.ERROR, "ERROR"); + trace(Level.FATAL, "FATAL"); + } + public static void testPriorityQueue() { Queue<EndogenousRequest> endogenousRequest = new PriorityQueue<EndogenousRequest>(new Comparator<EndogenousRequest>(){ @@ -55,13 +87,13 @@ public class TestMain { hm6.put("p6", 50.0); HashMap<String, Double> hm7 = new HashMap<String, Double>(); hm7.put("p7", 50.0); - endogenousRequest.add(new EndogenousRequest(hm1, 5)); - endogenousRequest.add(new EndogenousRequest(hm2, 3)); - endogenousRequest.add(new EndogenousRequest(hm3, 1)); - endogenousRequest.add(new EndogenousRequest(hm4, 2)); - endogenousRequest.add(new EndogenousRequest(hm5, 0)); - endogenousRequest.add(new EndogenousRequest(hm6, 5)); - endogenousRequest.add(new EndogenousRequest(hm7, 3)); +// endogenousRequest.add(new EndogenousRequest(hm1, 5)); +// endogenousRequest.add(new EndogenousRequest(hm2, 3)); +// endogenousRequest.add(new EndogenousRequest(hm3, 1)); +// endogenousRequest.add(new EndogenousRequest(hm4, 2)); +// endogenousRequest.add(new EndogenousRequest(hm5, 0)); +// endogenousRequest.add(new EndogenousRequest(hm6, 5)); +// endogenousRequest.add(new EndogenousRequest(hm7, 3)); System.out.println(endogenousRequest); diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..effe3bbcf7316ef5a328169310f5cce120eca898 --- /dev/null +++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java @@ -0,0 +1,259 @@ +package experiments.UnityLauncher; + +import java.io.File; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; + +import agents.context.Context; +import experiments.FILE; +import experiments.nDimensionsLaunchers.F_N_Manager; +import fr.irit.smac.amak.Configuration; +import gui.AmoebaWindow; +import kernel.AMOEBA; +import kernel.StudiedSystem; +import kernel.backup.BackupSystem; +import kernel.backup.IBackupSystem; +import kernel.backup.SaveHelperImpl; + +public class Main implements Runnable { + + + + public static final double oracleNoiseRange = 0.0; + public static final double learningSpeed = 0.01; + public static final int regressionPoints = 100; + public static final int dimension = 3 ; + public static final double spaceSize = 50.0 ; + public static final int nbOfModels = 3 ; + public static final int normType = 2 ; + 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 = 10000; + + private SocketServer server; + + /* GUI or not */ + public static final boolean viewer = false; + private String message = ""; + private Boolean shutDown; + + public Main(ServerSocket ss, Socket s) { + + server = new SocketServer(ss, s); + shutDown = false; + + } + + public void run() { + + AmoebaWindow.instance(); + try { + launch(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + + + } + + public void launch() throws IOException{ + + + + + // Set AMAK configuration before creating an AMOEBA + Configuration.commandLineMode = false; + Configuration.allowedSimultaneousAgentsExecution = 1; + Configuration.waitForGUI = true; + Configuration.plotMilliSecondsUpdate = 20000; + + AMOEBA amoeba = new AMOEBA(); + StudiedSystem studiedSystem = new F_N_Manager(spaceSize, dimension, nbOfModels, normType, randomExploration, explorationIncrement,explorationWidht,limitedToSpaceZone); + amoeba.setStudiedSystem(studiedSystem); + IBackupSystem backupSystem = new BackupSystem(amoeba); + File file = new File("resources/threeDimensionsLauncherUnity.xml"); + backupSystem.load(file); + + + amoeba.saver = new SaveHelperImpl(amoeba); + amoeba.allowGraphicalScheduler(true); + amoeba.setRenderUpdate(true); + amoeba.data.learningSpeed = learningSpeed; + amoeba.data.numberOfPointsForRegression = regressionPoints; + amoeba.getEnvironment().setMappingErrorAllowed(mappingErrorAllowed); + + + Sender sender = new Sender(server, amoeba); + + studiedSystem.playOneStep(); + amoeba.learn(studiedSystem.getOutput()); + + + + + + for (int i = 0; i < nbCycle; ++i) { + + + + + studiedSystem.playOneStep(); + amoeba.learn(studiedSystem.getOutput()); + if(amoeba.getHeadAgent().isActiveLearning()) { + + studiedSystem.setActiveLearning(true); + studiedSystem.setSelfRequest(amoeba.getHeadAgent().getSelfRequest()); + + } + + + ArrayList<Context> spatiallyAlteredContexts = amoeba.getSpatiallyAlteredContextForUnityUI(); + ArrayList<Context> toKillContexts = amoeba.getToKillContextsForUnityUI(); + + if(spatiallyAlteredContexts.size()>0) { + + + + sender.sendContexts(spatiallyAlteredContexts); + + while (!sender.acq("CTXTS", amoeba.getCycle())) { + try + { + Thread.sleep(10); + } + catch(InterruptedException ex) + { + Thread.currentThread().interrupt(); + } + } + } + + if(toKillContexts.size()>0) { + + sender.sendContextsToKill(toKillContexts); + + while (!sender.acq("KILL", amoeba.getCycle())) { + try + { + Thread.sleep(10); + } + catch(InterruptedException ex) + { + Thread.currentThread().interrupt(); + } + } + } + } + + + + + + + + /* AUTOMATIC */ +// long start = System.currentTimeMillis(); +// for (int i = 0; i < nbCycle; ++i) { +// studiedSystem.playOneStep(); +// amoeba.learn(studiedSystem.getOutput()); +// } +// long end = System.currentTimeMillis(); +// System.out.println("Done in : " + (end - start) ); + + +// /* XP PIERRE */ +// +// String fileName = fileName(new ArrayList<String>(Arrays.asList("GaussiennePierre"))); +// +// FILE Pierrefile = new FILE("Pierre",fileName); +// for (int i = 0; i < nbCycle; ++i) { +// studiedSystem.playOneStep(); +// amoeba.learn(studiedSystem.getOutput()); +// if(amoeba.getHeadAgent().isActiveLearning()) { +// studiedSystem.setActiveLearning(true); +// studiedSystem.setSelfRequest(amoeba.getHeadAgent().getSelfRequest()); +// +// } +// } +// +// for (int i = 0; i < 10; ++i) { +// studiedSystem.playOneStep(); +// System.out.println(studiedSystem.getOutput()); +// System.out.println(amoeba.request(studiedSystem.getOutput())); +// +// +// } +// +// Pierrefile.write(new ArrayList<String>(Arrays.asList("ID contexte","Coeff Cte","Coeff X0","Coeff X1","Min Value","Max Value"))); +// +// for(Context ctxt : amoeba.getContexts()) { +// +// writeMessage(Pierrefile, ctxt.toStringArrayPierre()); +// +// } +// +// +// Pierrefile.close(); + + + } + + public static String fileName(ArrayList<String> infos) { + String fileName = ""; + + for(String info : infos) { + fileName += info + "_"; + } + + return fileName; + } + + public static void writeMessage(FILE file, ArrayList<String> message) { + + file.initManualMessage(); + + for(String m : message) { + file.addManualMessage(m); + } + + file.sendManualMessage(); + + } + + ////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////// + + + private void quit(){ + + server.close(); + shutDown = true; + } + + private void ack(){ + //System.out.println("ACK..."); + //message = readMessage(); + //System.out.println(message); + if(!message.contentEquals("")){ + server.sendMessage("ACK_" + Integer.toString(server.getMessageCounter())); + //System.out.println("ACK"); + } + else{ + server.sendMessage("ERR_"+Integer.toString(server.getMessageCounter())); + } + } + + + + +} + diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java new file mode 100644 index 0000000000000000000000000000000000000000..583fd1c3bac535aa98b59aec6820f9b4c81793f0 --- /dev/null +++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java @@ -0,0 +1,68 @@ +package experiments.UnityLauncher; + +import java.util.ArrayList; + +import agents.context.Context; +import agents.percept.Percept; +import kernel.AMOEBA; + + + +public class Sender { + + AMOEBA amoeba; + SocketServer server; + + public Sender(SocketServer serverInstance,AMOEBA amoebaInstance) { + amoeba = amoebaInstance; + server = serverInstance; + } + + public void sendContexts(ArrayList<Context> contexts) { + ArrayList<Percept> percepts = amoeba.getPercepts(); + String message = initializeMessage("CTXTS"); + + for(Context ctxt : contexts) { + message += "~"; + message += ctxt.getName() + "_"; + message += ctxt.getColorForUnity(); + + for(Percept pct : percepts) { + message += "_"; + message += pct.getName() + "#"; + message += ctxt.getRanges().get(pct).getCenter() + "#"; + message += ctxt.getRanges().get(pct).getLenght(); + } + + + } + //System.out.println(message); + server.sendMessage(message); + } + + public void sendContextsToKill(ArrayList<Context> contexts) { + String message = initializeMessage("KILL"); + + for(Context ctxt : contexts) { + message += "~" + ctxt.getName(); + + + } + //System.out.println(message); + server.sendMessage(message); + } + + private String initializeMessage(String prefix) { + return prefix + "~" + amoeba.getCycle(); + } + + public boolean acq(String type, int cycle) { + String message = server.readMessage(); + String[] tokens = message.split("_"); + return type.equals(tokens[1]) && Integer.parseInt(tokens[2])==cycle; + } + +} + + + diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/ServerLauncher.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/ServerLauncher.java new file mode 100644 index 0000000000000000000000000000000000000000..56d9f2cea541dc58a639425646af78d006319974 --- /dev/null +++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/ServerLauncher.java @@ -0,0 +1,31 @@ +package experiments.UnityLauncher; + +import java.io.IOException; +import java.io.Serializable; +import java.net.ServerSocket; +import java.net.Socket; + +public class ServerLauncher implements Serializable{ + + private static ServerSocket socketserver = null; + private static Socket socket = null; + public static Thread t; + + public static void main(String[] zero) { + + try { + socketserver = new ServerSocket(2009); + System.out.println("Server ready..."); + socket = socketserver.accept(); // Un client se connecte on + // l'accepte + System.out.println("Client connected..."); + t = new Thread(new Main(socketserver, socket)); + t.start(); + + } catch (IOException e) { + System.err.println("Le port " + socket.getLocalPort() + " est d�j� utilis� !"); + e.printStackTrace(); + } + } + +} diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java new file mode 100644 index 0000000000000000000000000000000000000000..145587d28cb3d00784af81d1acc9109b7adca5f8 --- /dev/null +++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java @@ -0,0 +1,68 @@ +package experiments.UnityLauncher; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +public class SocketServer { + + private Socket socket = null; + private BufferedReader in = null; + private PrintWriter out = null; + private int counter; + + public SocketServer(ServerSocket ss, Socket s) { + socket = s; + counter = 0; + } + + public void sendMessage(String message) { + try { + // socket = socketserver.accept(); // Un client se connecte on + // l'accepte + out = new PrintWriter(socket.getOutputStream()); + out.println(message); + out.flush(); + // out.close(); + + } catch (IOException e) { + System.err.println("D�connection "); + } + + } + + public void close(){ + out.close(); + } + + public String readMessage() { + String message = ""; + try { + // socket = socketserver.accept(); // Un client se connecte on + // l'accepte + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + message = in.readLine(); + //System.out.println(message); + } catch (IOException e) { + System.err.println("Error getOutPut"); + e.printStackTrace(); + + } + + counter ++; + //System.out.println("MSG :\t" + message); + String delimsTags = "[ _~]+"; + String[] tokens = message.split(delimsTags); + + return message; + } + + public int getMessageCounter(){ + return counter; + } + + +} diff --git a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java index dd8eec8e06d319f84820121fbfff7d9d5211946f..44f17659e94c4158cb169a9b2a48759d6eaee801 100644 --- a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java +++ b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Random; +import agents.percept.Percept; import kernel.StudiedSystem; @@ -156,6 +157,8 @@ public class F_N_Manager implements StudiedSystem{ activeLearning = false; + + for(int i = 0 ; i < dimension ; i++) { x[i] = selfRequest.get("px" + i); } @@ -275,11 +278,11 @@ public class F_N_Manager implements StudiedSystem{ return modelN(xRequest); }else if (subzone == 2) { /* Gaussian model */ - return gaussianModel(xRequest, subZoneCenter2D(2), gaussianCoef, gaussianVariance); + return gaussianModel(xRequest, subZoneCenter3D(2), gaussianCoef, gaussianVariance); }else if (subzone == 3) { /* Square */ - return square2DModel(xRequest, subZoneCenter2D(3)); + return square2DModel(xRequest, subZoneCenter3D(3)); }else if (subzone == 4) { /* Exp */ @@ -366,6 +369,34 @@ public class F_N_Manager implements StudiedSystem{ } +private double[] subZoneCenter3D(int nb) { + + double[] center = new double[3]; + + if(nb == 1) { + center[0] = spaceSize; + center[1] = spaceSize; + center[2] = 0.0; + }else if(nb == 2) { + center[0] = -spaceSize; + center[1] = -spaceSize; + center[2] = 0.0; + } + else if(nb == 3) { + center[0] = -spaceSize; + center[1] = spaceSize; + center[2] = 0.0; + } + else if(nb == 4) { + center[0] = spaceSize; + center[1] = -spaceSize; + center[2] = 0.0; + } + + return center; + + } + private double gaussianMapping2D(Double[] xRequest) { return (xRequest[1] > 30*Math.exp(-(Math.pow((xRequest[0]-spaceSize)/5, 2))/2) -50) ? model1() : model2(); } @@ -410,7 +441,7 @@ public class F_N_Manager implements StudiedSystem{ 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); } @@ -648,8 +679,14 @@ public class F_N_Manager implements StudiedSystem{ } @Override - public void setSelfRequest(HashMap<String, Double> request){ - selfRequest = request; + public void setSelfRequest(HashMap<Percept, Double> request){ + HashMap<String,Double> newRequest = new HashMap<String,Double>(); + + for(Percept pct : request.keySet()) { + newRequest.put(pct.getName(), request.get(pct)); + } + + selfRequest = newRequest; } diff --git a/AMOEBAonAMAK/src/gui/ContextRendererFX.java b/AMOEBAonAMAK/src/gui/ContextRendererFX.java index 1a73a53282fd4575e34490ccea902759c5a56acc..cfe62c32fd7d5c9909ad1710e570cf216962df7f 100644 --- a/AMOEBAonAMAK/src/gui/ContextRendererFX.java +++ b/AMOEBAonAMAK/src/gui/ContextRendererFX.java @@ -43,6 +43,11 @@ public class ContextRendererFX extends RenderStrategy { Double[] c = ContextColor.colorFromCoefs(context.getFunction().getCoef()); drawable.setColor(new Color(c[0], c[1], c[2], 90d / 255d)); } + + public String getColorForUnity() { + Double[] c = ContextColor.colorFromCoefs(context.getFunction().getCoef()); + return c[0].intValue() + "," + c[1].intValue() + "," + c[2].intValue() + ",100"; + } private void updatePosition() { Percept p1 = context.getAmas().getDimensionSelector().d1(); diff --git a/AMOEBAonAMAK/src/gui/utils/ContextColor.java b/AMOEBAonAMAK/src/gui/utils/ContextColor.java index eeb82be0e028e882e9a1fe1ff04a56ba4f713ab2..b58fe9d39a5eb0e7de0496b0afe2812d25003018 100644 --- a/AMOEBAonAMAK/src/gui/utils/ContextColor.java +++ b/AMOEBAonAMAK/src/gui/utils/ContextColor.java @@ -78,6 +78,8 @@ public class ContextColor { return ret; } + + public static double normalizePositiveValues(double upperBound, double dispersion, double value) { return upperBound * 2 * (-0.5 + 1 / (1 + Math.exp(-value / dispersion))); } diff --git a/AMOEBAonAMAK/src/kernel/AMOEBA.java b/AMOEBAonAMAK/src/kernel/AMOEBA.java index f85355e2613b8c49861de0c2d198ba9b442a29f8..c243ba19742451b782943ec7b7d7133e4b36b2fc 100644 --- a/AMOEBAonAMAK/src/kernel/AMOEBA.java +++ b/AMOEBAonAMAK/src/kernel/AMOEBA.java @@ -69,6 +69,8 @@ public class AMOEBA extends Amas<World> implements IAMOEBA { private int cycleWithoutRender = 0; private ArrayList<Context> spatiallyAlteredContext = new ArrayList<>(); + private ArrayList<Context> toKillContexts = new ArrayList<>(); + private ArrayList<Context> lastModifiedContext = new ArrayList<>(); private ArrayList<Context> alteredContexts = new ArrayList<>(); @@ -80,6 +82,7 @@ public class AMOEBA extends Amas<World> implements IAMOEBA { private ReadWriteLock neighborContextsLock = new ReentrantReadWriteLock(); public AmoebaData data; + private ArrayList<Percept> percepts; /** * Instantiates a new, empty, amoeba. @@ -221,6 +224,7 @@ public class AMOEBA extends Amas<World> implements IAMOEBA { neighborContexts = null; environment.resetNbActivatedAgent(); spatiallyAlteredContext.clear(); + toKillContexts.clear(); lastModifiedContext.clear(); alteredContexts.clear(); for(Context ctxt : getContexts()) { @@ -607,13 +611,22 @@ public class AMOEBA extends Amas<World> implements IAMOEBA { } public ArrayList<Percept> getPercepts() { - ArrayList<Percept> percepts = new ArrayList<>(); - for (Agent<? extends Amas<World>, World> agent : getAgents()) { - if ((agent instanceof Percept)) { - percepts.add((Percept) agent); + + + if(percepts == null || percepts.size()==0) { + ArrayList<Percept> pcts = new ArrayList<Percept>(); + for (Agent<? extends Amas<World>, World> agent : getAgents()) { + if ((agent instanceof Percept)) { + pcts.add((Percept) agent); + } } + percepts = pcts; } + + return percepts; + + } /** @@ -697,12 +710,21 @@ public class AMOEBA extends Amas<World> implements IAMOEBA { return head; } - public ArrayList<Context> getSpatiallyAlteredContext() { + public ArrayList<Context> getSpatiallyAlteredContextForUnityUI() { return spatiallyAlteredContext; } - public void addSpatiallyAlteredContext(Context ctxt) { - spatiallyAlteredContext.add(ctxt); + public void addSpatiallyAlteredContextForUnityUI(Context ctxt) { + if(!ctxt.isFlat()) + spatiallyAlteredContext.add(ctxt); + } + + public ArrayList<Context> getToKillContextsForUnityUI() { + return toKillContexts; + } + + public void addToKillContextForUnityUI(Context ctxt) { + toKillContexts.add(ctxt); } public void addLastmodifiedContext(Context context) { @@ -808,5 +830,13 @@ public class AMOEBA extends Amas<World> implements IAMOEBA { return message; } + public void setPercepts() { + percepts = new ArrayList<Percept>(); + for (Agent<? extends Amas<World>, World> agent : getAgents()) { + if ((agent instanceof Percept)) { + percepts.add((Percept) agent); + } + } + } } diff --git a/AMOEBAonAMAK/src/kernel/AmoebaData.java b/AMOEBAonAMAK/src/kernel/AmoebaData.java index f8fa12276b77b029c06d061c0159bf79dac9955a..d843af0d4cec13c5e5f121d0c9e9de0570364df9 100644 --- a/AMOEBAonAMAK/src/kernel/AmoebaData.java +++ b/AMOEBAonAMAK/src/kernel/AmoebaData.java @@ -76,4 +76,6 @@ public class AmoebaData implements Serializable { public double[] executionTimes = new double[20]; public double[] executionTimesSums = new double[20]; + + public double initRegressionPerformance = 1.0; } \ No newline at end of file diff --git a/AMOEBAonAMAK/src/kernel/StudiedSystem.java b/AMOEBAonAMAK/src/kernel/StudiedSystem.java index 60f60d3fae6d565ac711b7f1005d9109d7a6724b..0def257b257778365c2639fb813e05a9f3fb324d 100644 --- a/AMOEBAonAMAK/src/kernel/StudiedSystem.java +++ b/AMOEBAonAMAK/src/kernel/StudiedSystem.java @@ -39,6 +39,6 @@ public interface StudiedSystem extends Serializable{ public void setActiveLearning(boolean value); - public void setSelfRequest(HashMap<String, Double> request); + public void setSelfRequest(HashMap<Percept, Double> request); } diff --git a/AMOEBAonAMAK/src/kernel/World.java b/AMOEBAonAMAK/src/kernel/World.java index 9bf8193262b79cf09c60bac4fe5f2720d1a1e44b..e248a189449055d43fff29bc5ac33ff3d1e90fdf 100644 --- a/AMOEBAonAMAK/src/kernel/World.java +++ b/AMOEBAonAMAK/src/kernel/World.java @@ -7,7 +7,9 @@ import fr.irit.smac.amak.Environment; import fr.irit.smac.amak.Scheduling; import agents.context.Context; import agents.percept.Percept; +import experiments.TestMain.Level; import ncs.NCS; +import utils.TRACE_LEVEL; /** * Store some data about the world @@ -30,6 +32,10 @@ public class World extends Environment { public int regressionPoints = 0; // TODO remove from here + + + public static TRACE_LEVEL minLevel = TRACE_LEVEL.ERROR; + private AMOEBA amoeba; /** @@ -73,12 +79,15 @@ public class World extends Environment { } } - public void trace(ArrayList<String> infos) { - String message = "" +amoeba.getCycle(); - for(String info : infos) { - message += " " + info; + public void trace(TRACE_LEVEL lvl, ArrayList<String> infos) { + if (lvl.isGE(minLevel)) { + String message = "[" +amoeba.getCycle() + "]"; + for(String info : infos) { + message += " " + info; + } + System.out.println(message); } - System.out.println(message); + } public double getAVT_acceleration() { diff --git a/AMOEBAonAMAK/src/utils/TRACE_LEVEL.java b/AMOEBAonAMAK/src/utils/TRACE_LEVEL.java new file mode 100644 index 0000000000000000000000000000000000000000..bc2da4ad5f98cbdfc9969723dcc707528bba233d --- /dev/null +++ b/AMOEBAonAMAK/src/utils/TRACE_LEVEL.java @@ -0,0 +1,15 @@ +package utils; + +public enum TRACE_LEVEL { + ERROR(200), NCS(100), EVENT(50), STATE(40), INFORM(20), DEBUG(0); + + private final int order; + + TRACE_LEVEL(final int order) { + this.order = order; + } + + public boolean isGE(final TRACE_LEVEL _other) { + return order >= _other.order; + } +}