Bonjour Benjamin, Je cherche actuellement à réécrire le script Ecmascript "SimulateurES.simul()" de façon à ce qu'il permettre de faire communiquer Isis avec R. Je t'écris ce jour pour te demander si tu as une suggestion pour organiser ce travail. En effet pour l'instant n'étant pas familier encore avec les classes d'isis, mon écriture du script doit être souvent débuguée. Aussi, lorsque je sauve mes modifications du script, je lance une simulation (qui échoue...) et je vais voir le message d'erreur dans le log. Mon problème est que je dois non seulement fermer la fenetre 'simulation launcher' mais si je ne me trompe pas, je dois même fermer totalement Isis avant de relancer le script modifié...ce qui prend énormement de temps pour un débugage (recharge de la base, etc.). Aurais tu une autre manière de faire à me conseiller? recreer un mini-simulateur avec des paramètres d'entrée pour nourrir sim.simuler(param.getPopulations(), param.getMatriceNs(), param.getYearNumber())?? Je joins ici le script SimulateurES qui ne marche pas si tu as le temps de regarder. François //-------------------------------------------- writeln("coucou"); // communication Isis / R : // tous les ans (par ex. tous les 1er janvier) // pour chaque population // sont envoyés à des routines R : (i) l'abondance à ce pas de temps (residu de l'année précédente) et l'abondance des années précédentes. // (ii) les captures cumulées sur l'année précedente // (iii) la mortalité par pêche totale de l'année précédente appliquée au stock // ce que renvoie R à Isis reste à déterminer... var resManager = control.getResultatManager(); var simulateur = new Simulateur(db, control); // org.codelutin.dbobject.DBManager dbManager, SimulationControl control //où est donc definie cette classe Simulateur?? // On encapsule les pops et les effectifs dans l'objet // SimulationSuivi qui permet de suivre la pop. C'est a dire // de prendre en compte les repros et recrutements var populations = new Packages.java.util.Vector(); // un vecteur pour les obj SimulationSuivi var ListeAbondance = new Packages.java.util.HashMap(); //une table avec clé de matrices 'abondance' var listeDate = new Packages.java.util.Vector(); // un vecteur de date listeDate.add(new Integer(0)); listeDate.add(new Integer(12)); listeDate.add(new Integer(24)); listeDate.add(new Integer(36)); listeDate.add(new Integer(48)); listeDate.add(new Integer(60)); listeDate.add(new Integer(72)); listeDate.add(new Integer(84)); listeDate.add(new Integer(96)); listeDate.add(new Integer(108)); writeln("les dates choisies pour la pop"+pops.get(i).getNom()+ ":" +listeDate); for(var i=0; i<pops.size(); i++) // pour chaque pop { populations.add(new SimulationSuivi(pops.get(i), minit.get(i))); // add dans vecteur //export R : creer une matrice avec des semantics pour les classes d'age et les dates: var MatriceAbondance = MatrixFactory.create("Abondance"+pops.get(i).getNom(), // String name new Array( pops.get(i).getClasses(), // list for semantics listedate), new Array("Classes", "Dates")); // list for dimnames ListeAbondance.put(pops.get(i),MatriceAbondance); // put dans la HashMap writeln("la matrice abondance pour la pop"+pops.get(i).getNom()+ ":" +MatriceAbondance); } writeln("deb de simuler"); writeln("2"); //construction des regles var regles = this.initRegle(regle); var gestionMetier= new GestionLicenceMetier_interdits(); //writeln("taille du tableau des regles:"+regle.length); while(date.getAnnee()<nbAnnee){ MetiersInterdits.clear(); writeln("la date:"+date.toString()); control.setText("la date: "+date.toString()); db.beginTransaction(); if(regles.length!=0){ gestionMetier.clear(); // remise a 0 des metiers interdits et des licences if(date.getMois().getNumMois() == 0){ // on est au mois de janvier for(var x=0; x<populations.size(); x++) { // rappel : 'populations' c'est un vecteur d'objets simulationSuivi var popcourante=populations.get(x).getPop(); var temp= populations.get(x).getN().SumOverDim(1); //eliminer la dimension zone (matrice abondance => dim 0:classe ; dim 1: zone) for (var classe=0;classe < popcourante.getClasses().size();classe++) { //chercher dans la HashMap et ajouter les valeurs d'abondance pour chaque classe à la date ListeAbondance.get(popcourante).setValue(classe,date.getDate(),temp.getValue(classe,0)); } populations.get(x).razCaptureCumulee(); //remise à 0 des captures ?? writeln("outputs for R"); var Separateur=Packages.java.io.File.separator; var chemin=Packages.fr.ifremer.Config.EXPORTPATH+Separateur+nomsimu+"-"+formatteur.format(dateexport)+Separateur; var creation= new Packages.java.io.File(chemin); creation.mkdirs(); var fichier=new Packages.java.io.FileWriter(chemin+populations.get(x).getPop()+"abundancesForR.txt"); var buffer=new Packages.java.io.BufferedWriter(fichier); buffer.write(matrice); buffer.close(); fichier.close(); // puis appel ligne de commande R pour XSA sous FLR (le resultat influe sur les mesures de gestion // a prendre pour l'année suivante...) //Rconnection c = new Rconnection(); //REXP x = c.eval("R.version.string"); //System.out.println(x.asString()); } } // les resultats des routines R renvoient des objets qui influent sur la suite du code // c'est à dire les règles de gestion... var allMetiers= SiMatrice.getListMetiers() for(var i=0; i<allMetiers.size(); i++){ var metier= allMetiers.get(i); control.setText("la date: "+date.toString()+" - Action Avant - métier: "+metier.getNom()); // writeln("metier:"+metier.getNom()); for(var r=0; r< regles.length;r++){ var _regle = regles[r]; // writeln("dans simuler, nomRegle ="+_regle.getNom()); // control.setText("la date: "+date.toString()+" - ActionAvant Regle: "+ _regle.getNom()+" - Metier: "+metier.getNom()); var _gestionMetier = gestionMetier; // writeln("metier:"+metier); // writeln("populations:"+populations); // writeln("gestionMetier:"+_gestionMetier); // writeln("code parametre:"+_regle.parametre); _regle.parametre(date,metier,populations,_gestionMetier); if (_regle.oldValueCondition == undefined ) _regle.oldValueCondition = new Object(); _regle.oldValueCondition[metier.getNom()] = _regle.condition(_regle.p); if(_regle.oldValueCondition[metier.getNom()]){ gestionMetier = _regle.actionAvant(_regle.p); } } } } // Sauvegarde de l'effort // 20041109 suppression de la sauvegarde apres reecriture du simulateur //bb for (var k=0; k<populations.size(); k++){ writeln("CALCULMOIS"); writeln("pop= "+pops.get(k).toString()); control.setText("la date: "+date.toString()+" Calcul mois Pop: "+pops.get(k).toString()); simulateur.calculMois(SiMatrice, populations.get(k), date); } writeln("APRES CALCUL"); if(regles.length!=0){ var allMetiers= MetierFactory.findAll(); for(var i=0; i<allMetiers.size(); i++){ var metier = allMetiers.get(i); for(var r=0; r!= regles.length;r++){ var _regle = regles[r]; control.setText("la date: "+date.toString()+" - ActionApres - Metier: "+metier.getNom()); //ajout pour la correction du bug #1 30/08/2001 _regle.parametre(date,metier,populations,gestionMetier); //fin bug #1 if(_regle.condition(_regle.p, _regle.oldValueCondition[metier.getNom()])){ //on passe metier qui est le metier en cours de traitement gestionMetier = _regle.actionApres(_regle.p); } } } } control.setText("la date: "+date.toString()+" Ajout des matrices dans resultat"); writeln("Verif rejet dans simulateurES"); // ajout des resultats Rejet et debarquement for(var i=0; i<populations.size(); i++){ var suivi = populations.get(i); var matRejet = suivi.getRejet(date); var haveRejet = matRejet != null; writeln("matrice de rejet "+date+" "+suivi.getPop()+":"+matRejet); if(!haveRejet){ matRejet = MatrixFactory.create("Rejet par metier", new Array(SiMatrice.getListStrategies(), SiMatrice.getListMetiers(), suivi.getInfoClasse(), suivi.getInfoZone()), new Array("Strategies", "Metiers", "Classes", "Zones")); } if(haveRejet || date.getDate() == 0){ //ajout du rejet // on ajoute les rejets que s'il y en a, car avec la nouvelle implantation de rendu des resultats // les matrices manquantes seront automatiquement remplacÃ1/2S par des matrices nulle // Mais quoi qu'il arrive on en met un pour qu'il apparaisse dans la combo resManager.addResult(date, suivi.getPop(), matRejet); } //ajout du debarquement var pop = suivi.getPop(); var matDebarquement = MatrixFactory.create(suivi.getCapture()); writeln("matrice suivi = " + matDebarquement); matDebarquement.minus(matRejet); matDebarquement.setName("Debarquement par metier"); resManager.addResult(date, pop, matDebarquement); } // demontage des regles par les logs control.setText("la date: "+date.toString()+" démontage des règles"); writeln("rollback"); db.rollbackTransaction(); date.inc(); if(control.isStopSimulationRequest()) break; var runtime= java.lang.Runtime.getRuntime(); var memoireutil=new Packages.java.lang.Float(runtime.totalMemory()/1048576.0) writeln("Memoire Utilisee: "+memoireutil.intValue()+"Mo"); writeln("fin du pas de temps"); } var dateexport=new Packages.java.util.Date(); var formatteur= new Packages.java.text.SimpleDateFormat("dd_MM_yyyy-HHmm"); writeln("Fin de simulation"); return 0; // Si vous souhaitez faire des exports avant la sauvegarde, il vous suffit // de retirer le return ci-dessus et de choisir les bon exports en dessous var dateexport=new Packages.java.util.Date(); var formatteur= new Packages.java.text.SimpleDateFormat("dd_MM_yyyy-HHmm"); var Separateur=Packages.java.io.File.separator; var chemin=Packages.fr.ifremer.Config.EXPORTPATH+Separateur+nomsimu+"-"+formatteur.format(dateexport)+Separateur; var creation= new Packages.java.io.File(chemin); creation.mkdirs(); var fichier=new Packages.java.io.FileWriter(chemin+"Parametres.txt"); var buffer=new Packages.java.io.BufferedWriter(fichier); buffer.write(chaineparam); buffer.close(); fichier.close(); /* fichier=new Packages.java.io.FileWriter(Packages.java.io.File(creation, "Abondances.csv")); buffer=new Packages.java.io.BufferedWriter(fichier); Export.AbondancesSteph(pops,resManager,buffer); buffer.close(); fichier.close(); */ fichier=new Packages.java.io.FileWriter(chemin+"Biomasses.csv"); buffer=new Packages.java.io.BufferedWriter(fichier); Export.BiomassesSteph(pops,resManager,buffer); buffer.close(); fichier.close(); /* fichier=new Packages.java.io.FileWriter(chemin+"CapturesNombre.csv"); buffer=new Packages.java.io.BufferedWriter(fichier); Export.CapturesNombreSteph(pops,resManager,buffer); buffer.close(); fichier.close(); */ fichier=new Packages.java.io.FileWriter(chemin+"CapturesPoids.csv"); buffer=new Packages.java.io.BufferedWriter(fichier); Export.CapturesPoidsSteph(pops,resManager,buffer); buffer.close(); fichier.close(); /* fichier=new Packages.java.io.FileWriter(chemin+"EffortsMetier.csv"); buffer=new Packages.java.io.BufferedWriter(fichier); Export.EffortsMetierSteph(pops,resManager,buffer); buffer.close(); fichier.close(); fichier=new Packages.java.io.FileWriter(chemin+"RejetsNombre.csv"); buffer=new Packages.java.io.BufferedWriter(fichier); Export.RejetsNombreSteph(pops,resManager,buffer); buffer.close(); fichier.close(); fichier=new Packages.java.io.FileWriter(chemin+"RejetsPoids.csv"); buffer=new Packages.java.io.BufferedWriter(fichier); Export.RejetsPoidsSteph(pops,resManager,buffer); buffer.close(); fichier.close(); */ writeln("fin du script de simulation"); return 0; Benjamin POUSSIN a écrit:
On Wed, 07 Dec 2005 12:06:39 +0100 Francois.Bastardie@ifremer.fr wrote:
Salut Benjamin,
Je te remercie pour cette solution qui correspond à première vue tout à fait à nos besoins pour l'interfaçage entre Isis et R. Cependant, on a essayé d'installer Rserve sous Windows en suivant les consignes du site web...et ça marche pas. Le problème c'est que il nous manque visiblement un fichier Rserv.cfg pour lancer le serveur. As tu essayé de ton coté? Travailles tu exclusivement sous linux? Est-ce que ça marche mieux avec linux?
Je n'utilise que Linux et ca fonctionne tres bien, j'ai meme fait fonctionné l'exemple que j'ai envoyer.
D'autre part, quand tu dis que la prochaine version de Isis integrera les bibliothèque de Rserve, tu penses à la version 3.0.0? Sera t-il toujours nécessaire d'installer Rserve indépendamment d'Isis? En clair dois-je me préoccuper d'installer Rserve ou bien attendre que cela soit intégré dans Isis (si c'est possible)?
Il n'y aura que la librairie Java qui sera integrer a la prochaine release Isis (des la 2.0.25), ce qui permettra de ne pas s'embeter avec le classpath.
Mais tu devras toujours installer rserve par toi meme sur R
ps: par pitier pas de mail en prive pour des points techniques comme ceux la, plutot utiliser les listes de discussion devel ou user qui sont faites pour ca :(.
-- -------------------------------------------------------- François Bastardie IFREMER - département EMH (Ecologie et Modèles pour l'Halieutique) Rue de l'Ile d'Yeu BP 21105 44311 NANTES Cedex 03 Tél : 02 40 37 41 64 Fax : 02 40 37 40 75 E-mail : francois.bastardie@ifremer.fr