コード例 #1
0
ファイル: minim.c プロジェクト: albertocbarrigon/maxdft
void minim_bayes(density_t *ndft)
{
  int i;
  double minf;
  double *x;

  bayes_par par_input;
  nlopt_function_data function_data;
  bopt_params par;

  /* Initializing the bounds for the optimization.
     We need two vectors with size ipf.npar to parse
     them to bayesopt */
  par_input.lb = (double *)malloc(ipf.npar*sizeof(double));
  parse_double ("bayes_lb", par_input.lb);
  for(i = 1; i < ipf.npar; i++) par_input.lb[i] = par_input.lb[0];
  par_input.ub = (double *)malloc(ipf.npar*sizeof(double));
  parse_double ("bayes_ub", par_input.ub);
  for(i = 1; i < ipf.npar; i++) par_input.ub[i] = par_input.ub[0];

  x = (double *)malloc(ipf.npar*sizeof(double));
  for(i = 0; i < ipf.npar; i++) x[i] = gsl_vector_get(ipf.gamma, i);

  /* Initializing all the parameters to default, and then modifying them */
  par = initialize_parameters_to_default();

  /* The use of the auxiliar data.n_iter, data.init_samples and data.init_method
     parameters is caused by their par.* equivalents being defined as size_t
     instead of int, which caused some warnings and errors in the parser */
  par.n_iterations = 190;
  parse_int("bayes_iter", &par_input.n_iter);  par.n_iterations = par_input.n_iter;
  par.n_init_samples = 10;
  parse_int("bayes_init_samples", &par_input.init_samples);  par.n_init_samples = par_input.init_samples;
  par.init_method = 1;
  parse_int("bayes_init_method", &par_input.init_method);  par.init_method = par_input.init_method;

  par.random_seed = 0;
  par.verbose_level = 1;  parse_int("bayes_verbose", &par.verbose_level);
  par.noise = 1e-10;  parse_double("bayes_noise", &par.noise);

  par_input.learning = "L_MCMC";  parse_string("bayes_learning", &par_input.learning);
  set_learning(&par, par_input.learning);

  function_data.counter = 0;
  function_data.ndft = density_get_val(ndft);

  messages_basic("\n\n\nStarting the optimization.\n\n\n");

  bayes_optimization(ipf.npar, nlopt_gfunction, &function_data, par_input.lb, par_input.ub, x, &minf, par);

  if(myid == 0)  printf("Success: iterations = %d, G(gamma) = %15.10f\n", function_data.counter, minf);
  if(myid == 0) printf("gamma =  ");
  if(myid == 0) {for(i = 0; i < ipf.npar; i++) printf("%.5f ", x[i]);}
  if(myid == 0)  printf("\n");

  for(i = 0; i < ipf.npar; i++) gsl_vector_set(ipf.gamma, i, x[i]);
  ipf_write(ipf, ipf_ref, "pot");

  parallel_end(EXIT_SUCCESS);
}
コード例 #2
0
ファイル: bayesoptmex.c プロジェクト: MLDL/bayesopt
void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
  double *xptr;
  mxArray *xopt;
  const mxArray *func_name, *params;
  user_function_data udata;
  size_t nDim;
  unsigned int ii;
  bopt_params parameters;
  double *ub, *lb;    /* Upper and lower bound */
  double fmin;
  int error_code;
     
  /* Check correct number of parameters */
  CHECK0(nlhs != 2 || nrhs != 3 || nrhs != 5, 
	 "wrong number of arguments");
    
  /* TODO: Change This */
  udata.neval = 0;
  udata.verbose = 0;
   
  /* First term is the function handle or name */
  func_name = prhs[0];

  if (mxIsChar(func_name))
    {
      CHECK0(mxGetString(func_name, udata.f, FLEN) == 0,
	     "error reading function name string (too long?)");
      udata.nrhs = 1;
      udata.xrhs = 0;
    }
#ifndef HAVE_OCTAVE
  else if (mxIsFunctionHandle(func_name))
    {
      udata.prhs[0] = (mxArray *)func_name;
      strcpy(udata.f, "feval");
      udata.nrhs = 2;
      udata.xrhs = 1;
      }
#endif
  else
    {
      mexErrMsgTxt("First term should be a function name or function handle");
    }

  /* Second parameter. nDim */
  CHECK0(mxIsNumeric(prhs[1]) && !mxIsComplex(prhs[1]) 
	 && mxGetM(prhs[1]) * mxGetN(prhs[1]) == 1,
	 "nDim must be a scalar");
  nDim = (unsigned int) mxGetScalar(prhs[1]);

  udata.prhs[udata.xrhs] = mxCreateDoubleMatrix(1, nDim, mxREAL);

  xopt = mxCreateDoubleMatrix(1, nDim, mxREAL);
  xptr = mxGetPr(xopt);
     
  /* Third term. Parameters  */
  if (nrhs != 2)
    {
      CHECK0(mxIsStruct(prhs[2]), "3rd element must be a struct");
      params = prhs[2];
    }
  else
    {
      params = mxCreateStructMatrix(1,1,0,NULL);
    }
  parameters = load_parameters(params);

  if(nrhs == 5)
    {
      /* Load bounds */
      mexPrintf("Loading bounds...");
      CHECK0(mxIsDouble(prhs[3]) && !mxIsComplex(prhs[3])
	     && (mxGetM(prhs[3]) == 1    || mxGetN(prhs[3]) == 1)
	     && (mxGetM(prhs[3]) == nDim || mxGetN(prhs[3]) == nDim),
	     "lowerBound must be real row or column vector");

      lb = mxGetPr(prhs[3]);


      CHECK0(mxIsDouble(prhs[4]) && !mxIsComplex(prhs[4])
	     && (mxGetM(prhs[4]) == 1    || mxGetN(prhs[4]) == 1)
	     && (mxGetM(prhs[4]) == nDim || mxGetN(prhs[4]) == nDim),
	     "upperBound must be real row or column vector");

      ub = mxGetPr(prhs[4]);
      mexPrintf("done. \n");
    }
  else
    {
      lb = (double*)(mxCalloc(nDim,sizeof(double)));
      ub = (double*)(mxCalloc(nDim,sizeof(double)));
	 

      
      for (ii = 0; ii < nDim; ++ii) 
	{
	  lb[ii] = 0.;    
	  ub[ii] = 1.;
	}
    }

  error_code = bayes_optimization(nDim,user_function,&udata,lb,ub,xptr,
				  &fmin,parameters);

  if(nrhs != 5)
    {
      mxFree(lb); 
      mxFree(ub);
    }

  mxDestroyArray(udata.prhs[udata.xrhs]);
  plhs[0] = xopt;
  if (nlhs > 1) 
    {
      plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL);
      *(mxGetPr(plhs[1])) = fmin;
    }
  if (nlhs > 2)
    {
      plhs[2] = mxCreateDoubleMatrix(1, 1, mxREAL);
      *(mxGetPr(plhs[2])) = (double)(error_code);
    }

}