package analyseplans; import static org.nuiton.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.nuiton.math.matrix.*; import org.nuiton.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.nuiton.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; /** * CalibrationAnchoisq1q2Export.java * * Created: 07/06/10 * * @author <> * @version $Revision: 3.2 $ * * Last update: $Date: 2007/05/24 09:29:18 $ * by : $Author: bpoussin $ */ public class Calibrationq0_pelagique implements AnalysePlan { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(Calibrationq0_pelagique.class); //public String param_nomFileHisto = "Inputs_Anchois/CalibrationSardine/histo.csv"; public String param_nomFileHisto = "Inputs_Anchois/CalibrationThon/histo.csv"; //public String param_nomFileHisto = "Inputs_Anchois/CalibrationBar/histoManche.csv"; //public String param_nomFileHisto = "Inputs_Anchois/CalibrationBar/histoGdG.csv"; File exportHistoric = new File (param_nomFileHisto); protected String exportHisto = ""; //parametres de la simu 5 points initiaux d un simplex d ordre 2 public Population param_Population = null; public double param_M1 = 8.0e-5;// devient un parametre du plan d analyse public double param_M2 = 9.0e-5;// devient un parametre du plan d analyse public double param_M3 = 1.0e-4;// devient un parametre du plan d analyse public double param_M4 = 1.1e-4;// devient un parametre du plan d analyse public double param_M5 = 1.2e-4;// devient un parametre du plan d analyse //public String param_nomfichier_debarquements = "Inputs_Anchois/CalibrationSardine/DebarquementsSardine.csv";//nom + chemin du fichier contenant les debarquements observes par mois et strategie public String param_nomfichier_debarquements = "Inputs_Anchois/CalibrationThon/DebarquementsThon.csv";//nom + chemin du fichier contenant les debarquements observes par mois et strategie //public String param_nomfichier_debarquements = "Inputs_Anchois/CalibrationBar/DebarquementsBarManche.csv"; //public String param_nomfichier_debarquements = "Inputs_Anchois/CalibrationBar/DebarquementsBarGdg.csv"; protected File debarquementsObserves; protected MatrixND matrixDebarquement; protected String[] strNomsNous; protected List strNous; protected List q; protected List Fobj = new ArrayList(); public String [] necessaryResult = { ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP, }; 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 _("Single Factor Optimization Walters et al"); } /** * 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"); } else { debarquementsObserves = new File(param_nomfichier_debarquements); } q = new ArrayList(); q.add(param_M1); q.add(param_M2); q.add(param_M3); q.add(param_M4); q.add(param_M5); int nbYear = context.getParam().getNumberOfYear(); List allStrategies = context.getParam().getStrategies(); //strNomsNous = new String[]{"PelProfil1","PelProfil2","BolBasques","BolBretons"}; strNomsNous = new String[]{"PelProfil1","PelProfil2"}; strNous = new ArrayList(); for(String strNomCurrent : strNomsNous){ for (Strategy s : allStrategies){ if(s.getName().equals(strNomCurrent)){ strNous.add(s); } } } int dateFin = nbYear*12; List dates = new ArrayList(); for(int i=0; i str = (List)L2.getSemantic(1); System.out.println("import de la matrice des debarquements"); //pour reccuperer les index des strategies francaises int comptSt = 0; int comptTab = 0; int[] elem = new int[strNous.size()]; for(Strategy st : str){ if (strNous.contains(st)){ elem[comptTab] = comptSt; comptTab +=1; } comptSt += 1; } MatrixND L = L2.getSubMatrix(1,elem).copy(); L = L.sumOverDim(3);// sum sur les groupes L = L.sumOverDim(2);// sum sur les metiers L = L.sumOverDim(4);// sum sur les zones L = L.reduce(); // supprime les dimensions de taille 0 ///////////////////Calcul de la fonction objectif////////////////// log.info("calcul de la fobj"); System.out.println("dim de L" + " " + Arrays.toString(L.getDim())); System.out.println("matrice de debarquements : "+ L); double crit = 0; for ( MatrixIterator g = L.iterator(); g.hasNext();){ g.next(); //boucle sur les dates et les flottilles Strategy s = (Strategy)g.getSemanticsCoordinates()[1]; Date dat = (Date)g.getSemanticsCoordinates()[0]; // int [] dim = g.getCoordinates(); double obs = matrixDebarquement.getValue(dat,s); double simules = g.getValue(); double sum_pond = obs-simules; crit += Math.pow(sum_pond, 2); // crit = crit + (obs-simules)^2 }// fin du for System.out.println("critere " + number + " = " + crit ); Fobj.add(crit); //ecriture de la table historic exportHisto += q.get(number) +";"+ Fobj.get(number) + "\n"; org.nuiton.util.FileUtil.writeString(exportHistoric, exportHisto); return true; }// fin du after simulation /** * Modify nextSimulation database with q1 and q2 in exp. * @param exp * @param nextSimulation * @throws Exception */ protected void changeDB(Double q, 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ÃÃâ€ÃÃÃâ