/* * Copyright (C) 2010 * * 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 2 * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package rules; import static org.nuiton.i18n.I18n._; import org.nuiton.j2r.REngine; import org.nuiton.j2r.RException; import org.nuiton.j2r.RProxy; import org.nuiton.j2r.types.RDataFrame; import org.nuiton.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.nuiton.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import scripts.ResultName; import scripts.SiMatrix; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.types.Month; import scripts.ResultName; import java.io.Writer; import fr.ifremer.isisfish.export.Export; import java.io.File; import java.util.Arrays; import java.util.ArrayList; import java.util.List; import org.nuiton.util.FileUtil; import org.nuiton.math.matrix.*; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.util.Doc; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; import org.nuiton.math.matrix.MatrixIterator; import org.nuiton.topia.TopiaContext; import fr.ifremer.isisfish.simulator.SimulationControl; import fr.ifremer.isisfish.simulator.SimulationProperties; /** * XSA.java * * Created: 11 mars 2010 * * @author ben * @version $Revision: 1545 $ * Last update: $Date: 12 juillet 2011 $ * by : $Author: Paul et Youen $ */ public class XSA extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ private static Log log = LogFactory.getLog(XSA.class); //String param_pathInputs = "F:/D/Projets/deepfishman/Blue ling/"; //String param_InputsStockObject = "F:/D/Projets/deepfishman/Blue ling/bli567ind.txt"; //String param_InputsFleetObject = "F:/D/Projets/deepfishman/Blue ling/bli567fl.txt"; String param_InputsStockObject = "F:/D/Projets/deepfishman/Blue ling/bli567ind.txt"; String param_InputsFleetObject = "F:/D/Projets/deepfishman/Blue ling/bli567fl.txt"; String param_pathOutputs = "F:/D/Projets/deepfishman/Blue ling/"; public Population param_pop = null; public Strategy param_StrategyTunning = null; public String param_GroupRange = "7;20"; protected TopiaContext db = null; private MatrixND catchYear0; private MatrixND effortS1Met0; private MatrixND catchS1Met0; public MatrixND matrixCpue; public MatrixND matrixNageExport; public MatrixND matrixFageExport; public static double ssbExport, fbarExport; RDataFrame FauxAges; RDataFrame NauxAges; // Configuration @Doc("Mois de l'evaluation") public Month param_month = Month.JANUARY; // Matrices necessaires public String [] necessaryResult = { ResultName.MATRIX_ABUNDANCE, ResultName.MATRIX_BIOMASS, ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP, ResultName.MATRIX_DISCARDS_PER_STR_MET_PER_ZONE_POP, ResultName.MATRIX_DISCARDS_WEIGHT_PER_STR_MET_PER_ZONE_POP }; public String[] getNecessaryResult() { return this.necessaryResult; } public String getDescription() throws Exception { return _("Fait une XSA"); } public void init(SimulationContext context) throws Exception { Date date = new Date(0); REngine engine = new RProxy(); engine.voidEval("library(FLXSA)"); String pathObject = "stock<-readFLStock(\"" + param_InputsStockObject + "\")" ; log.info("param_GroupRange ="+ param_GroupRange); log.info("pathObject =" + pathObject); engine.voidEval(pathObject); String pathFleet = "indices<-readFLIndices(\"" + param_InputsFleetObject + "\")"; log.info("pathObject =" + pathFleet); engine.voidEval(pathFleet); //engine.voidEval("stock<-readFLStock(\"F:/D/Projets/deepfishman/Blue ling/bli567ind.txt\")"); // //engine.voidEval("indices<-readFLIndices(\"F:/D/Projets/deepfishman/Blue ling/bli567fl.txt\")"); // Parametres XSA engine.voidEval("tol<-1.e-09"); engine.voidEval("maxit<-1000"); engine.voidEval("min.nse<-0.3"); engine.voidEval("fse<-2.0"); engine.voidEval("rage<-9"); engine.voidEval("qage<-17"); engine.voidEval("shk.n<-TRUE"); engine.voidEval("shk.f<-TRUE"); engine.voidEval("shk.yrs<-5"); engine.voidEval("shk.ages<-5"); engine.voidEval("window<-100"); engine.voidEval("tsrange<-20"); engine.voidEval("tspower<-3"); // stocke dans FLXSA les parametres engine.voidEval("xsa.control<-FLXSA.control(tol=tol,maxit=maxit,min.nse=min.nse,fse=fse,rage=rage,qage=qage,shk.n=shk.n,shk.f=shk.f,shk.yrs=shk.yrs,shk.ages=shk.ages,window=window,tsrange=tsrange,tspower=tspower,vpa=FALSE)"); engine.voidEval("stock@catch.n <- stock@landings.n"); // recupere les capt aux ages de l annee precedente String saveOutputs = "save.image(file=\"" + param_pathOutputs + "xsaRes.RData\")"; engine.voidEval(saveOutputs); // sauver l'objet pour pouvoir le rouvrir ensuite pour utilisation //engine.voidEval("save.image(file=\"F:/D/Projets/deepfishman/Blue ling/xsaRes.RData\")"); // sauver l'objet pour pouvoir le rouvrir ensuite pour utilisation } /** * La condition qui doit etre vrai pour faire les actions * @param simulation La simulation pour lequel on utilise cette regle * @return vrai si on souhaite que les actions soit faites */ public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { Month currentMonth = date.getMonth(); if (currentMonth.equals(param_month) && (date.getYear() > 0)) { return true; } else return false; } // Booleen permettant que ne boucler que sur un seul metier dans la preaction : boolean first = true; /** * @param simulation La simulation pour lequel on utilise cette regle */ public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { if (first){ ResultStorage resultmanager = context.getSimulationStorage().getResultStorage(); for (Date dat = date.previousYear(); dat.before(date); dat = dat.next()) { MatrixND CatchPop = resultmanager.getMatrix(dat,param_pop,ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP); // reccupere les catches at age de l annee passee MatrixND Prov2 = CatchPop.sumOverDim(0);// sumOver str Prov2=Prov2.sumOverDim(1);// sum over metier Prov2=Prov2.sumOverDim(3); // sum over zones Prov2=Prov2.reduce(); if(dat.equals( date.previousYear())){ log.info("test our voir comme ca"); catchYear0 = Prov2; }else{ log.info("test our voir comme ca 2"); log.info("Prov2= " + Prov2); log.info("catchYear0= " + catchYear0); catchYear0.add(Prov2); } // reccupere les catches at age de la flottille tunning MatrixND Prov3 = CatchPop.getSubMatrix(0,param_StrategyTunning); Prov3=Prov3.sumOverDim(3).reduce(); // sum over zones if(dat.equals( date.previousYear())){ catchS1Met0 = Prov3; }else{ catchS1Met0.add(Prov3); } // reccupere effort de la flottille tunning MatrixND Effort = resultmanager.getMatrix(dat,ResultName.MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET); log.info("Effort = " +Effort); log.info("param_StrategyTunning = " +param_StrategyTunning.getName()); if(dat.equals( date.previousYear())){ effortS1Met0 = Effort.copy().getSubMatrix(0,param_StrategyTunning).reduce(); }else{ effortS1Met0.add(Effort.copy().getSubMatrix(0,param_StrategyTunning).reduce()); } } // compute CPUE MatrixND matrixCpue = catchS1Met0; int dummyMet = 0; log.info("effortS1Met0 = " + effortS1Met0); for(MatrixIterator i = effortS1Met0.iterator(); i.hasNext();){ i.next(); if(i.getValue() > 0){ dummyMet++; } } log.info("dum met"+dummyMet); for(MatrixIterator i = matrixCpue.iterator(); i.hasNext();){ i.next(); log.info("i"+i.getValue()); Metier met = (Metier)i.getSemanticsCoordinates()[0]; log.info("met"+met.getName()); if(effortS1Met0.getValue(met) > 0){ log.info("val met"+effortS1Met0.getValue(met)); i.setValue(i.getValue()/effortS1Met0.getValue(met)); log.info("i"+i.getValue()); } } log.info("cpue"+matrixCpue); matrixCpue=matrixCpue.sumOverDim(0).reduce(); log.info("cpue2"+matrixCpue); double div = 1/(double)dummyMet; log.info("div"+div); if(dummyMet > 0) matrixCpue = matrixCpue.divs(div); log.info("cpue3"+matrixCpue); // Si on est au mois de Janvier, avant le pas de temps: // Recuperer les captures aux ages etc du pas de temps precedent // realiser la xsa //log.info("Avant engine"); REngine engine = new RProxy(); //log.info("Avant import"); String loadCommand = "load(file=\"" + param_pathOutputs + "xsaRes.RData\")"; engine.voidEval(loadCommand); //engine.voidEval("load(file=\"F:/D/Projets/deepfishman/Blue ling/xsaRes.RData\")"); // etendre l'objet FLR // Objet Stock engine.voidEval("stock<-window(stock,end=range(stock)[5]+1)"); // On agrandit la fenetre temporelle du stock de 1 YV log.info("catchYear0" + catchYear0); String [] stringGroupRange = param_GroupRange.split(";"); double [] dgroupRange = StringUtil.toArrayDouble(stringGroupRange[0], stringGroupRange[1]); int[] groupRange = new int[] {(int)dgroupRange[0],(int)dgroupRange[1]}; MatrixND caaAexprter = catchYear0.getSubMatrix(0,groupRange[0],groupRange[1]-groupRange[0]+1); log.info("caaAexporter" + caaAexprter); // // create vector of catch values for R String essaimatrix = "test <- c("; for(MatrixIterator i = caaAexprter.iterator();i.hasNext();){ i.next(); PopulationGroup grp = (PopulationGroup)i.getSemanticsCoordinates()[0]; if (grp.getId() < groupRange[1]) { essaimatrix += i.getValue() + ","; } else { essaimatrix += i.getValue(); } } essaimatrix = essaimatrix + ")"; engine.voidEval(essaimatrix); //log.info("essaimatrix=" + essaimatrix); //engine.voidEval("save.image(file=\"F:/D/Projets/deepfishman/Blue ling/xsaRes.RData\")"); //engine.voidEval("test<-as.vector(" + caaAexprter + ")"); engine.voidEval("stock@catch.n[,dim(stock@catch.n)[2],,,] <-test/1000" ); // recupere les capt aux ages de l annee precedente engine.voidEval("stock@catch.wt[,dim(stock@catch.n)[2],,,]<-as.vector(rowMeans(stock@catch.wt[,c((dim(stock@catch.wt)[2] - 1):(dim(stock@catch.wt)[2] - 3)),,,]))"); // calcule la moyenne des poids aux ages sur les 3 dernieres annees engine.voidEval("stock@landings.n[,dim(stock@landings.n)[2],,,]<-stock@catch.n[,dim(stock@catch.n)[2],,,] "); // pas de rejets les capt==debarquements engine.voidEval("stock@landings.wt[,dim(stock@landings.wt)[2],,,]<-as.vector(rowMeans(stock@landings.wt[,c((dim(stock@landings.wt)[2] - 1):(dim(stock@landings.wt)[2] - 3)),,,]))"); // calcule la moyenne des poids aux ages sur les 3 dernieres annees engine.voidEval("stock@stock.wt[,dim(stock@stock.wt)[2],,,]<-as.vector(rowMeans(stock@stock.wt[,c((dim(stock@stock.wt)[2] - 1):(dim(stock@stock.wt)[2] - 3)),,,]))"); // calcule la moyenne des poids aux ages sur les 3 dernieres annees engine.voidEval("stock@m[,dim(stock@m)[2],,,]<-stock@m[,dim(stock@m)[2] - 1,,,] "); // copie la M de l'anne precedente engine.voidEval("stock@mat[,dim(stock@mat)[2],,,]<-stock@mat[,dim(stock@mat)[2] - 1,,,] "); // copie la Maturite de l'anne precedente engine.voidEval("stock@harvest.spwn[,dim(stock@harvest.spwn)[2],,,]<-stock@harvest.spwn[,dim(stock@harvest.spwn)[2] - 1,,,] "); // engine.voidEval("stock@m.spwn[,dim(stock@m.spwn)[2],,,]<-stock@m.spwn[,dim(stock@m.spwn)[2] - 1,,,] "); // // Objet fleet engine.voidEval("indices<-window(indices,end=range(indices)[4]+1)"); // On agrandit la fenetre temporelle de fleet de 1 YV log.info("matrixCpue =" +matrixCpue); MatrixND iaAexprter = matrixCpue.getSubMatrix(0,groupRange[0],groupRange[1]-groupRange[0]+1) ; log.info("iaAexprter =" +iaAexprter); // create vector of cpue values for R String essaimatrix2 = "test <- c("; for(MatrixIterator i = iaAexprter.iterator();i.hasNext();){ i.next(); PopulationGroup grp = (PopulationGroup)i.getSemanticsCoordinates()[0]; if (grp.getId() < groupRange[1]) { essaimatrix2 += i.getValue() + ","; } else { essaimatrix2 += i.getValue(); } } essaimatrix2 = essaimatrix2 + ")"; engine.voidEval(essaimatrix2); engine.voidEval("indices@.Data[[1]]@catch.n[,dim(indices@.Data[[1]]@catch.n)[2],,,]<-test/1000");// recupere les indices aux ages de l annee precedente engine.voidEval("indices@.Data[[1]]@effort[,dim(indices@.Data[[1]]@effort)[2],,,]<-1");// recupere les indices aux ages de l annee precedente log.info("Avant XSA"); // Faire la xsa engine.voidEval("xsa<-FLXSA(stock,indices,xsa.control)"); log.info("Apres XSA"); String save2 = "save.image(file=\"" + param_pathOutputs + "xsaRes.RData\")"; engine.voidEval(save2); //engine.voidEval("save.image(file=\"F:/D/Projets/deepfishman/Blue ling/xsaRes.RData\")"); // retourner ssb et f de la derniere annee engine.voidEval("range(stock)[3]<-range(xsa)[3]"); engine.voidEval("stock<-stock+xsa"); Double ssb = ((Double) engine.eval("ssb<-as.numeric(as.data.frame(ssb(stock)[1,ncol(ssb(stock))]))[7]")).doubleValue(); Double fbar = ((Double) engine.eval("fbar<-as.numeric(as.data.frame(fbar(stock)[1,ncol(fbar(stock))]))[7]")).doubleValue(); FauxAges = (RDataFrame) engine.eval("FauxAges <- as.data.frame(as.data.frame(harvest(stock)[,ncol(harvest(stock))])$data)"); NauxAges = (RDataFrame) engine.eval("NauxAges<- as.data.frame(as.data.frame(stock.n(stock)[,ncol(stock.n(stock))])$data)"); //MatrixND FauxAges = ((MatrixND) engine.eval("FauxAges <- as.data.frame(harvest(xsa.stock)[,ncol(harvest(xsa.stock))])$data")).doubleValue(); //MatrixND NauxAges = ((MatrixND) engine.eval("NauxAges <- as.data.frame(stock.n(xsa.stock)[,ncol(stock.n(xsa.stock))])$data")).doubleValue(); ssbExport = ssb; fbarExport = fbar; //log.info("agegroups = " + agegroups); // export XSA results to use in another rule List agegroupsall = param_pop.getPopulationGroup(); matrixNageExport = MatrixFactory.getInstance().create( "matrixNageExport", new List[]{agegroupsall}, new String[]{"AgeGroupsAll"}); matrixFageExport = MatrixFactory.getInstance().create( "matrixFageExport", new List[]{agegroupsall}, new String[]{"AgeGroupsAll"}); for (MatrixIterator iage = matrixNageExport.iterator(); iage.hasNext();){ iage.next(); PopulationGroup age = (PopulationGroup)iage.getSemanticsCoordinates()[0]; if (age.getId() < groupRange[0]){ iage.setValue(0.0); } // end of iage if-test; else{ //log.info("NauxAges.get(iage-7,1) = " + NauxAges.get(iage,1) + "iage= " + iage); //log.info("age = " + iage); //log.info("NauxAges = " + NauxAges.get(0,iage-7)); iage.setValue((Double) NauxAges.get(0,age.getId()-groupRange[0])); } // end of iage else-test; } // end of age for loop; for (MatrixIterator iage = matrixFageExport.iterator(); iage.hasNext();){ iage.next(); PopulationGroup age = (PopulationGroup)iage.getSemanticsCoordinates()[0]; if (age.getId() < groupRange[0]){ iage.setValue(0.0); } // end of iage if-test; else{ //log.info("NauxAges.get(iage-7,1) = " + NauxAges.get(iage,1) + "iage= " + iage); //log.info("age = " + iage); //log.info("NauxAges = " + NauxAges.get(0,iage-7)); iage.setValue((Double) FauxAges.get(0,age.getId()-groupRange[0])); } // end of iage else-test; } // end of age for loop; engine.voidEval(save2); //engine.voidEval("save.image(file=\"F:/D/Projets/deepfishman/Blue ling/xsaRes.RData\")"); first = false; } // end of (first) if-test; } /** * @param simulation La simulation pour lequel on utilise cette regle */ public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { first = true; } }