Isis-fish-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
July 2014
- 4 participants
- 67 discussions
Author: echatellier
Date: 2014-07-10 18:41:47 +0200 (Thu, 10 Jul 2014)
New Revision: 4034
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4034
Log:
Update snapshot
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2014-07-10 16:35:38 UTC (rev 4033)
+++ trunk/pom.xml 2014-07-10 16:41:47 UTC (rev 4034)
@@ -81,7 +81,7 @@
<dependency>
<groupId>org.nuiton</groupId>
<artifactId>nuiton-profiling</artifactId>
- <version>2.7.2-SNAPSHOT</version>
+ <version>3.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
1
0
r4033 - in trunk: . src/main/java/fr/ifremer/isisfish src/main/java/fr/ifremer/isisfish/datastore src/main/java/fr/ifremer/isisfish/simulator src/main/java/fr/ifremer/isisfish/simulator/launcher src/main/java/fr/ifremer/isisfish/util
by bpoussin@users.forge.codelutin.com 10 Jul '14
by bpoussin@users.forge.codelutin.com 10 Jul '14
10 Jul '14
Author: bpoussin
Date: 2014-07-10 18:35:38 +0200 (Thu, 10 Jul 2014)
New Revision: 4033
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4033
Log:
- change version to 4.3.1.0
- add information on each step (min, max, mean, ...)
- rewrite IsisCache method for performance
- sumOverDim use semantics 1,2,3,4,... for new dimensions
Modified:
trunk/pom.xml
trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationResultXML.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java
trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/pom.xml 2014-07-10 16:35:38 UTC (rev 4033)
@@ -11,7 +11,7 @@
<groupId>fr.ifremer</groupId>
<artifactId>isis-fish</artifactId>
- <version>4.3.0.2-SNAPSHOT</version>
+ <version>4.3.1.0-SNAPSHOT</version>
<!-- POM Relationships : Inheritance : Dependencies -->
<dependencies>
Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -122,7 +122,7 @@
* migration de donnees demande automatiquement un changement de version
* d'application.
*/
- protected final static Version version = new Version(4, 3, 0, 2);
+ protected final static Version version = new Version(4, 3, 1, 0);
protected final static Version majorVersion = new Version(version.getNumber(0));
protected final static Version databaseVersion = new Version(
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -843,6 +843,10 @@
public void beforeSimulation(SimulationContext context) {
}
+ @Override
+ public void stepChange(SimulationContext context, TimeStep step) {
+ }
+
// public void addActivatedRule(ResultStorage self, Date date, RegleParam rule){
// List rules = (List)activatedRules.get(date);
// if(rules == null){
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -698,6 +698,10 @@
public void beforeSimulation(SimulationContext context) {
}
+ @Override
+ public void stepChange(SimulationContext context, TimeStep step) {
+ }
+
// public void addActivatedRule(ResultStorage self, Date date, RegleParam rule){
// List rules = (List)activatedRules.get(date);
// if(rules == null){
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -42,6 +42,8 @@
import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils;
import fr.ifremer.isisfish.types.TimeStep;
import fr.ifremer.isisfish.util.IsisCache;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
//import fr.ifremer.isisfish.util.Trace;
import org.nuiton.config.ApplicationConfig;
import org.nuiton.config.OverwriteApplicationConfig;
@@ -82,6 +84,13 @@
protected RuleMonitor ruleMonitor = null;
protected ResultManager resultManager = null;
protected Set<SimulationListener> simulationListeners = new LinkedHashSet<SimulationListener>();
+ protected PropertyChangeListener stepListener = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ SimulationContext.this.fireStepChange(new TimeStep((Integer)evt.getNewValue()));
+ }
+ };
+
protected ClassLoader classLoader = null;
protected File scriptDirectory;
/** l'objet trace qui conserve les donnees statistiques des appels de methodes */
@@ -227,6 +236,12 @@
}
}
+ public void fireStepChange(TimeStep step) {
+ for (SimulationListener l : simulationListeners) {
+ l.stepChange(this, step);
+ }
+ }
+
public void fireAfterSimulation() {
for (SimulationListener l : simulationListeners) {
l.afterSimulation(this);
@@ -306,7 +321,15 @@
* @param simulationControl The simulationControl to set.
*/
public void setSimulationControl(SimulationControl simulationControl) {
- this.simulationControl = simulationControl;
+ if (this.simulationControl != simulationControl) {
+ if (this.simulationControl != null) {
+ this.simulationControl.removePropertyChangeListener("step", stepListener);
+ }
+ this.simulationControl = simulationControl;
+ if (simulationControl != null) {
+ simulationControl.addPropertyChangeListener("step", stepListener);
+ }
+ }
}
/**
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -32,7 +32,6 @@
import java.util.List;
import java.util.Set;
-import org.apache.commons.collections4.ListUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -42,6 +41,7 @@
import fr.ifremer.isisfish.export.Export;
import fr.ifremer.isisfish.export.ExportHelper;
import fr.ifremer.isisfish.export.SensitivityExport;
+import fr.ifremer.isisfish.types.TimeStep;
/**
* Export simulation listener.
@@ -125,4 +125,8 @@
@Override
public void beforeSimulation(SimulationContext context) {
}
+
+ @Override
+ public void stepChange(SimulationContext context, TimeStep step) {
+ }
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -25,6 +25,8 @@
package fr.ifremer.isisfish.simulator;
+import fr.ifremer.isisfish.types.TimeStep;
+
/**
* You can create new SimulationListener and add it for simulation. To do that
* add tag/value in advanced parameter simulation launcher like
@@ -44,6 +46,14 @@
public void beforeSimulation(SimulationContext context);
/**
+ * Receive event when simulation change step
+ *
+ * @param context
+ * @param step
+ */
+ public void stepChange(SimulationContext context, TimeStep step);
+
+ /**
* called after simulation
*
* @param context
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -27,13 +27,11 @@
import static org.nuiton.i18n.I18n.t;
-import java.util.HashMap;
-import java.util.Map;
-
import org.apache.commons.lang3.StringUtils;
import org.nuiton.topia.TopiaContext;
import fr.ifremer.isisfish.datastore.SimulationStorage;
+import fr.ifremer.isisfish.types.TimeStep;
import fr.ifremer.isisfish.util.EvaluatorHelper;
/**
@@ -93,4 +91,8 @@
t("Can't evaluate simulation prescript"), eee);
}
}
+
+ @Override
+ public void stepChange(SimulationContext context, TimeStep step) {
+ }
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationResultXML.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationResultXML.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationResultXML.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -164,6 +164,10 @@
}
+ @Override
+ public void stepChange(SimulationContext context, TimeStep step) {
+ }
+
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -71,6 +71,8 @@
import fr.ifremer.isisfish.types.TimeStep;
import fr.ifremer.isisfish.util.CompileHelper;
import org.nuiton.math.matrix.MatrixFactory;
+import org.nuiton.profiling.Statistic;
+import org.nuiton.profiling.Unit;
/**
* Fait une simulation dans la meme jvm.
@@ -87,7 +89,45 @@
private static Log log = LogFactory
.getLog(InProcessSimulatorLauncher.class);
+ protected static class StepTimeStat implements SimulationListener {
+
+ protected long lastTime = 0;
+ protected Statistic stat = new Statistic("Step time"){
+ @Override
+ public String formatValue(long value) {
+ String result = String.valueOf(Unit.Time.nano.convertTo(Unit.Time.s, value));
+ return result;
+ }
+ };
+
+ public Statistic getStat() {
+ return stat;
+ }
+
+ @Override
+ public void beforeSimulation(SimulationContext context) {
+ }
+
+ @Override
+ public void stepChange(SimulationContext context, TimeStep step) {
+ if (lastTime == 0) {
+ lastTime = System.nanoTime();
+ } else {
+ long newTime = System.nanoTime();
+ long delta = newTime - lastTime;
+ lastTime = newTime;
+ stat.add(delta);
+ }
+ }
+
+ @Override
+ public void afterSimulation(SimulationContext context) {
+ }
+
+ }
+
protected SimulationStorage simulation;
+ protected StepTimeStat stepTimeStat = new StepTimeStat();
/**
* {@inheritDoc}
@@ -434,6 +474,9 @@
+ matrixBackend + " and " + matrixSparseBackend + " threshold: " + threshold);
simulatorObject.simulate(context);
+ simulation.getInformation().addInformation(
+ stepTimeStat.getStat().exportText(null).toString());
+
//
// Ajout des nouveaux objets créés durant la simulation
//
@@ -545,6 +588,9 @@
// - ResultStorage
context.addSimulationListener(simulation.getResultStorage());
+ // ajout du listener de statistique sur le temps de chaque pas de temps
+ context.addSimulationListener(stepTimeStat);
+
// - TODO: mexico xml result
// - TODO: vle result
String simListener = context.getSimulationStorage().getParameter()
Modified: trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java 2014-07-10 12:25:39 UTC (rev 4032)
+++ trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java 2014-07-10 16:35:38 UTC (rev 4033)
@@ -31,7 +31,6 @@
import org.aspectj.lang.ProceedingJoinPoint;
import org.nuiton.topia.persistence.TopiaEntity;
-import fr.ifremer.isisfish.simulator.SimulationContext;
import fr.ifremer.isisfish.types.TimeStep;
import java.util.HashMap;
import java.util.Map;
@@ -60,7 +59,7 @@
// la longueur du package pour minimiser la longueur des topiaId
static final private int entityPackageLenght = "fr.ifremer.isisfish.entities.".length();
- // la valeur NULL a utilise a la place de null pour les timeStep
+ // la valeur NULL a utilise a la place de null pour les timeStep, et les retours de method
static final private Object NULL = new Object();
protected long totalCall = 0;
@@ -108,44 +107,55 @@
public Object get(Method method, Object[] args, Object defaultValue) throws Throwable {
totalCall++;
- Object result = null;
+ Object result;
- String methodString = methodStringCache.get(method);
- if (methodString == null) {
- Class declaringClass = method.getDeclaringClass();
- methodString = (method.getAnnotation(Nocache.class) != null
- || declaringClass.getAnnotation(Nocache.class) != null)?
- "@" : "";
- methodString += declaringClass.getSimpleName() + "."+ method.getName();
- methodString = methodString.intern();
- methodStringCache.put(method, methodString);
- }
-
- // if method have annotation 'noCache' name start with @
- if (methodString.charAt(0) == '@') {
+ if (Void.TYPE == method.getReturnType()) {
+ // for void return type, never put it in cache, we can call directly real method
result = realCall(defaultValue);
} else {
- // compute key and keep TimeStep objet
- // le pas de temps trouve dans les arguments
- sbKey.setLength(0);
- TimeStep step = computeKey(sbKey, methodString, args);
- // on recupere le intern de la String car normalement en cache on
- // retrouve souvent les memes chaines comme cle (sinon le cache
- // servirait a rien :D)
- String key = sbKey.toString().intern();
- result = get(step, key);
- if (result == null) {
+ String methodString = methodStringCache.get(method);
+ if (methodString == null) {
+ Class declaringClass = method.getDeclaringClass();
+ methodString = (method.getAnnotation(Nocache.class) != null
+ || declaringClass.getAnnotation(Nocache.class) != null)?
+ "@" : "";
+ methodString += declaringClass.getSimpleName() + "."+ method.getName();
+ methodString = methodString.intern();
+ methodStringCache.put(method, methodString);
+ }
- // computation increment (/ by 0)
- // FIXME need to be called, but fail with empty stack
- //getTrace().traceAfterComputation(method);
+ // if method have annotation 'noCache' name start with @
+ if (methodString.charAt(0) == '@') {
result = realCall(defaultValue);
- if (result != null) { // util pour les methodes retournant void, ne fonctionne pas si on met AND !execute(void *(..)) dans l'aspect. En fait fonction seulement si utilisé avec les traces :(
- put(step, key, result);
+ } else {
+ // compute key and keep TimeStep objet
+ // le pas de temps trouve dans les arguments
+ sbKey.setLength(0);
+ TimeStep step = computeKey(sbKey, methodString, args);
+
+ // on recupere le intern de la String car normalement en cache on
+ // retrouve souvent les memes chaines comme cle (sinon le cache
+ // servirait a rien :D)
+ String key = sbKey.toString().intern();
+ result = get(step, key);
+ if (result == null) {
+
+ // computation increment (/ by 0)
+ // FIXME need to be called, but fail with empty stack
+ //getTrace().traceAfterComputation(method);
+ result = realCall(defaultValue);
+ // si return null on stock NULL pour faire la distinction
+ // entre present dans le cache ou absent (get(...) return null)
+// if (returnType != != null) { // util pour les methodes retournant void, ne fonctionne pas si on met AND !execute(void *(..)) dans l'aspect. En fait fonction seulement si utilisé avec les traces :(
+ put(step, key, result==null?NULL:result);
+// }
+ } else {
+ if (result == NULL) {
+ result = null;
+ }
+ cacheUsed++;
}
- } else {
- cacheUsed++;
}
}
return result;
1
0
r4032 - in trunk/src/main/java/fr/ifremer/isisfish: datastore entities types util
by bpoussin@users.forge.codelutin.com 10 Jul '14
by bpoussin@users.forge.codelutin.com 10 Jul '14
10 Jul '14
Author: bpoussin
Date: 2014-07-10 14:25:39 +0200 (Thu, 10 Jul 2014)
New Revision: 4032
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4032
Log:
optimisation
Modified:
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java
trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationGroupImpl.java
trunk/src/main/java/fr/ifremer/isisfish/types/TimeStep.java
trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java
trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnGuava.java
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-07-08 17:24:51 UTC (rev 4031)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-07-10 12:25:39 UTC (rev 4032)
@@ -120,11 +120,11 @@
// interne avant de l'utiliser comme cle.
internalValue = internalValue.intern();
result = internalValue;
- if (StringUtils.startsWith(internalValue, Month.class.getName())) {
+ if (StringUtils.startsWith(internalValue, "Month")) {
String val = StringUtils.substringAfter(internalValue, SEP);
int monthNumber = Integer.parseInt(val);
- result = new Month(monthNumber);
- } else if (StringUtils.startsWith(internalValue, TimeStep.class.getName())) {
+ result = Month.MONTH[monthNumber];
+ } else if (StringUtils.startsWith(internalValue, "TimeStep")) {
String val = StringUtils.substringAfter(internalValue, SEP);
int stepNumber = Integer.parseInt(val);
result = new TimeStep(stepNumber);
@@ -155,9 +155,9 @@
String result = cache.getKey(decoratedValue);
if (result == null && decoratedValue != null) {
if (decoratedValue instanceof Month) {
- result = Month.class.getName() + SEP + ((Month)decoratedValue).getMonthNumber();
+ result = "Month" + SEP + ((Month)decoratedValue).getMonthNumber();
} else if (decoratedValue instanceof TimeStep) {
- result = TimeStep.class.getName() + SEP + ((TimeStep)decoratedValue).getStep();
+ result = "TimeStep" + SEP + ((TimeStep)decoratedValue).getStep();
} else if (decoratedValue instanceof TopiaEntity) {
result = ((TopiaEntity)decoratedValue).getTopiaId() + SEP + decoratedValue;
} else {
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java 2014-07-08 17:24:51 UTC (rev 4031)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java 2014-07-10 12:25:39 UTC (rev 4032)
@@ -21,6 +21,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -67,10 +68,6 @@
* 0;2;1;4.2
* </pre>
*
- * TODO:
- * stat du nombre de demande de resultat or pas de temps courant
- * stat sur max ecart entre pas de temps courant et pas de temps demande
- *
* @author poussin
* @version $Revision$
*
@@ -89,14 +86,27 @@
/** number of step in cache */
protected int cacheStep = 13; // default to 13 months
+ /** Le pas de temps a partir duquel il faut sauver les resultats sur disque*/
+ protected TimeStep startDiskStep = null;
+
+ /** use to prevent to much call */
+ private File directoryCache;
+
/** nombre total de resultat */
protected int numberOfResult = 0;
/** nombre de resultat reellement stocke sur disque */
protected int numberOfResultOnDisk = 0;
- /** le nombre de resultat demande qui n'etait pas dans le pas de temps courant */
- protected int numberOfPastResultAsked = 0;
- /** le plus vieux pas de temps demande par rapport au pas de temps courant */
- protected int maxGapWithCurrentStep = 0;
+ /** le nombre de resultat demande */
+ protected int numberOfResultAsked = 0;
+ /** le nombre de resultat lu dans le cache */
+ protected int numberOfResultReadInCache = 0;
+ /** le nombre de resultat lu sur le disque */
+ protected int numberOfResultReadOnDisk = 0;
+ /**
+ * le plus vieux pas de temps demande par rapport au pas de temps courant
+ * lu sur le disque
+ */
+ protected int maxGapWithCurrentStepReadOnDisk = 0;
LinkedHashMap<TimeStep, Map<String, MatrixND>> cache =
new LinkedHashMap<TimeStep, Map<String, MatrixND>>() {
@@ -107,7 +117,6 @@
}
};
-
public ResultStorageCSV(SimulationStorage simulation) {
super(simulation);
@@ -120,9 +129,11 @@
return String.format(
"ResultStorageCSV:\n"
+ "\t%s results written to disk on a total of %s\n"
- + "\t%s results read outside of current step\n"
- + "\tthe oldest step was %s step before current step\n",
- numberOfResultOnDisk, numberOfResult, numberOfPastResultAsked, maxGapWithCurrentStep);
+ + "\t%s results read (%s in cache and %s on disk)\n"
+ + "\tthe oldest step read on disk was %s step before current step\n",
+ numberOfResultOnDisk, numberOfResult,
+ numberOfResultAsked, numberOfResultReadInCache, numberOfResultReadOnDisk,
+ maxGapWithCurrentStepReadOnDisk);
}
/**
@@ -130,8 +141,10 @@
* @return
*/
protected File getDirectory() {
- File file = SimulationStorage.getResultDirectory(simulation.getDirectory());
- return file;
+ if (directoryCache == null) {
+ directoryCache = SimulationStorage.getResultDirectory(simulation.getDirectory());
+ }
+ return directoryCache;
}
/**
@@ -149,6 +162,34 @@
return file;
}
+ protected HashSet<String> fileExistCache;
+ protected HashSet<String> getFileExistCache() {
+ if (fileExistCache == null) {
+ fileExistCache = new HashSet<String>();
+ File matrixDir = getMatrixDirectory("");
+ File[] resultDirs = matrixDir.listFiles();
+ if (resultDirs != null) {
+ for (File resultDir : resultDirs) {
+
+ Collections.addAll(fileExistCache, resultDir.list());
+ }
+ }
+ }
+ return fileExistCache;
+ }
+ /**
+ * Method used to know if file result exist. Usage of File.exists take to long time
+ * during simulation
+ * @param f
+ * @return
+ */
+ protected boolean fileExist(File f) {
+ return getFileExistCache().contains(f.getName());
+ }
+ protected void addFileExist(File f) {
+ getFileExistCache().add(f.getName());
+ }
+
protected MatrixND readMatrix(String file) throws IOException {
MatrixND result = null;
LineNumberReader in = null;
@@ -227,6 +268,7 @@
try {
File file = getDirectory();
FileUtils.deleteDirectory(file);
+ fileExistCache = null;
} catch (IOException eee) {
throw new IsisFishRuntimeException("Can't delete results", eee);
}
@@ -235,14 +277,7 @@
@Override
protected MatrixND readResult(TimeStep step, String name) {
// un peu de statistique (seulement en simulation
- SimulationControl sc = SimulationContext.get().getSimulationControl();
- if (sc != null) {
- TimeStep currentStep = sc.getStep();
- if (!step.equals(currentStep)) {
- numberOfPastResultAsked++;
- maxGapWithCurrentStep = Math.max(maxGapWithCurrentStep, currentStep.gap(step));
- }
- }
+ numberOfResultAsked++;
MatrixND result = null;
@@ -252,11 +287,23 @@
}
// if not found looking for result on disk
- if (result == null) {
+ if (result != null) {
+ numberOfResultReadInCache++;
+ } else {
File file = getMatrixFile(step, name);
- if (file.exists()) {
+ if (fileExist(file)) {
try {
result = readMatrix(file.getPath());
+
+ // un peu de statistique (seulement en simulation
+ numberOfResultReadOnDisk++;
+ SimulationControl sc = SimulationContext.get().getSimulationControl();
+ if (sc != null) {
+ TimeStep currentStep = sc.getStep();
+ if (!step.equals(currentStep)) {
+ maxGapWithCurrentStepReadOnDisk = Math.max(maxGapWithCurrentStepReadOnDisk, currentStep.gap(step));
+ }
+ }
} catch (IOException eee) {
log.error("Can't read result file: " + file, eee);
}
@@ -287,9 +334,6 @@
// return result;
// }
- /** Le pas de temps a partir duquel il faut sauver les resultats sur disque*/
- protected TimeStep startDiskStep = null;
-
/**
* Indique s'il faut sauver sur disque les resultats
* @param step
@@ -370,6 +414,8 @@
out.println();
}
+ // result file is writen without error, add it to fileExistCache
+ addFileExist(file);
} catch (Exception eee) {
throw new IsisFishRuntimeException("Can't write result: " + file, eee);
} finally {
Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationGroupImpl.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationGroupImpl.java 2014-07-08 17:24:51 UTC (rev 4031)
+++ trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationGroupImpl.java 2014-07-10 12:25:39 UTC (rev 4032)
@@ -199,10 +199,18 @@
}
return result;
}
-
+
+ private String toStringCache;
@Override
public String toString() {
- return t("isisfish.populationGroup.toString", this.getPopulation(),
- this.getId());
+ // trop couteux d'appeler i18n, appele des millions de fois
+ // et est vraiment raisonnable d'avoir des string != suivant le langage
+ // quel impact dans les scripts utilisateurs ?
+// return t("isisfish.populationGroup.toString", this.getPopulation(),
+// this.getId());
+ if (toStringCache == null) {
+ toStringCache = this.getPopulation().toString() + " Group " + this.getId();
+ }
+ return toStringCache;
}
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/types/TimeStep.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/types/TimeStep.java 2014-07-08 17:24:51 UTC (rev 4031)
+++ trunk/src/main/java/fr/ifremer/isisfish/types/TimeStep.java 2014-07-10 12:25:39 UTC (rev 4032)
@@ -178,6 +178,7 @@
return this.step >= d.step;
}
+ @Override
public boolean equals(Object o) {
if (o instanceof TimeStep) {
return step == ((TimeStep) o).step;
@@ -185,6 +186,7 @@
return false;
}
+ @Override
public int hashCode() {
return step;
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java 2014-07-08 17:24:51 UTC (rev 4031)
+++ trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java 2014-07-10 12:25:39 UTC (rev 4032)
@@ -33,6 +33,8 @@
import fr.ifremer.isisfish.simulator.SimulationContext;
import fr.ifremer.isisfish.types.TimeStep;
+import java.util.HashMap;
+import java.util.Map;
/**
* IsisCacheOnReferenceMap utilise pour mettre les resultats de methode durant
@@ -86,6 +88,15 @@
// }
/**
+ * La representation de la methode en string, la representation commence
+ * par un @ si il y a l'annotation noCache trouver pour cette methode.
+ */
+ protected Map<Method, String> methodStringCache = new HashMap<Method, String>();
+ // use to compute key, isis simulation is monothread, we can instanciate it here
+ // to minimise object instanciation
+ protected StringBuilder sbKey = new StringBuilder(300);
+
+ /**
* Recupere pour un pas de temps donnes une valeur calcule pour une cle.
*
* @param defaultValue la valeur par defaut a retourner si elle n'est pas en
@@ -98,14 +109,26 @@
totalCall++;
Object result = null;
- if (method.getAnnotation(Nocache.class) != null
- || method.getDeclaringClass().getAnnotation(Nocache.class) != null) {
+
+ String methodString = methodStringCache.get(method);
+ if (methodString == null) {
+ Class declaringClass = method.getDeclaringClass();
+ methodString = (method.getAnnotation(Nocache.class) != null
+ || declaringClass.getAnnotation(Nocache.class) != null)?
+ "@" : "";
+ methodString += declaringClass.getSimpleName() + "."+ method.getName();
+ methodString = methodString.intern();
+ methodStringCache.put(method, methodString);
+ }
+
+ // if method have annotation 'noCache' name start with @
+ if (methodString.charAt(0) == '@') {
result = realCall(defaultValue);
} else {
// compute key and keep TimeStep objet
- StringBuilder sbKey = new StringBuilder();
// le pas de temps trouve dans les arguments
- TimeStep step = computeKey(sbKey, method, args);
+ sbKey.setLength(0);
+ TimeStep step = computeKey(sbKey, methodString, args);
// on recupere le intern de la String car normalement en cache on
// retrouve souvent les memes chaines comme cle (sinon le cache
@@ -128,11 +151,9 @@
return result;
}
- protected TimeStep computeKey(StringBuilder sbKey, Method method, Object[] args) {
+ protected TimeStep computeKey(StringBuilder sbKey, String methodString, Object[] args) {
TimeStep result = null;
- sbKey.append(method.getDeclaringClass().getSimpleName());
- sbKey.append(".");
- sbKey.append(method.getName());
+ sbKey.append(methodString);
for (Object o : args) {
sbKey.append(";");
if (o == null) {
@@ -141,7 +162,7 @@
sbKey.append(o.toString());
} else if (o instanceof TimeStep) {
result = (TimeStep) o;
- sbKey.append(((TimeStep) o).getStep());
+ sbKey.append(result.getStep());
} else if (o instanceof TopiaEntity) {
sbKey.append(((TopiaEntity) o).getTopiaId().substring(entityPackageLenght));
} else {
@@ -149,7 +170,7 @@
sbKey.append(o.getClass().getSimpleName());
sbKey.append('@');
// et en lui ajoutant son adresse memoire en Hexa
- sbKey.append(Integer.toHexString(System.identityHashCode(o)));
+ sbKey.append(System.identityHashCode(o));
}
}
return result;
Modified: trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnGuava.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnGuava.java 2014-07-08 17:24:51 UTC (rev 4031)
+++ trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnGuava.java 2014-07-10 12:25:39 UTC (rev 4032)
@@ -292,15 +292,24 @@
double standardDeviation = Math.sqrt(variance);
double stepStandardDeviation = Math.sqrt(stepVariance);
- return String.format("%s - \n"
+ String trick = "";
+ if (sizeCache < biggestStepCached) {
+ trick = String.format(
+ "TRICK: for better performance you must set memory at least to %s\n",
+ StringUtil.convertMemory(biggestStepCached + 500 * 1024 *1024));
+ }
+ String result = String.format("%s - \n%s"
+ "\tmaxMemory: %s, cacheMemory: %s, totalCached: %s, numberStep: %s, numberEntries: %s\n"
+ "\tStep min: %s, max: %s, mean: %s, standard deviation: %s\n"
+ "\tEntry min: %s, max: %s, mean: %s, standard deviation: %s\n",
+ trick,
getClass().getSimpleName(),
StringUtil.convertMemory(maxMemory), StringUtil.convertMemory(sizeCache), StringUtil.convertMemory(totalCached), numberStepCached, numberCached,
StringUtil.convertMemory(smallestStepCached), StringUtil.convertMemory(biggestStepCached), StringUtil.convertMemory(stepMean), StringUtil.convertMemory((long)stepStandardDeviation),
StringUtil.convertMemory(smallestCached), StringUtil.convertMemory(biggestCached), StringUtil.convertMemory(mean), StringUtil.convertMemory((long)standardDeviation)
);
+
+ return result;
}
1
0
r4031 - in trunk: . src/main/java/fr/ifremer/isisfish/aspect src/main/java/fr/ifremer/isisfish/entities src/main/java/fr/ifremer/isisfish/simulator src/main/java/fr/ifremer/isisfish/simulator/launcher src/main/java/fr/ifremer/isisfish/util src/main/xmi
by bpoussin@users.forge.codelutin.com 08 Jul '14
by bpoussin@users.forge.codelutin.com 08 Jul '14
08 Jul '14
Author: bpoussin
Date: 2014-07-08 19:24:51 +0200 (Tue, 08 Jul 2014)
New Revision: 4031
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4031
Log:
- use nuiton-profiling to statistics call instead of Trace class
- add method on StrategieMonthInfo to get all Metier with proportion
Removed:
trunk/src/main/java/fr/ifremer/isisfish/util/Trace.java
Modified:
trunk/pom.xml
trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java
trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java
trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java
trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnReferenceMap.java
trunk/src/main/xmi/isis-fish.zargo
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/pom.xml 2014-07-08 17:24:51 UTC (rev 4031)
@@ -79,6 +79,13 @@
</dependency>
<dependency>
+ <groupId>org.nuiton</groupId>
+ <artifactId>nuiton-profiling</artifactId>
+ <version>2.7.2-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton.matrix</groupId>
<artifactId>nuiton-matrix</artifactId>
<version>2.4.2-SNAPSHOT</version>
Modified: trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -35,7 +35,8 @@
import org.aspectj.lang.reflect.MethodSignature;
import fr.ifremer.isisfish.simulator.SimulationContext;
-import fr.ifremer.isisfish.util.Trace;
+import org.nuiton.profiling.Trace;
+//import fr.ifremer.isisfish.util.Trace;
/**
* Permet de tracer les appels aux methodes utilisateur ainsi que l'execution
@@ -79,9 +80,11 @@
+ " || execution(* simulators..*(..))"
+ " || execution(* rules..*(..)) "
+ " || execution(* simulationplans..*(..)) "
- + " || execution(* formules..*(..))")
+// + " || execution(* formules..*(..))"
+ )
public void traceBeforeExecute(JoinPoint jp) {
- getTrace().traceBefore();
+ Method method = ((MethodSignature) jp.getSignature()).getMethod();
+ getTrace().enter(method);
}
@AfterThrowing(throwing = "ex",
@@ -89,7 +92,8 @@
+ " || execution(* simulators..*(..))"
+ " || execution(* rules..*(..)) "
+ " || execution(* simulationplans..*(..)) "
- + " || execution(* formules..*(..))")
+// + " || execution(* formules..*(..))"
+ )
public void traceAfterThrowingExecute(JoinPoint jp, Exception ex) {
// si une exeption est leve, il faut faire la meme chose
traceAfterExecute(jp);
@@ -99,9 +103,10 @@
+ " || execution(* simulators..*(..))"
+ " || execution(* rules..*(..)) "
+ " || execution(* simulationplans..*(..)) "
- + " || execution(* formules..*(..))")
+// + " || execution(* formules..*(..))"
+ )
public void traceAfterExecute(JoinPoint jp) {
Method method = ((MethodSignature) jp.getSignature()).getMethod();
- getTrace().traceAfterCall(method);
+ getTrace().exit(method);
}
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -39,6 +39,7 @@
import fr.ifremer.isisfish.IsisFishRuntimeException;
import fr.ifremer.isisfish.datastore.RegionStorage;
import fr.ifremer.isisfish.datastore.StorageException;
+import org.nuiton.math.matrix.MatrixIterator;
/**
* StrategyMonthInfoImpl.
@@ -69,6 +70,16 @@
}
}
+ @Override
+ public List<Metier> getMetierWithProportion() {
+ MatrixND mat = super.getProportionMetier();
+ List<Metier> result = new ArrayList<Metier>(mat.getDim(0));
+ for (MatrixIterator i=mat.iteratorNotZero(); i.next();) {
+ result.add((Metier)i.getSemanticsCoordinates()[0]);
+ }
+ return result;
+ }
+
public double getProportionMetier(Metier metier) {
double result = 0;
// on prend le super car ca ne sert a rien de mettre a jour,
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -42,10 +42,11 @@
import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils;
import fr.ifremer.isisfish.types.TimeStep;
import fr.ifremer.isisfish.util.IsisCache;
-import fr.ifremer.isisfish.util.Trace;
+//import fr.ifremer.isisfish.util.Trace;
import org.nuiton.config.ApplicationConfig;
import org.nuiton.config.OverwriteApplicationConfig;
import org.nuiton.math.matrix.MatrixFactory;
+import org.nuiton.profiling.Trace;
/**
* Keep all information on one simulation.
@@ -140,7 +141,7 @@
SimulationContext current = get();
current.getCache().clear();
current.cache = null;
- current.getTrace().clear();
+ current.getTrace().clearStatistics();
current.trace = null;
current.values.clear();
current.classLoader = null;
@@ -248,7 +249,7 @@
public Trace getTrace() {
if (trace == null) {
- trace = new Trace();
+ trace = new Trace(false, false);
}
return trace;
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -511,7 +511,7 @@
(end - start) / 1000000, "s'.'S"));
SimulationParameter param = simulation.getParameter();
if (param.getUseStatistic()) {
- String trace = context.getTrace().printStatisticAndClear();
+ String trace = context.getTrace().getStatisticsCSV();
simulation.getInformation().setStatistic(trace);
}
if (param.getUseCache()) {
Modified: trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/util/IsisCache.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -74,16 +74,16 @@
this.cacheBackend = cacheBackend;
}
- /**
- * Return trace object from context.
- *
- * @return trace object from context
- */
- protected Trace getTrace() {
- SimulationContext context = SimulationContext.get();
- Trace result = context.getTrace();
- return result;
- }
+// /**
+// * Return trace object from context.
+// *
+// * @return trace object from context
+// */
+// protected org.nuiton.profiling.Trace getTrace() {
+// SimulationContext context = SimulationContext.get();
+// org.nuiton.profiling.Trace result = context.getTrace();
+// return result;
+// }
/**
* Recupere pour un pas de temps donnes une valeur calcule pour une cle.
Modified: trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnReferenceMap.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnReferenceMap.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/util/IsisCacheBackendOnReferenceMap.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -84,16 +84,16 @@
public IsisCacheBackendOnReferenceMap() {
}
- /**
- * Return trace object from context.
- *
- * @return trace object from context
- */
- protected Trace getTrace() {
- SimulationContext context = SimulationContext.get();
- Trace result = context.getTrace();
- return result;
- }
+// /**
+// * Return trace object from context.
+// *
+// * @return trace object from context
+// */
+// protected Trace getTrace() {
+// SimulationContext context = SimulationContext.get();
+// Trace result = context.getTrace();
+// return result;
+// }
protected Map getCacheTimeStep(TimeStep step) {
Object key = step;
Deleted: trunk/src/main/java/fr/ifremer/isisfish/util/Trace.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/util/Trace.java 2014-07-07 16:53:07 UTC (rev 4030)
+++ trunk/src/main/java/fr/ifremer/isisfish/util/Trace.java 2014-07-08 17:24:51 UTC (rev 4031)
@@ -1,213 +0,0 @@
-/*
- * #%L
- * IsisFish
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2002 - 2010 Ifremer, Code Lutin, Benjamin Poussin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-package fr.ifremer.isisfish.util;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Stack;
-import org.apache.commons.lang3.time.DurationFormatUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Permet de tracer les appels aux methodes utilisateur ainsi que l'execution
- * a ces methodes. La difference entre les deux est lors de l'utilisation du
- * cache les appels seront superieur a l'execution car certaine valeur seront
- * reutilisé dans le cache.
- *
- * @author poussin
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-public class Trace {
-
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(Trace.class);
-
- /** nombre d'appel Cache inclus*/
- final static public int STAT_CALL = 0;
- /** nombre d'appel reel qui a fait le calcul*/
- final static public int STAT_COMPUTATION = 1;
- /** nombre d'appel vers une autre e depuis cette methode */
- final static public int STAT_CALL_NEST_METHOD = 2;
- /** temps mini d'execution de cette methode (sans le temps des autres methodes) */
- final static public int STAT_TIME_MIN = 3;
- /** temps max d'execution de cette methode (sans le temps des autres methodes) */
- final static public int STAT_TIME_MAX = 4;
- /** temps total d'execution de cette methode (sans le temps des autres methodes) */
- final static public int STAT_TIME_TOTAL = 5;
- /** temps total d'execution de cette methode (avec le temps des autres methodes) */
- final static public int STAT_TIME_TOTAL_NEST_METHOD = 6;
-
- /** nombre d'appel vers une autre e depuis cette methode */
- final static private int STACK_CALL_NEST_METHOD = 0;
- /** heure de depart de l'appel a la methode (sans le temps des autres methodes) */
- final static private int STACK_TIME_START = 1;
- /** heure de depart de l'appel a la methode (avec le temps des autres methodes) */
- final static private int STACK_TIME_START_NEST_METHOD = 2;
-
- /** array : [call's numbers, call do, min time, max time, total time, total time with child]*/
- protected Map<String, long[]> statistics = new LinkedHashMap<String, long[]>();
-
- /** array : [nest e call, start time, start time with child] */
- protected Stack<long[]> callStack = new Stack<long[]>();
-
- public Trace() {
- }
-
- public long[] getStatistics(Object e) {
- String key = String.valueOf(e);
- long [] result = statistics.get(key);
- if (result == null) {
- result = new long[]{0, 0, 0, 0, 0, 0, 0};
- statistics.put(key, result);
- }
- return result;
- }
-
- /**
- * Clear current value statistics (all is reset)
- */
- public void clear() {
- statistics.clear();
- }
-
- public void traceBefore () {
- // ajout dans le stack
- long current = System.nanoTime();
- long [] stackItem = new long[]{0, current, current};
- callStack.push(stackItem);
- }
-
- public void traceAfterCall(Object e) {
- traceAfter(e, false);
- }
- public void traceAfterComputation(Object e) {
- traceAfter(e, true);
- }
-
- protected void traceAfter(Object e, boolean computation) {
- long current = System.nanoTime();
-
- if (callStack.isEmpty()) {
- log.warn("Empty stack in after for " + e);
- } else {
- long [] stackItem = callStack.pop();
- long timeSpent = current - stackItem[STACK_TIME_START];
- long timeSpentNestMethod = current - stackItem[STACK_TIME_START_NEST_METHOD];
-
- long [] stat = getStatistics(e);
- if (computation) {
- stat[STAT_COMPUTATION]++; // add +1 to computation number
- } else {
- // on incremente pas tout le temps STAT_CALL, car le plus
- // souvent lors de l'utilisation de l'objet Trace dans un cache
- // on a deja compte l'appel et reappelle lui meme computation
- // ce qui ferait 2 appel alors qu'il n'y en a qu'un en realite
- stat[STAT_CALL]++; // add +1 to call number
- }
- stat[STAT_CALL_NEST_METHOD] += stackItem[STACK_CALL_NEST_METHOD];
- stat[STAT_TIME_TOTAL] += timeSpent;
- stat[STAT_TIME_TOTAL_NEST_METHOD] += timeSpentNestMethod;
- if (stat[STAT_TIME_MIN] > timeSpent) {
- stat[STAT_TIME_MIN] = timeSpent;
- }
- if (stat[STAT_TIME_MAX] < timeSpent) {
- stat[STAT_TIME_MAX] = timeSpent;
- }
-
- if (!callStack.isEmpty()) {
- long [] parent = callStack.peek();
- parent[STACK_CALL_NEST_METHOD]++; // add +1 to call number nest e
- parent[STACK_TIME_START] += timeSpentNestMethod; // remove to time all time spent in nest e (yes + to remove :)
- }
- }
-
- // ajouter le delta de temps dans le temps passé dans la méthod
-
- // il faud garder le temps passé dans l'appel d'autre methode de la stack
- // --> A
- // =========
- // --> B
- // <-- B
- // =========
- // --> C
- // --> D
- // <-- D
- // <-- C
- // =========
- // <-- A
-
- // le temps reellement passé dans A est representé par les =====
- }
-
- public String printStatisticAndClear() {
- long call = 0;
- long computation = 0;
- StringBuffer result = new StringBuffer();
- result.append("--- " + " Statistics ---\n");
- for (String e : statistics.keySet()) {
- long[] stat = getStatistics(e);
-
- // fix / by zero
- // if Cache aspect has not been selected
- if (stat[STAT_COMPUTATION] == 0) {
- stat[STAT_COMPUTATION] = stat[STAT_CALL];
- }
-
- long meanTime = stat[STAT_TIME_TOTAL] / stat[STAT_COMPUTATION];
- call += stat[STAT_CALL];
- computation += stat[STAT_COMPUTATION];
- result.append(
- e +
- " call: " + stat[STAT_CALL] +
- " computation: " + stat[STAT_COMPUTATION] +
- // usage du cache
- "(" + (100*stat[STAT_COMPUTATION]/stat[STAT_CALL]) + "%)" +
- // Time is in nano not millis, we must divide by 1000000
- " min: " + DurationFormatUtils.formatDuration(stat[STAT_TIME_MIN] / 1000000, "s'.'S") +
- " mean: " + DurationFormatUtils.formatDuration(meanTime / 1000000, "s'.'S") +
- " max: " + DurationFormatUtils.formatDuration(stat[STAT_TIME_MAX] / 1000000, "s'.'S") +
- " total: " + DurationFormatUtils.formatDuration(stat[STAT_TIME_TOTAL] / 1000000, "s'.'S") +
- " call_nest: " + stat[STAT_CALL_NEST_METHOD] +
- " total_with_nest: " + DurationFormatUtils.formatDuration(stat[STAT_TIME_TOTAL_NEST_METHOD] / 1000000, "s'.'S") +
- "\n");
- }
- result.append("--------------------\n");
- result.append("Total call: " + call + "\n");
- result.append("Total computation: " + computation + "\n");
- result.append("Cache usage: " + (100 * (call-computation) / (call+1/*+1 pour la / par 0 */) ) + "%" + "\n");
- result.append("--------------------\n");
- callStack.clear();
- statistics.clear();
-
- System.out.println(result.toString());
- return result.toString();
- }
-
-}
Modified: trunk/src/main/xmi/isis-fish.zargo
===================================================================
(Binary files differ)
1
0
r4030 - in trunk/src/main/java/fr/ifremer/isisfish: . aspect datastore simulator ui/input/check
by bpoussin@users.forge.codelutin.com 07 Jul '14
by bpoussin@users.forge.codelutin.com 07 Jul '14
07 Jul '14
Author: bpoussin
Date: 2014-07-07 18:53:07 +0200 (Mon, 07 Jul 2014)
New Revision: 4030
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4030
Log:
use new sparse matrix
use new IteratorNotZero when possible
Modified:
trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java
trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java
trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java
trunk/src/main/java/fr/ifremer/isisfish/ui/input/check/CheckRegion.java
Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-07-01 15:33:08 UTC (rev 4029)
+++ trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-07-07 16:53:07 UTC (rev 4030)
@@ -54,7 +54,6 @@
import fr.ifremer.isisfish.actions.OtherAction;
import fr.ifremer.isisfish.actions.SimulationAction;
import fr.ifremer.isisfish.actions.VCSAction;
-import fr.ifremer.isisfish.datastore.SimulationStorage;
import fr.ifremer.isisfish.simulator.SimulationContext;
import fr.ifremer.isisfish.simulator.SimulationControl;
import fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher;
@@ -64,8 +63,7 @@
import fr.ifremer.isisfish.util.IsisCacheBackend;
import fr.ifremer.isisfish.util.IsisCacheBackendOnGuava;
import fr.ifremer.isisfish.vcs.VCS;
-import org.nuiton.config.OverwriteApplicationConfig;
-import org.nuiton.math.matrix.DoubleVector;
+import org.nuiton.math.matrix.DoubleSparseHashVector;
/**
* Isis fish configuration.
@@ -1083,7 +1081,7 @@
// pour les simulations
SIMULATION_MATRIX_VECTOR_CLASS("simulation.matrix.vector.class", n("isisfish.config.simulation.matrix.vector.class.description"), DoubleBigVector.class.getName()),
- SIMULATION_MATRIX_VECTOR_SPARSE_CLASS("simulation.matrix.vector.sparse.class", n("isisfish.config.simulation.matrix.vector.sparse.class.description"), DoubleVector.class.getName()),
+ SIMULATION_MATRIX_VECTOR_SPARSE_CLASS("simulation.matrix.vector.sparse.class", n("isisfish.config.simulation.matrix.vector.sparse.class.description"), DoubleSparseHashVector.class.getName()),
SIMULATION_MATRIX_THRESHOLD_USE_SPARSE_CLASS("simulation.matrix.threshold.use.sparse.class", n("isisfish.config.simulation.matrix.threshold.use.sparse.class.description"), "1000"),
SIMULATION_STORE_RESULT_ON_DISK("simulation.store.result.ondisk", n("isisfish.config.simulation.store.result.ondisk.description"), "-1"),
SIMULATION_STORE_RESULT_CACHE_STEP("simulation.store.result.cachestep", n("isisfish.config.simulation.store.result.cachestep.description"), "13"),
Modified: trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java 2014-07-01 15:33:08 UTC (rev 4029)
+++ trunk/src/main/java/fr/ifremer/isisfish/aspect/TraceAspect.java 2014-07-07 16:53:07 UTC (rev 4030)
@@ -76,8 +76,6 @@
}
@Before("execution(* scripts..*(..))"
- + " || execution(* fr.ifremer.isisfish.entities..*(..))"
- + " || execution(* org.nuiton.math.matrix..*(..))"
+ " || execution(* simulators..*(..))"
+ " || execution(* rules..*(..)) "
+ " || execution(* simulationplans..*(..)) "
@@ -88,8 +86,6 @@
@AfterThrowing(throwing = "ex",
pointcut = "execution(* scripts..*(..))"
- + " || execution(* fr.ifremer.isisfish.entities..*(..))"
- + " || execution(* org.nuiton.math.matrix..*(..))"
+ " || execution(* simulators..*(..))"
+ " || execution(* rules..*(..)) "
+ " || execution(* simulationplans..*(..)) "
@@ -100,8 +96,6 @@
}
@After("execution(* scripts..*(..))"
- + " || execution(* fr.ifremer.isisfish.entities..*(..))"
- + " || execution(* org.nuiton.math.matrix..*(..))"
+ " || execution(* simulators..*(..))"
+ " || execution(* rules..*(..)) "
+ " || execution(* simulationplans..*(..)) "
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-07-01 15:33:08 UTC (rev 4029)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-07-07 16:53:07 UTC (rev 4030)
@@ -761,7 +761,7 @@
// mettre la matrice
MatrixND submat = resultMat.getSubMatrix(0, d, 1);
// on met les valeur de mat dans la sous matrice extraite
- for (MatrixIterator mi = mat.iterator(); mi.next();) {
+ for (MatrixIterator mi = mat.iteratorNotZero(); mi.next();) {
submat.setValue(
ArrayUtil.concat(new Object[] { d },
mi.getSemanticsCoordinates()), mi.getValue());
Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java 2014-07-01 15:33:08 UTC (rev 4029)
+++ trunk/src/main/java/fr/ifremer/isisfish/simulator/PopulationMonitor.java 2014-07-07 16:53:07 UTC (rev 4030)
@@ -138,7 +138,7 @@
MatrixND n = getN(pop);
if (n != null) {
n = n.sumOverDim(1);
- for (MatrixIterator i = n.iterator(); i.next();) {
+ for (MatrixIterator i = n.iteratorNotZero(); i.next();) {
Object[] coord = i.getSemanticsCoordinates();
PopulationGroup group = (PopulationGroup) coord[0];
result += i.getValue() * group.getMeanWeight();
@@ -204,7 +204,7 @@
log.trace("Matrix repro before mortality: " + reproduction);
}
- for (MatrixIterator mi = reproduction.iterator(); mi.next();) {
+ for (MatrixIterator mi = reproduction.iteratorNotZero(); mi.next();) {
Object[] sems = mi.getSemanticsCoordinates();
Zone z = (Zone) sems[0];
double coeff = pop.getNaturalDeathBirth(z);
@@ -343,7 +343,7 @@
for (MatrixIterator i = catchPerStrategyMet.iterator(); i.next();) {
this.totalHoldCatch += i.getValue();
}
-
+ // this.totalHoldCatch += catchPerStrategyMet.sumAll();
}
/**
Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/input/check/CheckRegion.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/ui/input/check/CheckRegion.java 2014-07-01 15:33:08 UTC (rev 4029)
+++ trunk/src/main/java/fr/ifremer/isisfish/ui/input/check/CheckRegion.java 2014-07-07 16:53:07 UTC (rev 4030)
@@ -168,8 +168,8 @@
static public boolean isNullMatrix(MatrixND mat) {
boolean result = true;
if (mat != null) {
- for (MatrixIterator i = mat.iterator(); result && i.next();) {
- result = i.getValue() == 0;
+ for (MatrixIterator i = mat.iteratorNotZero(); result && i.next();) {
+ result = false;
}
}
return result;
@@ -184,10 +184,7 @@
}
static public double sumMatrix(MatrixND mat) {
- double result = 0;
- for (MatrixIterator i = mat.iterator(); i.next();) {
- result += i.getValue();
- }
+ double result = mat.sumAll();
return result;
}
1
0
r4029 - trunk/src/main/java/fr/ifremer/isisfish/datastore
by bpoussin@users.forge.codelutin.com 01 Jul '14
by bpoussin@users.forge.codelutin.com 01 Jul '14
01 Jul '14
Author: bpoussin
Date: 2014-07-01 17:33:08 +0200 (Tue, 01 Jul 2014)
New Revision: 4029
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4029
Log:
bug fix with semantics ducarated and undecorated mixed
Modified:
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-07-01 07:55:11 UTC (rev 4028)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-07-01 15:33:08 UTC (rev 4029)
@@ -166,7 +166,8 @@
// on retrouve souvent les memes semantiques dans les matrices
// pour minimiser les chaines en memoire, on prend la representation
// interne avant de l'utiliser comme cle.
- cache.put(result.intern(), decoratedValue);
+ result = result.intern();
+ cache.put(result, decoratedValue);
}
return result;
}
@@ -277,11 +278,15 @@
protected List<String> undecorate(List l) {
ArrayList<String> result = new ArrayList<String>(l.size());
for (Object o : l) {
- result.add(decorator.undecorate(o));
+ result.add(undecorate(o));
}
return result;
}
+ protected String undecorate(Object o) {
+ return decorator.undecorate(o);
+ }
+
@Override
public void delete() {
close();
@@ -562,7 +567,7 @@
// collect des semantics. +1 pour les dates
List[] sem = new List[1 + sample.getDimCount()];
- sem[0] = steps;
+ sem[0] = undecorate(steps);
for (int i = 1; i < sem.length; i++) {
sem[i] = new HashList();
@@ -582,16 +587,17 @@
// recuperation du resultat pour chaque date de la simulation, de Date(0) à lastDate
for (Map.Entry<TimeStep, MatrixND> result : results.entrySet()) {
- TimeStep d = result.getKey();
+ TimeStep s = result.getKey();
+ String stepString = undecorate(s);
MatrixND m = result.getValue();
// on recupere dans la matrice resultat l'endroit on il faut
// mettre la matrice
- MatrixND submat = resultMat.getSubMatrix(0, d, 1);
+ MatrixND submat = resultMat.getSubMatrix(0, stepString, 1);
// on met les valeur de mat dans la sous matrice extraite
- for (MatrixIterator mi = m.iterator(); mi.next();) {
+ for (MatrixIterator mi = m.iteratorNotZero(); mi.next();) {
submat.setValue(
- ArrayUtil.concat(new Object[] { d },
+ ArrayUtil.concat(new Object[] { stepString },
mi.getSemanticsCoordinates()), mi.getValue());
}
}
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java 2014-07-01 07:55:11 UTC (rev 4028)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java 2014-07-01 15:33:08 UTC (rev 4029)
@@ -4,6 +4,7 @@
import fr.ifremer.isisfish.IsisFish;
import fr.ifremer.isisfish.IsisFishRuntimeException;
import fr.ifremer.isisfish.simulator.SimulationContext;
+import fr.ifremer.isisfish.simulator.SimulationControl;
import fr.ifremer.isisfish.types.TimeStep;
import fr.ifremer.isisfish.util.SimpleParser;
import java.io.BufferedWriter;
@@ -233,11 +234,14 @@
@Override
protected MatrixND readResult(TimeStep step, String name) {
- // un peu de statistique
- TimeStep currentStep = SimulationContext.get().getSimulationControl().getStep();
- if (!step.equals(currentStep)) {
- numberOfPastResultAsked++;
- maxGapWithCurrentStep = Math.max(maxGapWithCurrentStep, currentStep.gap(step));
+ // un peu de statistique (seulement en simulation
+ SimulationControl sc = SimulationContext.get().getSimulationControl();
+ if (sc != null) {
+ TimeStep currentStep = sc.getStep();
+ if (!step.equals(currentStep)) {
+ numberOfPastResultAsked++;
+ maxGapWithCurrentStep = Math.max(maxGapWithCurrentStep, currentStep.gap(step));
+ }
}
MatrixND result = null;
1
0
r4028 - trunk/src/main/java/fr/ifremer/isisfish/datastore
by bpoussin@users.forge.codelutin.com 01 Jul '14
by bpoussin@users.forge.codelutin.com 01 Jul '14
01 Jul '14
Author: bpoussin
Date: 2014-07-01 09:55:11 +0200 (Tue, 01 Jul 2014)
New Revision: 4028
Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4028
Log:
add getInfo method
Modified:
trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java
Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java
===================================================================
--- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-06-30 17:08:42 UTC (rev 4027)
+++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-07-01 07:55:11 UTC (rev 4028)
@@ -106,6 +106,11 @@
}
@Override
+ public String getInfo() {
+ return "ResultDatabaseStorage no more info.";
+ }
+
+ @Override
public void delete() {
TopiaContext tx = null;
boolean mustClose = false;
1
0