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); }
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); } }