[Isis-fish-users] utiliser matrixToWeightMatrix dans une regle
Sigrid LEHUTA
Sigrid.Lehuta at ifremer.fr
Lun 28 Fév 14:22:29 CET 2022
J'ai cette erreur : il me manque un package ?
1. ERROR in
C:\Users\slehuta\isis-fish-4\isis-community-database\rules\TACseries_Month_Metier_OptionLO.java
(at line 405)
SiMatrix siMatrix = newSiMatrix(context);
^^^^^^^^^^^
The method newSiMatrix(SimulationContext) is undefined for the type
TACseries_Month_Metier_OptionLO
Le 28/02/2022 à 09:23, Eric Chatellier a écrit :
> Le 27/02/2022 à 22:26, Sigrid LEHUTA a écrit :
>> Hello
>> j aurais aimé utiliser la methode matrixToWeightMatrix dans le post
>> action d une regle mais je dois mal m y prendre. Voici mes 2 essais
>> qui ne compilent pas.
>> Merci !
>>
>> Essai 1
>> SiMatrix siMatrix = newSiMatrix(context);
>> MatrixND matW = matrixToWeightMatrix(step, 2, TMP, mat);
>
> Presque :
>
> MatrixND matW = siMatrix.matrixToWeightMatrix(step, 2, TMP, mat);
>
>
--
NB : Please note that I do not work on Wednesdays
Sigrid LEHUTA
~ ><> ~
Ecologie et Modèles pour l'Halieutique
IFREMER Nantes
Rue de l'Ile d'Yeu - BP 21105, 44311 Nantes Cedex 03, France
Tél : 02 40 37 42 38 (N° interne : 8238)
Membre de l'Association Française d'Halieutique
https://www.association-francaise-halieutique.fr/
-------------- section suivante --------------
/*
* #%L
* IsisFish data
* %%
* Copyright (C) 2006 - 2014 Ifremer, CodeLutin,
* %%
* 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 rules;
import fr.ifremer.isisfish.datastore.ResultStorage;
import fr.ifremer.isisfish.entities.EffortDescription;
import fr.ifremer.isisfish.entities.Metier;
import fr.ifremer.isisfish.entities.MetierSeasonInfo;
import fr.ifremer.isisfish.entities.Population;
import fr.ifremer.isisfish.entities.PopulationGroup;
import fr.ifremer.isisfish.entities.Result;
import fr.ifremer.isisfish.entities.Species;
import fr.ifremer.isisfish.entities.Strategy;
import fr.ifremer.isisfish.entities.TargetSpecies;
import fr.ifremer.isisfish.entities.Zone;
import fr.ifremer.isisfish.rule.AbstractRule;
import fr.ifremer.isisfish.simulator.PopulationMonitor;
import fr.ifremer.isisfish.simulator.SimulationContext;
import fr.ifremer.isisfish.types.Month;
import fr.ifremer.isisfish.types.TimeStep;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.math.matrix.MatrixFactory;
import org.nuiton.math.matrix.MatrixIterator;
import org.nuiton.math.matrix.MatrixND;
import org.nuiton.topia.*;
import org.nuiton.util.*;
//import scripts.ResultName;
import scripts.RuleUtil;
import scripts.SiMatrix;
import resultinfos.*;
import fr.ifremer.isisfish.annotations.Doc;
/**
* Cette regles tient compte de la taille minimum des poissons capturable.
*
* Created: 30 novembre 2006
*
* @author smahevas
* @version $Revision: 1.1 $
*
* Last update: $Date: 2007-01-24 18:25:34 $ by : $Author: bpoussin $
*/
public class TACseries_Month_Metier_OptionLO extends AbstractRule {
/** to use log facility, just put in your code: log.info("..."); */
static private Log log = LogFactory.getLog(TACseries_Month_Metier_OptionLO.class);
@Doc(value = "Begin step")
public TimeStep param_beginStep = new TimeStep(0);
@Doc(value = "End date")
public TimeStep param_endStep = new TimeStep(119);
@Doc(value = "Affected population")
public Population param_pop = null;
@Doc(value = "Affected Metiers names separated by ; ")
public String param_metNames = "LLS_ESP;OTB_ESP";
@Doc(value = "TAC allocation (as a ratio)")
public double param_alloc = 0.6;
@Doc(value = "TAC monthly allocation (as ratios separated by ;) ")
public String param_monthAlloc = "0.6;0.3;0.1;0;0;0;0;0;0;0;0;0";
@Doc(value = "If 0, TAC is computed elsewhere, tacName must be filled to retrieve value, otherwise enter TAC in kg time series separated by ; for ISIS fleets")
public String param_tacInKgs = "3000;6000";
@Doc(value = "If tacInKgs = 0, TAC is computed elsewhere and stored in simulation context into this name")
public String param_tacName = "";
@Doc(value = "Proportion survival of discards")
public double param_propSurvie = 0;
@Doc(value = "Landings Obligation Implemented ?")
public boolean param_LandingsObligation = false;
public boolean param_DeMinimis = false;
protected boolean affectation = false;
int nbY = param_endStep.getYear() - param_beginStep.getYear()+1 ;
protected double [] tacSeries = new double[nbY];
protected double [] monthAlloc = new double[12];
List<String> listMetNames;
List<Metier> listMet = new ArrayList<Metier>();
protected MatrixND TacPopMatrix;
protected String[] necessaryResult = {
// put here all necessary result for this rule
MatrixCatchPerStrategyMetPerZonePop.NAME,
MatrixLandingPerMet.NAME,
MatrixLandingWeight.NAME,
MatrixTacPerPop.NAME,
MatrixDiscardsPerStrMetPerZonePop.NAME
// ResultName.MATRIX_BIOMASS,
// ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET,
};
@Override
public String[] getNecessaryResult() {
return this.necessaryResult;
}
/**
* Permet d'afficher a l'utilisateur une aide sur la regle.
*
* @return L'aide ou la description de la regle
*/
@Override
public String getDescription() throws Exception {
return "Implement Quota for the selected metiers using provided annual values. If TAc = 0, uses values from the simulationContext. Saves month when fishing stops in a matrix.";
}
/**
* Appele au demarrage de la simulation, cette methode permet
* d'initialiser des valeurs de la *
* @param context La simulation pour laquelle on utilise cette regle
*/
@Override
public void init(SimulationContext context) throws Exception {
// Add TAC values to a vector indexed by TAC year (from TAC starting year on)
String[] StrTacSeries = param_tacInKgs.split(";");
for ( int i = 0 ; i < StrTacSeries.length; i++) {
tacSeries[i] = Double.parseDouble(StrTacSeries[i]);
}
// Add metier names to a list
String[] StrMetNames = param_metNames.split(";");
listMetNames = new ArrayList<String>(Arrays.asList(StrMetNames));
listMet = new ArrayList<Metier>();
for(String metN : listMetNames) {
listMet.add((Metier) context.getMetierDAO().findByName(metN));
}
// Create vector of values of montly allocation
String[] StrMonthAlloc = param_monthAlloc.split(";");
for ( int i = 0 ; i < StrMonthAlloc.length; i++) {
monthAlloc[i] = Double.parseDouble(StrMonthAlloc[i]);
}
}
/**
* @param context
* @param date
* @param param_species
* @param metier
* @return
*/
private boolean isCaptureDate(TimeStep step, Species species, Metier metier) {
MetierSeasonInfo info = metier.getMetierSeasonInfo(step.getMonth());
TargetSpecies target = info.getSpeciesTargetSpecies(species);
boolean result;
if (target != null) {
result = true;
} else {
result = false;
}
return result;
}
/**
* La condition qui doit etre vrai pour faire les actions.
*
* @param context la simulation pour lequel on utilise cette regle
* @param step le pas de temps courant
* @param metier le metier concerne
* @return vrai si on souhaite que les actions soit faites
*/
@Override
public boolean condition(SimulationContext context, TimeStep step,
Metier metier) throws Exception {
boolean result = false;
//if(listMetNames.contains(metier.getName())){
// read species in current session
param_pop = (Population) context.getDB().findByTopiaId(
param_pop.getTopiaId());
if (step.before(param_beginStep)) {
result = false;
} else if (step.after(param_endStep)) {
result = false;
/*}else if(step.getMonth().equals(Month.JANUARY)){
// reinit priceSwitch at the beginning of each year
context.setValue("priceSwitch"+param_pop.getName(),0);
context.setValue("TACatteint"+param_pop.getName(),false);
context.setValue(metier.getName()+param_pop.getName()+"flag",0);
result = false;
} else {
// metier flag = 0 si pas concern par le TAC
// metier flag = 1 si TAC atteint et rejet
// metier flag = 2 si TAC atteint et interdit
if(context.getValue(metier.getName()+param_pop.getName()+"flag") != null && (int) context.getValue(metier.getName()+param_pop.getName()+"flag")!=0){
// tac deja atteint cette annee et metier concerne
result = true;
}else { // TAC pas encore atteint jusqu ici, test step
if(context.getValue("TACatteint"+param_pop.getName()+param_metNames)==null || !(Boolean) context.getValue("TACatteint"+param_pop.getName()+param_metNames)){
log.info( "TAC pas encore atteint jusqu ici, test");
// Retrieve TAC value and allocation to the set of metiers
double TAC = 0;
int tacYear = step.getYear() - param_beginStep.getYear();
if (tacSeries[tacYear] != 0){
TAC = tacSeries[tacYear];
}else if(context.getValue(param_tacName+param_pop.getName()) != null){ // TAC is computed elsewhere
TAC = (Double) context.getValue(param_tacName+ param_pop.getName());
}else TAC = 0;
TAC = TAC * param_alloc;
// Compute current landings for the set of metiers
double landings = 0;
int year = step.getYear();
ResultStorage matResult = context.getSimulationStorage().getResultStorage();
for (TimeStep dat = new TimeStep(0); dat.before(step); dat = dat.next()) {
if( dat.getYear() == year) {
MatrixND mat = matResult.getMatrix(dat, param_pop,
MatrixLandingWeight.NAME);
double catchListMet = 0;
List <Metier> listMetAll = mat.getSemantic(1);
for(Metier met : listMetAll) {
if(listMetNames.contains(met.getName())){
listMet.add(met);
}
}
for(Metier met : listMet){
landings += mat.getSubMatrix(1,met).sumAll();
}
}
}
log.info("[TAC] landings = " + landings+ " >= TAC:" + TAC);
if (landings >= TAC) {
context.setValue("TACatteint"+param_pop.getName()+param_metNames,true);
log.info("tac atteint for " +param_metNames);
//----------------------------------------------------------------------------------------------------
// Store infos in MatrixTacPerPop
// add the month when TAC was reached to Matrix TAC per pop
TimeStep janCurYear = new TimeStep(year * 12);
//MatrixND TacPopMatrix = matResult.getMatrix(janCurYear,param_metNames,param_pop, MatrixTacPerPop.NAME);
MatrixND TacPopMatrix = MatrixFactory.getInstance().create(
MatrixTacPerPop.NAME,
new List[] { Arrays.asList(new String[]{"TAC","landings","MonthStopFishing"})});
TacPopMatrix.setValue("TAC", TAC);
TacPopMatrix.setValue("landings", landings);
TacPopMatrix.setValue("MonthStopFishing", step.getMonth().getMonthNumber());
matResult.addResult(janCurYear, param_metNames, param_pop, TacPopMatrix);
}
}
// Le TAC est atteint
if(context.getValue("TACatteint"+param_pop.getName()+param_metNames)!=null
&& (Boolean) context.getValue("TACatteint"+param_pop.getName()+param_metNames)){
result = true;
if(param_LandingsObligation){
context.setValue("priceSwitch"+param_pop.getName(),1);
if(param_DeMinimis){
// If met landed >0.05% of pop landings -> forbidden
// compute landings per met and landings tot
double quantMat = 0;
double quantMatPop = 0;
int year = step.getYear();
ResultStorage matResult = context.getSimulationStorage().getResultStorage();
SiMatrix siMatrix = SiMatrix.getSiMatrix(context);
List<Population> Pops = context.getPopulationMonitor().getPopulations();
for (TimeStep dat = new TimeStep(0); dat.before(step); dat = dat.next()) {
if( dat.getYear() == year) {
for(Population pop:Pops){
MatrixND tmp = matResult.getMatrix(dat, pop,MatrixCatchPerStrategyMetPerZonePop.NAME);
quantMat += tmp.getSubMatrix(1,metier,1).sumAll();
if (pop.getName().equals(param_pop.getName())){
quantMatPop += tmp.getSubMatrix(1,metier,1).sumAll();
}
}
}
}
// compute %
if(quantMatPop/ quantMat > 0.05) {
context.setValue(metier.getName()+param_pop.getName()+"flag",2);
}else {
context.setValue(metier.getName()+param_pop.getName()+"flag",1);
}
}else{ // strict application
double quantMatPop = 0;
ResultStorage matResult = context.getSimulationStorage().getResultStorage();
SiMatrix siMatrix = SiMatrix.getSiMatrix(context);
List<Population> Pops = context.getPopulationMonitor().getPopulations();
for (TimeStep dat = new TimeStep(0); dat.before(step); dat = dat.next()) {
for(Population pop:Pops){
if (pop.getName().equals(param_pop.getName())){
MatrixND tmp = matResult.getMatrix(dat, pop, MatrixCatchPerStrategyMetPerZonePop.NAME);
quantMatPop += tmp.getSubMatrix(1,metier,1).sumAll();
}
}
}
// metier catch sp ?
if(quantMatPop > 0.0) { // yes -> forbidden
context.setValue(metier.getName()+param_pop.getName()+"flag",2);
} // else can still fish flag stays at 0
}
}else { // no LO fishes but discard
context.setValue(metier.getName()+param_pop.getName()+"flag",1);
log.info(metier.getName()+"flag"+1);
}
}else result = false; //TAC not reached
} // first time reached
} //not in january
*/
}else result = true;
return result;
}
/**
* Si la condition est vrai alors cette action est executee avant le pas de
* temps de la simulation.
*
* @param context la simulation pour lequel on utilise cette regle
* @param step le pas de temps courant
* @param metier le metier concerne
*/
@Override
public void preAction(SimulationContext context, TimeStep step,
Metier metier) throws Exception {
/*if((int) context.getValue(metier.getName()+param_pop.getName()+"flag") == 2){
context.getMetierMonitor().addforbiddenMetier(metier);
}*/
affectation = true;
}
/**
* Si la condition est vrai alors cette action est executee apres le pas
* de temps de la simulation.
*
* @param context La simulation pour lequel on utilise cette regle
* @param step le pas de temps courant
* @param metier le metier concerne
*/
@Override
public void postAction(SimulationContext context, TimeStep step,
Metier metier) throws Exception {
if (affectation) {
// Retrieve TAC value and allocation to the set of metiers
//----------------------------------------------------------
double TAC = 0;
int tacYear = step.getYear() - param_beginStep.getYear();
if (tacSeries[tacYear] != 0){
TAC = tacSeries[tacYear];
}else if(context.getValue(param_tacName+param_pop.getName()) != null){ // TAC is computed elsewhere
TAC = (Double) context.getValue(param_tacName+ param_pop.getName());
}else TAC = 0;
TAC = TAC * param_alloc * monthAlloc[step.getMonth().getMonthNumber()];
// Compute current catch for the set of metiers and TAC/catch ratio
//-----------------------------------------------------------------
String TMP = "tmp";
PopulationMonitor popMon = context.getPopulationMonitor();
MatrixND mat = popMon.getCatch(param_pop).copy();
SiMatrix siMatrix = newSiMatrix(context);
MatrixND matW = siMatrix.matrixToWeightMatrix(step, 2, TMP, mat);
/*for(MatrixIterator i= matW.iteratorNotZero(); i.next();) {
Object[] coordonnees = i.getSemanticsCoordinates();
PopulationGroup group = (PopulationGroup) coordonnees[2];
i.setValue(i.getValue() * group.getMeanWeight());
}*/
double catchListMet = 0;
for(Metier met : listMet){
catchListMet += matW.getSubMatrix(1,met).sumAll();
}
log.info ("Catch of the month =" + catchListMet);
double ratio = TAC/catchListMet;
log.info("ratio "+ "= " + ratio);
// If TAC is reached, change catch and abundance and compute discards
//-----------------------------------------------------------------
if (catchListMet >= TAC) {
log.info("[TAC] catch = " + catchListMet+ " >= TAC:" + TAC);
MatrixND eff = popMon.getN(param_pop);
MatrixND cat = popMon.getCatch(param_pop);
MatrixND discard = popMon.getDiscard(step, param_pop);
// if the matrix does not exist it is created with the same format as catch
if(discard == null){
discard = popMon.getCatch(param_pop).copy().mults(0);
discard.setName(MatrixDiscardsPerStrMetPerZonePop.NAME);
}
for (MatrixIterator i = cat.iteratorNotZero(); i.next();) {
Object[] coordonnees = i.getSemanticsCoordinates();
Strategy str = (Strategy) coordonnees[0];
Metier met = (Metier) coordonnees[1];
PopulationGroup group = (PopulationGroup) coordonnees[2];
Zone zone = (Zone)coordonnees[3];
if(listMet.contains(met)){
if(param_LandingsObligation) {
eff.setValue(group, zone,eff.getValue(group, zone)+ i.getValue() * (1-ratio));
}else{ //discard
discard.setValue(str,met,group,zone,i.getValue()*(1-ratio));
if (param_propSurvie > 0) {
eff.setValue(group, zone,eff.getValue(group, zone)+ i.getValue() * (1-ratio) * param_propSurvie);
}
}
i.setValue(i.getValue()*ratio);
}
}
popMon.addDiscard(step, param_pop, discard);
}
//----------------------------------------------------------------------------------------------------
// Store infos in MatrixTacPerPop
// add the month when TAC was reached to Matrix TAC per pop
TacPopMatrix = MatrixFactory.getInstance().create(
MatrixTacPerPop.NAME,
new List[] { Arrays.asList(new String[]{"TAC","catchListMet","ratio"})});
TacPopMatrix.setValue("TAC", TAC);
TacPopMatrix.setValue("catchListMet", catchListMet);
TacPopMatrix.setValue("ratio", ratio);
ResultStorage matResult = context.getSimulationStorage().getResultStorage();
matResult.addResult(step, param_metNames, param_pop, TacPopMatrix);
}
// on a affecte une fois cette meta pop au rejet il ne faut pas le
// refaire pour ce pas de temps
affectation = false;
}
}
Plus d'informations sur la liste de diffusion Isis-fish-users