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/paramin-beta/commandlineinfo.cc
[mareframe] / trunk / paramin-beta / commandlineinfo.cc Repository:
ViewVC logotype

View of /trunk/paramin-beta/commandlineinfo.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: 6616 byte(s)
Initial version based on Gadget 2.2.00
#include "commandlineinfo.h"
#include "commentstream.h"
#include "errorhandler.h"
#include "paramin.h"

extern ErrorHandler handle;

void CommandLineInfo::showCorrectUsage(char* error) {
  cerr << "Error in command line value - unrecognised option " << error << endl
    << "Required options are -i <filename> and -function <function>\n"
    << "For more information try running Paramin with the -h switch\n";
  exit(EXIT_FAILURE);
}

void CommandLineInfo::showCorrectUsage() {
  cerr << "Error on command line when starting Paramin\n"
    << "Required options are -i <filename> and -function <function>\n"
    << "For more information try running Paramin with the -h switch\n";
  exit(EXIT_FAILURE);
}

void CommandLineInfo::showUsage() {
  cout << "Required information for running Paramin:\n"
    << " -i <filename>                read model parameters from <filename>\n"
    << " -function <function>         read function and options to be minimised\n"
    << "                              (this must be the last option specified)\n"
    << "\nOptional information for controlling Paramin:\n"
    << " -opt <filename>              read optimising parameters from <filename>\n"
    << " -network <filename>          read network information from <filename>\n"
    << " -o <filename>                print model parameters to <filename>\n"
    << "                              (default filename is 'params.out')\n"
    << " -scale                       scale the variables to be optimised\n"
    << "\nOther valid command line options:\n"
    << " -v --version                 display version information and exit\n"
    << " -h --help                    display this help screen and exit\n"
    << "\nFor more information see the web page at http://www.hafro.is/gadget/paramin.html\n\n";
  exit(EXIT_SUCCESS);
}

CommandLineInfo::CommandLineInfo() {
  numProc = 0;
  scale = 0;
  waitMaster = 300;
  hostMultiple = 2.0;
  runMultiple = 0.5;
  bestMultiple = 3.0;
}

CommandLineInfo::~CommandLineInfo() {
}

void CommandLineInfo::read(int aNumber, char* const aVector[]) {
  int k, len;

  if (aNumber > 1) {
    k = 1;
    while (k < aNumber) {
      if (strcasecmp(aVector[k], "-scale") == 0) {
        scale = 1;

      } else if (strcasecmp(aVector[k], "-i") == 0) {
        if (k == aNumber - 1)
          this->showCorrectUsage(aVector[k]);
        k++;
        inputfile.resize(aVector[k]);

      } else if (strcasecmp(aVector[k], "-o") == 0) {
        if (k == aNumber - 1)
          this->showCorrectUsage(aVector[k]);
        k++;
        outputfile.resize(aVector[k]);

      } else if (strcasecmp(aVector[k], "-network") == 0) {
        if (k == aNumber - 1)
          this->showCorrectUsage(aVector[k]);
        k++;
        networkfile.resize(aVector[k]);
        this->readNetworkInfo();

      } else if (strcasecmp(aVector[k], "-opt") == 0) {
        if (k == aNumber - 1)
          this->showCorrectUsage(aVector[k]);
        k++;
        optfile.resize(aVector[k]);

      } else if ((strcasecmp(aVector[k], "-v") == 0) || (strcasecmp(aVector[k], "--version") == 0)) {
        cout << "Paramin version " << PARAMINVERSION << endl << endl;
        exit(EXIT_SUCCESS);

      } else if ((strcasecmp(aVector[k], "-h") == 0) || (strcasecmp(aVector[k], "--help") == 0)) {
        this->showUsage();

      } else if ((strcasecmp(aVector[k], "-func") == 0) || (strcasecmp(aVector[k], "-function") == 0)) {
        if (k == aNumber - 1)
          this->showCorrectUsage(aVector[k]);
        k++;
        function.resize(aVector[k]);
        while (k < aNumber - 1) {
          k++;
          function.resize(aVector[k]);
        }

      } else
        this->showCorrectUsage(aVector[k]);

      k++;
    }

    // Must have set both name of function and name of the inputfile
    if (function.Size() < 1)
      this->showCorrectUsage();
    if (inputfile.Size() != 1)
      this->showCorrectUsage();

  } else
    this->showCorrectUsage();

  // Set the default value for the output
  if (outputfile.Size() < 1) {
    char* defaultname = new char[strlen("params.out") + 1];
    strcpy(defaultname, "params.out");
    outputfile.resize(defaultname);
    delete[] defaultname;
  }
}

const CharPtrVector& CommandLineInfo::getFunction() {
  return function;
}

char* CommandLineInfo::getInputFilename() {
  if (inputfile.Size() != 1) {
    cerr << "Error on commandline - inputfile not specified\n";
    exit(EXIT_FAILURE);
  }
  return inputfile[0];
}

char* CommandLineInfo::getOutputFilename() {
  if (outputfile.Size() != 1) {
    cerr << "Error on commandline - outputfile not specified\n";
    exit(EXIT_FAILURE);
  }
  return outputfile[0];
}

char* CommandLineInfo::getOptFilename() {
  if (optfile.Size() != 1) {
    cerr << "Error on commandline - optfile not specified\n";
    exit(EXIT_FAILURE);
  }
  return optfile[0];
}

int CommandLineInfo::getOptInfoFileGiven() {
  return (optfile.Size() > 0);
}

void CommandLineInfo::readNetworkInfo() {

  //Need to add check for values which can not be accepted...
  int i = 0;
  char text[MaxStrLength];
  strncpy(text, "", MaxStrLength);
  ifstream infile(networkfile[0]);
  CommentStream commin(infile);
  commin >> ws;
  commin >> text >> ws;
  while (!commin.eof()) {
    if (strcasecmp(text, "numproc") == 0) {
      commin >> numProc >> ws;
      if (numProc < 0) {
        cerr << "Error in networkfile - numproc must be greater than 0\n";
        infile.close();
        infile.clear();
        exit(EXIT_FAILURE);
      }

    } else if (strcasecmp(text, "waitformaster") == 0) {
      commin >> waitMaster >> ws;
      if (waitMaster < -1) {
        cerr << "Error in networkfile - waitformaster must be greater than -1\n";
        infile.close();
        infile.clear();
        exit(EXIT_FAILURE);
      }

    } else if (strcasecmp(text, "runtimemultiple") == 0) {
      commin >> runMultiple >> ws;
      if (runMultiple < 0) {
        cerr << "Error in networkfile - runtimemultiple must be greater than 0\n";
        infile.close();
        infile.clear();
        exit(EXIT_FAILURE);
      }

    } else if (strcasecmp(text, "hostmultiple") == 0) {
      commin >> hostMultiple >> ws;
    } else if (strcasecmp(text, "besttimemultiple") == 0) {
      commin >> bestMultiple >> ws;
    } else {
      cerr << "Error in networkfile - unknown option " << text << "\n";
      infile.close();
      infile.clear();
      exit(EXIT_FAILURE);
    }
    commin >> text;
    i++;
  }

  if (i == 0) {
    cout << "Warning - no network info given in networkfile - using default values." << endl;
  }
  infile.close();
  infile.clear();
}

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

Powered By FusionForge