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

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

// ********************************************************
// functions for class Optimizer
// ********************************************************
Optimizer::Optimizer(CommandLineInfo* info, NetInterface* net) {
    int i;
    netInt = net;
    // useSA = 0;
    // useHJ = 0;
    // useBFGS = 0;
    // parSA = NULL;
    // parHJ = NULL;
    // parBFGS = NULL;

  // Initialise random number generator
  srand(time(NULL));

  outputfile = info->getOutputFilename();
  if (info->getOptInfoFileGiven())
    this->readOptInfo(info->getOptFilename());
  else {
    cout << "No optimizing information given - using default information\n";
    // parHJ = new ParaminHooke(net);
    // useHJ = 1;
    optvec.resize(new ParaminHooke(net));
  }
  // DoubleVector startx;
  // Set the starting value of x and f
  // startx = net->getInitialX();
  // cout << "best x in optimizer is: " << endl;
  // for (i = 0; i < startx.Size(); i++)
  // cout << startx[i] << " ";
  // cout << endl;
  // startx is scaled if scaling is used
  netInt->startNewDataGroup(1);
  netInt->setX(netInt->getInitialX());
  netInt->sendAndReceiveAllData();
  //cout << "in optmizier got fx " << netInt->getY(0) << endl;
  netInt->setScore(netInt->getY(0));
  // startf = net->getY(0);
  netInt->stopUsingDataGroup();
}

Optimizer::~Optimizer() {
/* 
 if (parSA != NULL)
    delete parSA;
  if (parHJ != NULL)
    delete parHJ;
  if (parBFGS != NULL)
    delete parBFGS;
*/
    int i;
    for (i = 0; i < optvec.Size(); i++)
	delete optvec[i];

}

void Optimizer::readOptInfo(char* optfilename) {
  char* text =  new char[MaxStrLength];
  strncpy(text, "", MaxStrLength);
  ifstream infile(optfilename);
  CommentStream commin(infile);
  int i = 0;
  // Now need to look for seed, [simann], [hooke] or [bfgs]
  commin >> text;
  while (!commin.eof()) {
    commin >> ws;  //trim whitespace from infile
    if ((strcasecmp(text, "seed")) == 0 && (!commin.eof())) {
      commin >> seed >> ws >> text;
      srand(seed);

    } else if (strcasecmp(text, "[simann]") == 0) {
	// parSA = new ParaminSimann(net);
	//useSA = 1;
	optvec.resize(new ParaminSimann(netInt));

    } else if (strcasecmp(text, "[hooke]") == 0) {
	// parHJ = new ParaminHooke(net);
	// useHJ = 1;
	optvec.resize(new ParaminHooke(netInt));
    } else if (strcasecmp(text, "[bfgs]") == 0) {
	//parBFGS = new ParaminBFGS(net);
	// useBFGS = 1;
	optvec.resize(new ParaminBFGS(netInt));
    }
    else {
	// set log failure here...
	cerr << " did not find bfgs, hooke, simann or seed" << endl;
	// exit ..
    }
    if (!commin.eof()) {
      if (optvec.Size() > 0)   {
	commin >> text;
	   if ((text[0] == '[') || (strcasecmp(text, "seed") == 0))
	     cerr << "Warning - no optimisation parameters specified for optimization algorithm\n";
	   else {
	     optvec[i]->read(commin, text);
	     i++;
	   }
      }
      } else
        cerr << "Warning - no optimisation parameters specified for optimization algorithm\n";
  

  }
  if (optvec.Size() == 0) {
      // set here log message...
      optvec.resize(new ParaminHooke(netInt));
  }
  delete [] text;
  infile.close();
  infile.clear();

}

void Optimizer::OptimizeFunc() {
    int i;
	ofstream outfile;
	outfile.open(outputfile);
    for (i = 0; i < optvec.Size(); i++)
	{
		// Keep track of how much time has taken for each optimization.
		time_t timestart;
		timestart = time(NULL);
		optvec[i]->OptimiseLikelihood();
		time_t timeafter;
		timeafter = time(NULL);
		//Added 2/07/2012 to measure time of each optimization G.E. 
		if(optvec[i]->getType() == OPTSIMANN)
		{
			outfile <<  "; Simulated annealing optimization finished in " <<": " << difftime(timeafter, timestart) << " seconds\n";
		}
		else if(optvec[i]->getType() == OPTHOOKE)
		{
			outfile <<  "; Hooke and Jeeves optimization finished in " <<": " << difftime(timeafter, timestart) << " seconds\n";
		}
		else if(optvec[i]->getType() == OPTBFGS)
		{
			outfile <<  "; BFGS optimization finished in " <<": " << difftime(timeafter, timestart) << " seconds\n";
		}
		else
		{
			outfile <<  "; New algorithm optimization finished in " <<": " << difftime(timeafter, timestart) << " seconds\n";
		}
	}
	outfile.close();	
}

void Optimizer::getScore(DoubleVector& x, double fx) {
  //netInt->getInitialScore(x, fx);
  fx = netInt->getInitialScore(x);
}

double Optimizer::getBestF() {
  return netInt->getScore();
}

void Optimizer::printResult() {
  // write the best point out to a file
  int i;
  time_t timenow;
  timenow = time(NULL);
  ofstream outfile;
  outfile.open(outputfile, ios::out | ios::app);
  DoubleVector x;
  double fx;
  //netInt->getInitialScore(x, fx);
  fx = netInt->getInitialScore(x);
  if (!outfile) {
         
    cout << "\nWarning - can't open outputfile\nThe best point calculated is f(x) = "
      << fx << " at\n";
    this->printX(x);

  } else {
    // write the data in the gadget format so this file can be used as a starting point
    outfile << "; Output from Paramin version " << PARAMINVERSION << " on " << ctime(&timenow);
    // AJ must decide on prec... set it somewher eelse. ...
    for (i = 0; i <  optvec.Size(); i++) 
	optvec[i]->Print(outfile, 8);
    
    outfile  << "; The final likelihood value was " << fx << "\nswitch\tvalue\t\tlower\tupper\toptimise\n";
    for (i = 0; i < x.Size(); i++) {
      outfile << (netInt->getSwitches())[i].getName() << TAB << setw(12) << setprecision(8)
        << x[i] << TAB << setw(8) << setprecision(4) << netInt->getLowerbound()[i]
        << setw(8) << setprecision(4) << netInt->getUpperbound()[i]
        << setw(8) << netInt->getOptInfo()[i] << endl;

    }
  }
  outfile.close();
}
void Optimizer::printX(const DoubleVector& vec) {
    int i;
    for (i = 0; i < vec.Size(); i++)
	cout << vec[i] << sep;
    cout << endl;
}

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

Powered By FusionForge