Re Hello , desolee je n arrive pas a corriger le script pour exporter l historique en particulier je ne comprend pas la structure des 2 objets Experiences et Experience, en quoi sont ils differents ? je joins les scripts du plan d analyse (calibrationAnchois3) et de l export (experiencxesCalibration), si tu as le temps de regarder et de m appeler ca serait chouette merci ! Sigrid Sigrid LEHUTA a écrit :
Salut Benjamin,
je ressors les fantomes du placard :
nous souhaitons exporter la list Experience.getHistory () du plan d analyse Calibration a l epoque tu as preconise ceci : ====================================================================
modifier le plan protected Experiences experiences = new Experiences(); /** * @return the experiences */ public Experiences getExperiences() { return this.experiences; } ... public class Experiences { /** contains last simplex and potentialy 2 more simulation */ protected List<Experience> current = new ArrayList<Experience>(); /** contains all experience done */ protected List<Experience> history = new ArrayList<Experience>(); /** * @return the history */ public List<Experience> getHistory() { return this.history; } ...
public class Experience implements Comparable { public int simNumber; ...
Dans un export
analyseplans.Calibration p = (analyseplans.Calibration)simulation.getParameter().getAnalysePlans().get(0);
List<analyseplans.Calibration.Experience> l = p.getExperiences().getHistory(); System.out.println("Nombre d'experience: " + l.size()); for (analyseplans.Calibration.Experience e : l) { }
Si tu n'as rien dans la liste, il faudra trouver une autre solution :)
===================================================================================
1) on ne voit pas ce que tu modifies dans le plan d analyse...
2) voici le message d erreur qui apparait dans error ============================================================================
(SimulationControl.java:127) setText - begin step janvier 0 C:\Documents and Settings\slehuta\isis-database-3\exports\ExperiencesCalibration.java:59: cannot find symbol symbol : class List location: class exports.ExperiencesCalibration List <analyseplans.CalibrationAnchois3.Experience> l = p.getExperiences().getHistory(); ^ C:\Documents and Settings\slehuta\isis-database-3\exports\ExperiencesCalibration.java:59: analyseplans.CalibrationAnchois3.Experience is not public in analyseplans.CalibrationAnchois3; cannot be accessed from outside package List <analyseplans.CalibrationAnchois3.Experience> l = p.getExperiences().getHistory(); ^ C:\Documents and Settings\slehuta\isis-database-3\exports\ExperiencesCalibration.java:59: cannot find symbol symbol : method getExperiences() location: class analyseplans.CalibrationAnchois3 List <analyseplans.CalibrationAnchois3.Experience> l = p.getExperiences().getHistory(); ^ C:\Documents and Settings\slehuta\isis-database-3\exports\ExperiencesCalibration.java:61: analyseplans.CalibrationAnchois3.Experience is not public in analyseplans.CalibrationAnchois3; cannot be accessed from outside package for (analyseplans.CalibrationAnchois3.Experience e : l) { ^ 4 errors INFO [SimThread test export calib 2007-09-14-10-43] (CompileHelper.java:106) loadClass - Impossible de charger la classe exports.ExperiencesCalibration java.lang.ClassNotFoundException: exports.ExperiencesCalibration at fr.ifremer.isisfish.aspect.AspectClassLoader.findClass(AspectClassLoader.java:82)
at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at fr.ifremer.isisfish.util.CompileHelper.loadClass(CompileHelper.java:104) at fr.ifremer.isisfish.datastore.JavaSourceStorage.getCodeClass(JavaSourceStorage.java:115)
at fr.ifremer.isisfish.datastore.JavaSourceStorage.getNewInstance(JavaSourceStorage.java:130)
at fr.ifremer.isisfish.datastore.ExportStorage.getNewExportInstance(ExportStorage.java:73)
at fr.ifremer.isisfish.datastore.ResultStorage.isEnabled(ResultStorage.java:197)
at simulators.DefaultSimulator.simulate(DefaultSimulator.java:145) at fr.ifremer.isisfish.simulator.SimulationHelper.localSimulateSameThread(SimulationHelper.java:464)
at fr.ifremer.isisfish.simulator.SimulationHelper$SimThread.run(SimulationHelper.java:369)
WARN [SimThread test export calib 2007-09-14-10-43] (ResultStorage.java:203) isEnabled - Cant instanciate export {0} fr.ifremer.isisfish.IsisFishException: Can't load class exports.ExperiencesCalibration at fr.ifremer.isisfish.datastore.JavaSourceStorage.getCodeClass(JavaSourceStorage.java:118)
at fr.ifremer.isisfish.datastore.JavaSourceStorage.getNewInstance(JavaSourceStorage.java:130)
at fr.ifremer.isisfish.datastore.ExportStorage.getNewExportInstance(ExportStorage.java:73)
at fr.ifremer.isisfish.datastore.ResultStorage.isEnabled(ResultStorage.java:197)
at simulators.DefaultSimulator.simulate(DefaultSimulator.java:145) at fr.ifremer.isisfish.simulator.SimulationHelper.localSimulateSameThread(SimulationHelper.java:464)
at fr.ifremer.isisfish.simulator.SimulationHelper$SimThread.run(SimulationHelper.java:369)
=========================================================================================
et celui de l editeur de script ============================================ C:\Documents and Settings\slehuta\isis-database-3\exports\ExperiencesCalibration.java:66: analyseplans.CalibrationAnchois3.Experience is not public in analyseplans.CalibrationAnchois3; cannot be accessed from outside package List<analyseplans.CalibrationAnchois3.Experience> l = p.getExperiences().getHistory(); ===========================================
------------------------------------------------------------------------
_______________________________________________ Isis-fish-devel mailing list Isis-fish-devel@lists.labs.libre-entreprise.org http://lists.labs.libre-entreprise.org/mailman/listinfo/isis-fish-devel
-- Sigrid LEHUTA ~ ><> ~ Ecologie et Modèles pour l'Halieutique IFREMer, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 package analyseplans; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.ResultName; import java.io.*; import java.util.*; import org.codelutin.math.matrix.*; import org.codelutin.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.codelutin.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.types.*; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.simulator.AnalysePlan; import fr.ifremer.isisfish.simulator.AnalysePlanContext; import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * CalibrationAnchois.java * * Created: 8 mars 2007 * * @author <> * @version $Revision: 1.1 $ * * Last update: $Date: 2007/03/09 15:27:21 $ * by : $Author: bpoussin $ */ public class CalibrationAnchois3 implements AnalysePlan { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(CalibrationAnchois3.class); enum State {STATE_INIT, STATE_0, STATE_1, STATE_2, STATE_3, STATE_4}; //parametres de la simu 3 points initiaux d un simplex d ordre 2 public Population param_Population = null; public String param_M1 = "2.42e-5;2.11e-6";// devient un parametre du plan d analyse public String param_M2 = "2.34e-5;2.59e-6";// devient un parametre du plan d analyse public String param_M3 = "2.59e-5;2.41e-6";// devient un parametre du plan d analyse public String param_pas = "1e-5";// devient un parametre du plan d analyse public String param_nomfichier_debarquements = "";//nom + chemin du fichier contenant les debarquements observes par groupe pour la derniere annee protected File debarquementsObserves; protected MatrixND matrixDebarquement; protected State state = State.STATE_INIT; public Experiences experiences = new Experiences(); public String [] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET }; public String[] getNecessaryResult() { return this.necessaryResult; } /** * Permet d'afficher a l'utilisateur une aide sur le plan. * @return L'aide ou la description du plan */ public String getDescription() throws Exception { return _("Simplexe_methode2 avec simu inutiles evitées"); } /** * Appele au demarrage de la simulation, cette methode permet d'initialiser * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(AnalysePlanContext context) throws Exception { if (param_nomfichier_debarquements==null || "".equals(param_nomfichier_debarquements)){ debarquementsObserves = FileUtil.getFile(".*.csv", "fichier csv séparateur ';'"); } else { debarquementsObserves = new File(param_nomfichier_debarquements); } int nbYear = context.getParam().getNumberOfYear(); TopiaContext db = context.getParam().getRegion().getStorage().beginTransaction(); Population pop = (Population)db.findByTopiaId(param_Population.getTopiaId()); int nbGroup = 4 ;//pop.sizePopulationGroup(); int nbTrim = nbYear * 4; int [] dimMatrix = {nbTrim,nbGroup}; matrixDebarquement = MatrixFactory.getInstance().create(dimMatrix); //matrixDebarquement = MatrixFactory.getInstance().create(new int[]{nbGroup}); // List<PopulationGroup> groups = pop.getPopulationGroup(); // matrixDebarquement = MatrixFactory.getInstance().create(new List[]{groups}); matrixDebarquement.importCSV(new FileReader(debarquementsObserves),new int []{0,0}); db.closeContext(); } /** * Call before each simulation * @param context plan context * @param nextSimulation storage used for next simulation * @return true if we must do next simulation, false to stop plan * @throws Exception */ double g1; double g2; double worst1; double worst2; public boolean beforeSimulation(AnalysePlanContext context, SimulationStorage nextSimulation) throws Exception { boolean doNext = true; boolean doBoucle = true; log.info("before simulation"); int number = context.getNumber(); if (number <3) { log.info("number<3"); String [] M1 = param_M1.split(";"); String [] M2 = param_M2.split(";"); String [] M3 = param_M3.split(";"); double [] q1 = StringUtil.toArrayDouble(M1[0], M2[0], M3[0]); double [] q2 = StringUtil.toArrayDouble(M1[1], M2[1], M3[1]); experiences.getExperience(number).q1 = q1[number]; experiences.getExperience(number).q2 = q2[number]; changeDB(experiences.getExperience(number), nextSimulation); } else { double q1 = 1000; double q2 = 1000; double lastCritere = experiences.getExperience(number-1).criteria; while (doBoucle){ doBoucle = false; if (state == State.STATE_INIT) { doBoucle = false ; log.info("state init"); //ordonne les 3 premieres experiences selon leur critere Collections.sort(experiences.current); //log.info("SIMPLEXE : current 0 = " + experiences.current.get(0).criteria + "current 1 = " + experiences.current.get(1).criteria + "current 2 = " + experiences.current.get(2).criteria ); log.info("SIMPLEXE : current 0 = " + experiences.current.get(0).criteria + "current 1 = " + experiences.current.get(1).criteria + "current 2 = " + experiences.current.get(2).criteria ); log.info("SIMPLEXE : Best q1 = " + experiences.current.get(0).q1 + " q2 = " + experiences.current.get(0).q2); log.info("SIMPLEXE : NextBest q1 = " + experiences.current.get(1).q1 + " q2 = " + experiences.current.get(1).q2); log.info("SIMPLEXE : Worst q1 = " + experiences.current.get(2).q1 + " q2 = " + experiences.current.get(2).q2); //Calcul et evaluation de R double g1 = (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0; double g2 = (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0; double worst1 = experiences.current.get(2).q1; double worst2 = experiences.current.get(2).q2; state = State.STATE_0; q1 = 2 * g1 - worst1; q2 = 2 * g2 - worst2; log.info ("R : q1 = " + q1 + "; q2 = " + q2 ); } else if (state == State.STATE_0) { doBoucle = false; log.info("state 0"); // on fait la 5eme avec des q qui dependent de la 4eme dans le dernier cas //log.info("g1 = " + g1 + " " + "g2 = " + g2); //log.info("worst1 = " + worst1 + " " + "worst2 = " + worst2); if (lastCritere > experiences.current.get(2).criteria) { log.info("State 0 : R : lastCtritere > current2 : R pire de W"); state = State.STATE_1; //calcul de Cw q1 = ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) - ( ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) - experiences.current.get(2).q1 ) / 2.0; q2 = ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) - ( ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) - experiences.current.get(2).q2 ) / 2.0; log.info("Cw : Q1 = " + q1 + "Q2 = " + q2); } else if (lastCritere > experiences.current.get(1).criteria) { log.info("State 0 :R : lastCritere > current 1 : R meilleur que W et moins bon que N"); state = State.STATE_2; // calcul de Cr q1 = ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) + ( ((experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0) - experiences.current.get(2).q1 ) / 2.0; q2 = ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) + ( ((experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0) - experiences.current.get(2).q2 ) / 2.0; log.info("Cr : Q1 = " + q1 + "Q2 = " + q2); } else if (lastCritere > experiences.current.get(0).criteria) { log.info("State 0 :R : lastCritere > current0 : R meilleur que N et moins bon que B"); state = State.STATE_INIT; experiences.current.remove(2);//remove(3)avant doBoucle = true; log.info("remove W, simplex BNR"); } else { // dernier cas possible: if (lastCritere < experiences.current.get(0).critere) { log.info("State 0 :R : lastCritere < current 0 : R meilleur que B, calcul de E"); state = State.STATE_4; q1 = experiences.getExperience(number-1).q1 + (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0 - experiences.current.get(2).q1; q2 = experiences.getExperience(number-1).q2 + (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0 - experiences.current.get(2).q2; //q1 = experiences.current.get(3).q1 + (experiences.current.get(0).q1 + experiences.current.get(1).q1) / 2.0 - experiences.current.get(2).q1; //q2 = experiences.current.get(3).q2 + (experiences.current.get(0).q2 + experiences.current.get(1).q2) / 2.0 - experiences.current.get(2).q2; log.info("E : q1 = " + q1 + "q2 = " + q2); } } else if (state == State.STATE_1) { log.info("state 1, simplex BNCw"); experiences.current.remove(3); experiences.current.remove(2); state = State.STATE_INIT; doBoucle = true; } else if (state == State.STATE_2) { log.info("state 2, simplex BNCr"); experiences.current.remove(3); experiences.current.remove(2); state = State.STATE_INIT; doBoucle = true; } else if (state == State.STATE_4) { log.info("state 4 :comparaison de E a B"); doBoucle = true; if (lastCritere < experiences.current.get(0).criteria) { log.info("E meilleur que B, remove 2 et 3 : simplex BNE"); experiences.current.remove(3); experiences.current.remove(2); } else { log.info("E moins bon que B, remove 2 et 4, simplex BNR"); experiences.current.remove(4); experiences.current.remove(2); } state = State.STATE_INIT; } }//fin du while //on remplit la table experiences experiences.getExperience(number).q1 = q1; experiences.getExperience(number).q2 = q2; log.info("on change Q dans la DB avec : q1 = " + q1 + " " + "q2 = " + q2); // on change la valeur de q dans la DB changeDB(experiences.getExperience(number), nextSimulation); }// fin du else (number > 3) return doNext; }// fin du before simulation /** * Call after each simulation, compute criteria for last simulation * @param context plan context * @param nextSimulation storage used for next simulation * @return true if we must do next simulation, false to stop plan * @throws Exception */ public boolean afterSimulation(AnalysePlanContext context, SimulationStorage lastSimulation) throws Exception { boolean doNext = true; log.info("after simulation"); int number = context.getNumber(); ResultStorage result = lastSimulation.getResultStorage(); // Pour sommer sur certaines classes les resultats : MatrixND L2 = result.getMatrix(param_Population, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET); log.info("dim de L2" + " " + Arrays.toString(L2.getDim())); MatrixND L = L2.getSubMatrix(1,0,15).copy(); //on ne prend que les 15 premieres strategies (pas live bait) //log.info("sous matrice extraite"); L = L.sumOverDim(1);// sum sur les strategies L = L.sumOverDim(2);// sum sur les metiers L = L.sumOverDim(4);// sum sur les zones log.info("sommes sur les strategies, metiers et zones faites"); // on crée la matrice de captures en age int [] dims = new int[]{L.getDim(0), L.getDim(1), L.getDim(2), 4, L.getDim(4)}; // matrice a 5 dimension MatrixND tmp = MatrixFactory.getInstance().create(L.getName(), dims); int [] origin = new int[5]; // origin est un compteur : on initialise l'origine a [0,0,0,0,0] log.info("Début de la boucle while"); while (origin[0] < dims[0]-1){ //on boucle sur les dates //remarque : origin commence à 0 tandis que dim[0] commence a 1 Date date = new Date(origin[0]); // transforme le pas de temps en mois-année MatrixND age = L.getSubMatrix(0,origin[0],1).copy(); //recupere la la ligne qui correspond a la date // on somme les classes de taille en fonction de la periode de l année if (date.getMonth().before(Month.JULY)) { age = age.sumOverDim(3,0,5); age = age.sumOverDim(3,1,10); age = age.sumOverDim(3,2,1); age = age.sumOverDim(3,3,2); }else if (date.getMonth().equals(Month.JULY) || date.getMonth().equals(Month.AUGUST)) { //origin[0] >= 6+i*12 && origin[0]<= 7+i*12 ){ age = age.sumOverDim(3,0,5); age = age.sumOverDim(3,1,11); age = age.sumOverDim(3,2,1); age = age.sumOverDim(3,3,1); } else { // apres aout //(origin[0] >= 8+i*12 && origin[0]<= 11+i*12 ) age = age.sumOverDim(3,0,15); age = age.sumOverDim(3,1,1); age = age.sumOverDim(3,2,1); age = age.sumOverDim(3,3,1); }//fin du else tmp.paste (origin, age); // colle les nouvelles captures pour la date dans tmp origin[0]++; }//fin du while log.info("fin du while"); L = tmp.sumOverDim(0,3); // captures par trimestre L = L.reduce(); // supprime les dimensions de taille 0 ///////////////////Calcul du critere////////////////// log.info("calcul du critere"); log.info("dim de L" + " " + Arrays.toString(L.getDim())); log.info("dim de obs" + " " + Arrays.toString(matrixDebarquement.getDim())); double crit = 0; for ( MatrixIterator g = L.iterator(); g.hasNext();){ g.next(); //boucle sur les trimestres et les classes d age int [] dim = g.getCoordinates(); double obs = matrixDebarquement.getValue(dim); double simules = g.getValue(); crit += Math.pow(obs-simules, 2); // crit = crit + (obs-simules)^2 }// fin du for log.info("critere " + number + " = " + crit ); //ajoute le critere dans la table experiences experiences.getExperience(number).criteria = crit; return doNext; }// fin du after simulation /** * Modify nextSimulation database with q1 and q2 in exp. * @param exp * @param nextSimulation * @throws Exception */ protected void changeDB(Experience exp, SimulationStorage nextSimulation) throws Exception { //methode appelee dans before simualtion TopiaContext db = nextSimulation.getStorage().beginTransaction();//ouvrir un context pour modifier les donnees Population pop = (Population)db.findByTopiaId(param_Population.getTopiaId()); //reccupere la pop ciblee MatrixND c = pop.getCapturability(); // reccupere la matrice de capturabilité //log.info("Pour cette simulation : q1 = " + exp.q1 + ";" + "q2 = " + exp.q2 ); for (MatrixIterator i = c.iterator(); i.hasNext();){ i.next(); Object [] sem = i.getSemanticsCoordinates(); PopulationGroup group = (PopulationGroup)sem[0]; PopulationSeasonInfo season = (PopulationSeasonInfo)sem[1]; if (group.getId() < 12){ i.setValue(exp.q2); }else { i.setValue(exp.q1); } }//fin du for db.commitTransaction(); // effectue la modification db.closeContext(); // ferme le context } public class Experiences { // cree la liste experiences ou sont stoqués q1,q2 et critere pour chaque simulation /** contains last simplex and potentialy 2 more simulation */ public List<Experience> current = new ArrayList<Experience>(); /** contains all experience done */ public List<Experience> history = new ArrayList<Experience>(); /** * return experience requested, if this experience doesn't exist * create it. * * @param i simulation number * @return experience with simulation number fixed if new experience * is returned */ public Experience getExperience(int i) { Experience result; if (i<history.size()) { result = history.get(i); } else { result = new Experience(); result.simNumber = i; history.add(i, result); current.add(result); } return result; }//fin de la definition de getExperience /** * @return the history */ public List<Experience> getHistory() { return this.history; } }// fin de la creation des listes experiences public class Experience implements Comparable { public int simNumber; public double criteria; public double q1; public double q2; /** * Permit to order experience, first is experience with smallest criteria */ public int compareTo(Object arg0) { Experience other = (Experience)arg0; int result = Double.compare(this.criteria, other.criteria); return result; } } } package exports; import org.codelutin.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.codelutin.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.Writer; import java.util.*; import org.codelutin.math.matrix.*; import scripts.ResultName; import fr.ifremer.isisfish.simulator.AnalysePlan; import fr.ifremer.isisfish.simulator.AnalysePlanContext; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.export.Export; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * ExperienceCalibration.java * * Created: 29 06 07 * * @author sigrid * @version $Revision: 1.3 $ * * Last update: * by : */ public class ExperiencesCalibration implements Export { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(ExperiencesCalibration.class); protected String [] necessaryResult = { }; public String[] getNecessaryResult() { return this.necessaryResult; } public String getExportFilename() { return "ExperiencesCalibration"; } public String getExtensionFilename() { return ".csv"; } public String getDescription() { return _("Export de la table des experiences du simplexe q1;q2;fonctionObjectif"); } public void export(SimulationStorage simulation, Writer out) throws Exception { analyseplans.CalibrationAnchois3 p = (analyseplans.CalibrationAnchois3)simulation.getParameter().getAnalysePlans().get(0); List<analyseplans.CalibrationAnchois3.Experience> l = p.getExperience().getHistory(); System.out.println("Nombre d'experience: " + l.size()); for (analyseplans.CalibrationAnchois3.Experience e : l) { out.write(e.q1 +";"+ e.q2 +";"+ e.criteria + "\n"); } } }