#include "ecosystem.h" #include "keeper.h" #include "stockstdprinter.h" #include "stockprinter.h" #include "predatorprinter.h" #include "predatorpreyprinter.h" #include "predatoroverprinter.h" #include "preyoverprinter.h" #include "stockpreyfullprinter.h" #include "stockpreyprinter.h" #include "stockfullprinter.h" #include "likelihoodprinter.h" #include "summaryprinter.h" #include "surveyindices.h" #include "understocking.h" #include "catchdistribution.h" #include "stockdistribution.h" #include "catchstatistics.h" #include "recstatistics.h" #include "stomachcontent.h" #include "recapture.h" #include "migrationpenalty.h" #include "catchinkilos.h" #include "boundlikelihood.h" #include "surveydistribution.h" #include "migrationproportion.h" #include "readword.h" #include "gadget.h" #include "global.h" // // A function to read fleet information // void Ecosystem::readFleet(CommentStream& infile) { char text[MaxStrLength]; char value[MaxStrLength]; strncpy(text, "", MaxStrLength); strncpy(value, "", MaxStrLength); while (!infile.eof()) { infile >> text >> ws; if ((strcasecmp(text, "[fleetcomponent]") != 0) && (strcasecmp(text, "[component]") != 0)) handle.logFileUnexpected(LOGFAIL, "[component]", text); infile >> text >> value; if (strcasecmp(text, "totalfleet") == 0) fleetvec.resize(new Fleet(infile, value, Area, TimeInfo, keeper, TOTALFLEET)); else if (strcasecmp(text, "linearfleet") == 0) fleetvec.resize(new Fleet(infile, value, Area, TimeInfo, keeper, LINEARFLEET)); else if (strcasecmp(text, "numberfleet") == 0) fleetvec.resize(new Fleet(infile, value, Area, TimeInfo, keeper, NUMBERFLEET)); else if (strcasecmp(text, "effortfleet") == 0) fleetvec.resize(new Fleet(infile, value, Area, TimeInfo, keeper, EFFORTFLEET)); else if (strcasecmp(text, "quotafleet") == 0) fleetvec.resize(new Fleet(infile, value, Area, TimeInfo, keeper, QUOTAFLEET)); else if (strcasecmp(text, "mortalityfleet") == 0) handle.logFileMessage(LOGFAIL, "\nThe mortalityfleet fleet type is no longer supported"); else handle.logFileMessage(LOGFAIL, "unrecognised fleet class", text); handle.logMessage(LOGMESSAGE, "Read fleet OK - created fleet", value); } } // // A function to read tagging information // void Ecosystem::readTagging(CommentStream& infile) { char text[MaxStrLength]; strncpy(text, "", MaxStrLength); while (!infile.eof()) { infile >> text >> ws; if ((strcasecmp(text, "[tagcomponent]") != 0) && (strcasecmp(text, "[component]") != 0)) handle.logFileUnexpected(LOGFAIL, "[component]", text); readWordAndValue(infile, "tagid", text); tagvec.resize(new Tags(infile, text, Area, TimeInfo, keeper, stockvec)); handle.logMessage(LOGMESSAGE, "Read tagging experiment OK - created tag", text); } } // // A function to read otherfood information // void Ecosystem::readOtherFood(CommentStream& infile) { char text[MaxStrLength]; strncpy(text, "", MaxStrLength); while (!infile.eof()) { infile >> text >> ws; if ((strcasecmp(text, "[foodcomponent]") != 0) && (strcasecmp(text, "[component]") != 0)) handle.logFileUnexpected(LOGFAIL, "[component]", text); readWordAndValue(infile, "foodname", text); otherfoodvec.resize(new OtherFood(infile, text, Area, TimeInfo, keeper)); handle.logMessage(LOGMESSAGE, "Read otherfood OK - created otherfood", text); } } // // A function to read stock information // Note: there is only ever one stock in each file // void Ecosystem::readStock(CommentStream& infile) { char text[MaxStrLength]; strncpy(text, "", MaxStrLength); readWordAndValue(infile, "stockname", text); stockvec.resize(new Stock(infile, text, Area, TimeInfo, keeper)); handle.logMessage(LOGMESSAGE, "Read stock OK - created stock", text); } // // A function to read information on printing // void Ecosystem::readPrinters(CommentStream& infile) { char text[MaxStrLength]; char type[MaxStrLength]; strncpy(text, "", MaxStrLength); strncpy(type, "", MaxStrLength); if (!infile.eof()) infile >> text >> ws; if (strcasecmp(text, "[component]") != 0) handle.logFileUnexpected(LOGFAIL, "[component]", text); while (!infile.eof()) { readWordAndValue(infile, "type", type); if (strcasecmp(type, "stockstdprinter") == 0) printvec.resize(new StockStdPrinter(infile, TimeInfo)); else if (strcasecmp(type, "stockfullprinter") == 0) printvec.resize(new StockFullPrinter(infile, TimeInfo)); else if (strcasecmp(type, "stockprinter") == 0) printvec.resize(new StockPrinter(infile, TimeInfo)); else if (strcasecmp(type, "predatorprinter") == 0) printvec.resize(new PredatorPrinter(infile, TimeInfo)); else if (strcasecmp(type, "predatoroverprinter") == 0) printvec.resize(new PredatorOverPrinter(infile, TimeInfo)); else if (strcasecmp(type, "preyoverprinter") == 0) printvec.resize(new PreyOverPrinter(infile, TimeInfo)); else if (strcasecmp(type, "stockpreyprinter") == 0) printvec.resize(new StockPreyPrinter(infile, TimeInfo)); else if (strcasecmp(type, "stockpreyfullprinter") == 0) printvec.resize(new StockPreyFullPrinter(infile, TimeInfo)); else if (strcasecmp(type, "predatorpreyprinter") == 0) printvec.resize(new PredatorPreyPrinter(infile, TimeInfo)); else if (strcasecmp(type, "likelihoodprinter") == 0) printvec.resize(new LikelihoodPrinter(infile, TimeInfo)); else if (strcasecmp(type, "likelihoodsummaryprinter") == 0) printvec.resize(new SummaryPrinter(infile)); else if (strcasecmp(type, "formatedstockprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe formatedstockprinter printer class is no longer supported"); else if (strcasecmp(type, "formatedchatprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe formatedchatprinter printer class is no longer supported"); else if (strcasecmp(type, "formatedpreyprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe formatedpreyprinter printer class is no longer supported"); else if (strcasecmp(type, "mortprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe mortprinter printer class is no longer supported"); else if (strcasecmp(type, "biomassprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe biomassprinter printer class is no longer supported"); else if (strcasecmp(type, "formatedcatchprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe formatedcatchprinter printer class is no longer supported"); else if (strcasecmp(type, "predpreystdlengthprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe predpreystdlengthprinter printer class is no longer supported"); else if (strcasecmp(type, "predpreystdageprinter") == 0) handle.logFileMessage(LOGFAIL, "\nThe predpreystdageprinter printer class is no longer supported"); else handle.logFileMessage(LOGFAIL, "unrecognised printer class", type); handle.logMessage(LOGMESSAGE, "Read printer OK - created printer class", type); } } // // A function to read likelihood information // void Ecosystem::readLikelihood(CommentStream& infile) { double weight = 0.0; char text[MaxStrLength]; char type[MaxStrLength]; char name[MaxStrLength]; char datafilename[MaxStrLength]; strncpy(text, "", MaxStrLength); strncpy(type, "", MaxStrLength); strncpy(name, "", MaxStrLength); strncpy(datafilename, "", MaxStrLength); ifstream datafile; CommentStream subdata(datafile); if (!infile.eof()) infile >> text >> ws; if (strcasecmp(text, "[component]") != 0) handle.logFileUnexpected(LOGFAIL, "[component]", text); while (!infile.eof()) { readWordAndValue(infile, "name", name); readWordAndVariable(infile, "weight", weight); readWordAndValue(infile, "type", type); if (strcasecmp(type, "penalty") == 0) { readWordAndValue(infile, "datafile", datafilename); datafile.open(datafilename, ios::in); handle.checkIfFailure(datafile, datafilename); handle.Open(datafilename); likevec.resize(new BoundLikelihood(subdata, Area, TimeInfo, keeper, weight, name)); handle.Close(); datafile.close(); datafile.clear(); //prepare for next likelihood component infile >> ws; if (!infile.eof()) { infile >> text >> ws; if (strcasecmp(text, "[component]") != 0) handle.logFileUnexpected(LOGFAIL, "[component]", text); } } else if (strcasecmp(type, "understocking") == 0) { likevec.resize(new UnderStocking(infile, Area, TimeInfo, weight, name)); } else if (strcasecmp(type, "catchstatistics") == 0) { likevec.resize(new CatchStatistics(infile, Area, TimeInfo, weight, name)); } else if (strcasecmp(type, "catchdistribution") == 0) { likevec.resize(new CatchDistribution(infile, Area, TimeInfo, keeper, weight, name)); } else if (strcasecmp(type, "stockdistribution") == 0) { likevec.resize(new StockDistribution(infile, Area, TimeInfo, weight, name)); } else if (strcasecmp(type, "surveyindices") == 0) { likevec.resize(new SurveyIndices(infile, Area, TimeInfo, weight, name)); } else if (strcasecmp(type, "surveydistribution") == 0) { likevec.resize(new SurveyDistribution(infile, Area, TimeInfo, keeper, weight, name)); } else if (strcasecmp(type, "stomachcontent") == 0) { likevec.resize(new StomachContent(infile, Area, TimeInfo, keeper, weight, name)); } else if (strcasecmp(type, "recaptures") == 0) { likevec.resize(new Recaptures(infile, Area, TimeInfo, weight, tagvec, name)); } else if ((strcasecmp(type, "catchintons") == 0) || (strcasecmp(type, "catchinkilos") == 0)) { likevec.resize(new CatchInKilos(infile, Area, TimeInfo, weight, name)); } else if (strcasecmp(type, "migrationpenalty") == 0) { likevec.resize(new MigrationPenalty(infile, weight, name)); } else if (strcasecmp(type, "recstatistics") == 0) { likevec.resize(new RecStatistics(infile, Area, TimeInfo, weight, tagvec, name)); } else if (strcasecmp(type, "migrationproportion") == 0) { likevec.resize(new MigrationProportion(infile, Area, TimeInfo, weight, name)); } else if (strcasecmp(type, "predatorindices") == 0) { handle.logFileMessage(LOGFAIL, "\nThe predatorindices likelihood component is no longer supported\nUse the sibyfleet surveyindices likelihood component instead\nThis is done by setting the sitype to 'fleets' in the likelihood file"); } else if (strcasecmp(type, "logcatch") == 0) { handle.logFileMessage(LOGFAIL, "\nThe logcatch likelihood component is no longer supported\nUse the log function from the catchdistribution likelihood component instead"); } else if (strcasecmp(type, "logsurveyindices") == 0) { handle.logFileMessage(LOGFAIL, "\nThe logsurveyindices likelihood component is no longer supported\nUse the log function from the surveyindices likelihood component instead"); } else { handle.logFileMessage(LOGFAIL, "unrecognised likelihood class", type); } handle.logMessage(LOGMESSAGE, "Read likelihood OK - created likelihood component", name); } } // // A function to read optimisation information // void Ecosystem::readOptimisation(CommentStream& infile, unsigned* seed) { char* text = new char[MaxStrLength]; strncpy(text, "", MaxStrLength); handle.logMessage(LOGMESSAGE, "Reading optimisation information"); infile >> ws; if (!infile.eof()) infile >> text; int count = 0; while (!infile.eof()) { infile >> ws; //trim whitespace from infile if (strcasecmp(text, "seed") == 0) { int seed = 0; infile >> seed >> ws; handle.logMessage(LOGMESSAGE, "Initialising random number generator with", seed); srand(seed); if (!infile.eof()) infile >> text; } if (strcasecmp(text, "[hooke]") == 0) optvec.resize(new OptInfoHooke()); else if (strcasecmp(text, "[simann]") == 0) optvec.resize(new OptInfoSimann()); else if (strcasecmp(text, "[bfgs]") == 0) optvec.resize(new OptInfoBFGS()); else if (strcasecmp(text, "[pso]") == 0) optvec.resize(new OptInfoPso()); else handle.logFileUnexpected(LOGFAIL, "[hooke], [simann], [bfgs], or [pso]", text); if (!infile.eof()) { infile >> text; optvec[count]->setSeed(seed); optvec[count]->read(infile, text); } else handle.logMessage(LOGINFO, "Warning - no parameters specified for optimisation algorithm"); count++; } delete[] text; if (count == 0) { handle.logFileMessage(LOGWARN, "no optimisation algorithms found, using default values"); optvec.resize(new OptInfoHooke()); } } // // The main reading function // void Ecosystem::readMain(CommentStream& infile, const MainInfo& main) { int i, j; char text[MaxStrLength]; char filename[MaxStrLength]; strncpy(text, "", MaxStrLength); strncpy(filename, "", MaxStrLength); ifstream subfile; CommentStream subcomment(subfile); //first, read in the time information readWordAndValue(infile, "timefile", filename); subfile.open(filename, ios::in); handle.checkIfFailure(subfile, filename); handle.Open(filename); TimeInfo = new TimeClass(subcomment, main.getMaxRatio()); handle.Close(); subfile.close(); subfile.clear(); //second, read in the area information readWordAndValue(infile, "areafile", filename); subfile.open(filename, ios::in); handle.checkIfFailure(subfile, filename); handle.Open(filename); Area = new AreaClass(subcomment, keeper, TimeInfo); handle.Close(); subfile.close(); subfile.clear(); //next, read in the printing information infile >> text >> ws; if ((strcasecmp(text, "printfile") != 0) && (strcasecmp(text, "printfiles") != 0)) handle.logFileUnexpected(LOGFAIL, "printfiles", text); //Now we have found the string "printfiles" we can create printer classes infile >> text >> ws; while ((strcasecmp(text, "[stock]") != 0) && !infile.eof()) { //Do not try to read printfile if we dont need it if (main.runPrint()) { subfile.open(text, ios::in); handle.checkIfFailure(subfile, text); handle.Open(text); this->readPrinters(subcomment); handle.Close(); subfile.close(); subfile.clear(); } infile >> text >> ws; } //then read in the stock information if (strcasecmp(text, "[stock]") != 0) handle.logFileUnexpected(LOGFAIL, "[stock]", text); infile >> text >> ws; if (strcasecmp(text, "mortalitymodel") == 0) handle.logFileMessage(LOGFAIL, "\nFleksibest-style mortality models are no longer supported\nGadget version 2.0.07 was the last version to allow this functionality"); if (strcasecmp(text, "stockfiles") != 0) handle.logFileUnexpected(LOGFAIL, "stockfiles", text); //Now we have found the string "stockfiles" we can create stock infile >> text >> ws; while ((strcasecmp(text, "[tagging]") != 0) && !infile.eof()) { subfile.open(text, ios::in); handle.checkIfFailure(subfile, text); handle.Open(text); this->readStock(subcomment); handle.Close(); subfile.close(); subfile.clear(); infile >> text >> ws; } //Now we read the names of the tagging files if (strcasecmp(text, "[tagging]") != 0) handle.logFileUnexpected(LOGFAIL, "[tagging]", text); infile >> text >> ws; if (strcasecmp(text, "tagfiles") == 0) { //There might not be any tagging files infile >> text >> ws; while ((strcasecmp(text, "[otherfood]") != 0) && !infile.eof()) { subfile.open(text, ios::in); handle.checkIfFailure(subfile, text); handle.Open(text); this->readTagging(subcomment); handle.Close(); subfile.close(); subfile.clear(); infile >> text >> ws; } } //Now we read the names of the otherfood files if (strcasecmp(text, "[otherfood]") != 0) handle.logFileUnexpected(LOGFAIL, "[otherfood]", text); infile >> text >> ws; if (strcasecmp(text, "otherfoodfiles") == 0) { //There might not be any otherfood files infile >> text >> ws; while ((strcasecmp(text, "[fleet]") != 0) && !infile.eof()) { subfile.open(text, ios::in); handle.checkIfFailure(subfile, text); handle.Open(text); this->readOtherFood(subcomment); handle.Close(); subfile.close(); subfile.clear(); infile >> text >> ws; } } //Now we read the names of the fleet files if (strcasecmp(text, "[fleet]") != 0) handle.logFileUnexpected(LOGFAIL, "[fleet]", text); infile >> text >> ws; if (strcasecmp(text, "fleetfiles") == 0) { //There might not be any fleet files infile >> text >> ws; while ((strcasecmp(text, "[likelihood]") != 0) && !infile.eof()) { subfile.open(text, ios::in); handle.checkIfFailure(subfile, text); handle.Open(text); this->readFleet(subcomment); handle.Close(); subfile.close(); subfile.clear(); infile >> text >> ws; } } if (strcasecmp(text, "[likelihood]") != 0) handle.logFileUnexpected(LOGFAIL, "[likelihood]", text); //Now we have either read the word likelihood or reached the end of file if (!infile.eof()) { infile >> text >> ws; if (strcasecmp(text, "likelihoodfiles") == 0) { //There might not be any likelihood files infile >> text; while (!infile.eof()) { subfile.open(text, ios::in); handle.checkIfFailure(subfile, text); handle.Open(text); this->readLikelihood(subcomment); handle.Close(); subfile.close(); subfile.clear(); infile >> ws; if (!infile.eof()) infile >> text; } } } }