Log In | Get Help   
Home My Page Projects Code Snippets Project Openings Mareframe
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files
[mareframe] View of /trunk/gadget/understocking.cc
[mareframe] / trunk / gadget / understocking.cc Repository:
ViewVC logotype

View of /trunk/gadget/understocking.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (download) (annotate)
Mon Feb 10 17:09:07 2014 UTC (10 years, 4 months ago) by agomez
File size: 6092 byte(s)
Initial version based on Gadget 2.2.00
#include "understocking.h"
#include "readword.h"
#include "readaggregation.h"
#include "errorhandler.h"
#include "areatime.h"
#include "predator.h"
#include "gadget.h"
#include "global.h"

UnderStocking::UnderStocking(CommentStream& infile, const AreaClass* const Area,
  const TimeClass* const TimeInfo, double weight, const char* name)
  : Likelihood(UNDERSTOCKINGLIKELIHOOD, weight, name) {

  //set the default values
  powercoeff = 2.0;
  allpredators = 1;

  infile >> ws;
  if (infile.eof())
    return;  //JMB - OK, we're done here

  char text[MaxStrLength];
  strncpy(text, "", MaxStrLength);
  infile >> text >> ws;
  //JMB - removed the need to read in the area aggregation file
  if (strcasecmp(text, "areaaggfile") == 0) {
    infile >> text >> ws;
    handle.logMessage(LOGWARN, "Warning in understocking - area aggregation file ignored");
    infile >> text >> ws;
  }

  if (strcasecmp(text, "powercoeff") == 0)
    infile >> powercoeff >> ws >> text >> ws;
  if (isZero(powercoeff))
    handle.logMessage(LOGWARN, "Warning in understocking - power coefficient set to zero");

  //reading the predator names is optional - default to all predators
  if ((strcasecmp(text, "predatornames") == 0) || (strcasecmp(text, "fleetnames") == 0)) {
    allpredators = 0;
    int i = 0;
    infile >> text >> ws;
    while (!infile.eof() && (strcasecmp(text, "[component]") != 0) && (strcasecmp(text, "yearsandsteps") != 0)) {
      prednames.resize(new char[strlen(text) + 1]);
      strcpy(prednames[i++], text);
      infile >> text >> ws;
    }

    if (prednames.Size() == 0)
      handle.logFileMessage(LOGFAIL, "\nError in understocking - failed to read predators");
    handle.logMessage(LOGMESSAGE, "Read predator data - number of predators", prednames.Size());
  }

  //JMB - removed the need to read in the yearsandsteps
  if (strcasecmp(text, "yearsandsteps") == 0) {
    handle.logMessage(LOGWARN, "Warning in understocking - yearsandsteps data ignored");
    infile >> text >> ws;
    while (!infile.eof() && (strcasecmp(text, "[component]") != 0))
      infile >> text >> ws;
  }

  //prepare for next likelihood component
  if (!infile.eof() && (strcasecmp(text, "[component]") != 0))
    handle.logFileUnexpected(LOGFAIL, "[component]", text);
}

UnderStocking::~UnderStocking() {
  int i;
  for (i = 0; i < prednames.Size(); i++)
    delete[] prednames[i];
}

void UnderStocking::setPredatorsAndPreys(PredatorPtrVector& predvec,
  PreyPtrVector& preyvec, const AreaClass* const Area) {

  int i, j, found;

  if (allpredators) {
    //store all the preys
    for (i = 0; i < preyvec.Size(); i++)
      preys.resize(preyvec[i]);

  } else {
    //store the predators that have been specified
    for (i = 0; i < prednames.Size(); i++) {
      found = 0;
      for (j = 0; j < predvec.Size(); j++) {
        if (strcasecmp(prednames[i], predvec[j]->getName()) == 0) {
          found ++;
          predators.resize(predvec[j]);
        }
      }
      if (found == 0)
        handle.logMessage(LOGFAIL, "Error in understocking - unrecognised predator", prednames[i]);
    }

    for (i = 0; i < predators.Size(); i++)
      for (j = 0; j < predators.Size(); j++)
        if ((strcasecmp(predators[i]->getName(), predators[j]->getName()) == 0) && (i != j))
          handle.logMessage(LOGFAIL, "Error in understocking - repeated predator", predators[i]->getName());
  }

  //store a list of the areas in the model
  areas = Area->getAllModelAreas();
  for (i = 0; i < areas.Size(); i++)
    areas[i] = Area->getInnerArea(areas[i]);
}

void UnderStocking::Reset(const Keeper* const keeper) {
  Likelihood::Reset(keeper);
  if (isZero(weight))
    handle.logMessage(LOGWARN, "Warning in understocking - zero weight for", this->getName());
  Years.Reset();
  Steps.Reset();
  likelihoodValues.Reset();
  if (handle.getLogLevel() >= LOGMESSAGE)
    handle.logMessage(LOGMESSAGE, "Reset understocking component", this->getName());
}

void UnderStocking::addLikelihood(const TimeClass* const TimeInfo) {

  if (isZero(weight))
    return;

  int i, j;
  double err, l;

  if (handle.getLogLevel() >= LOGMESSAGE)
    handle.logMessage(LOGMESSAGE, "Checking understocking likelihood component", this->getName());

  l = 0.0;
  for (j = 0; j < areas.Size(); j++) {
    err = 0.0;

    if (allpredators) {
      for (i = 0; i < preys.Size(); i++)
        if (preys[i]->isOverConsumption(areas[j]))
          err += preys[i]->getTotalOverConsumption(areas[j]);
    } else {
      for (i = 0; i < predators.Size(); i++)
        if (predators[i]->hasOverConsumption(areas[j]))
          err += predators[i]->getTotalOverConsumption(areas[j]);
    }

    if (!(isZero(err)))
      l += pow(err, powercoeff);
  }

  if (!(isZero(l))) {
    likelihoodValues.resize(1, l);
    Years.resize(1, TimeInfo->getYear());
    Steps.resize(1, TimeInfo->getStep());
    if (handle.getLogLevel() >= LOGMESSAGE)
      handle.logMessage(LOGMESSAGE, "The likelihood score for this component on this timestep is", l);
    likelihood += l;
  }
}

void UnderStocking::Print(ofstream& outfile) const {
  int i;
  outfile << "\nUnderstocking " << this->getName() << " - likelihood value "
    << likelihood << endl;

  if (!allpredators) {
    outfile << "Checking understocking caused by the following predators consumption of preys" << endl;
    for (i = 0; i < prednames.Size(); i++)
      outfile << TAB << prednames[i];
  }

  for (i = 0; i < likelihoodValues.Size(); i++)
    outfile << "\n\tYear " << Years[i] << " and step " << Steps[i] << " likelihood score "
      << setw(smallwidth) << setprecision(smallprecision) << likelihoodValues[i] << endl;
  outfile.flush();
}

void UnderStocking::printSummary(ofstream& outfile) {
  int i;
  for (i = 0; i < likelihoodValues.Size(); i++)
    outfile << setw(lowwidth) << Years[i] << sep << setw(lowwidth) << Steps[i]
      << "   all      " << this->getName() << sep << setprecision(smallprecision)
      << setw(smallwidth) << weight << sep << setprecision(largeprecision)
      << setw(largewidth) << likelihoodValues[i] << endl;
  outfile.flush();
}

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge