#include <math.h>
#include <string.h>
-#include <assert.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_sf.h>
#include <gsl/gsl_siman.h>
#include <gsl/gsl_randist.h>
-#include <gsl/gsl_multimin.h>
#include "symbolic.c"
static double *INPUT; /* dyanmic array, on main's stack */
static double PREP[NPREP];
-#define GET_X(xg) \
- double X[NX]; \
- ({ int get_x_i; \
- for (get_x_i=0; get_x_i<NX; get_x_i++) \
- X[get_x_i] = gsl_vector_get(xg, get_x_i); \
- })
-
static void printcore(const double *X) {
int i, j;
DECLARE_F_G;
//#define DEBUG
-static double cb_f(const gsl_vector *xg, void *params) {
+static double cb_Efunc(void *xp) {
+ const double *X = xp;
int P;
-
- GET_X(xg);
-
DECLARE_F_G;
CALCULATE_F_G;
return cost;
}
-static void __attribute__((unused)) cb_step(const gsl_rng *rng, void *xp, double step_size) {
+static void cb_step(const gsl_rng *rng, void *xp, double step_size) {
double *x = xp;
int i;
double step[NX];
//printf("]\n");
}
-static double __attribute__((unused)) cb_metric(void *xp, void *yp) {
+static double cb_metric(void *xp, void *yp) {
const double *x=xp, *y=yp;
int i;
double s;
}
static void __attribute__((unused)) cb_print(void *xp) {
- GET_X(xp);
+ const double *x = xp;
printf("\n");
- printcore(X);
+ printcore(x);
}
static double scan1double(void) {
int main(int argc, const char *const *argv) {
double epsilon;
- int i, r;
+ int i;
NP = atoi(argv[1]);
epsilon = atof(argv[2]);
- double startpoint_X[NX];
- double input[NINPUT]; INPUT = input;
-
- gsl_multimin_function func = {
- .f = cb_f,
- .n = NX,
- .params = 0,
- };
+ gsl_rng *rng = gsl_rng_alloc(gsl_rng_ranlxd2);
- gsl_vector *current_gx = gsl_vector_alloc(NX);
- gsl_vector *step_size = gsl_vector_alloc(NX);
- gsl_vector_set_all(step_size, 0.01);
-
- gsl_multimin_fminimizer *minimiser =
- gsl_multimin_fminimizer_alloc(gsl_multimin_fminimizer_nmsimplex2, NX);
+ double input[NINPUT]; INPUT = input;
+ double startpoint[NX];
for (;;) {
/* NINPUT + 1 doubles: startpoint, epsilon for residual */
for (i=0; i<NINPUT; i++)
INPUT[i] = scan1double();
- prepare(startpoint_X);
- for (i=0; i<NX; i++)
- gsl_vector_set(current_gx, i, startpoint_X[i]);
+ gsl_rng_set(rng,0);
- r = gsl_multimin_fminimizer_set(minimiser, &func, current_gx, step_size);
- assert(!r);
+ gsl_siman_params_t siman_params = {
+ .k = 1.0,
+ .t_initial = 0.5,
+ .mu_t = 1.001,
+ .t_min = epsilon * 1E-3,
+ .iters_fixed_T = 100,
+ .n_tries = 10,
+ .step_size = 0.05,
+ };
- for (;;) {
- r = gsl_multimin_fminimizer_iterate(minimiser);
- assert(!r);
+ prepare(startpoint);
- double size = gsl_multimin_fminimizer_size(minimiser);
- if (size < epsilon) break;
- }
+ gsl_siman_solve(rng,
+ startpoint,
+ cb_Efunc, cb_step, cb_metric,
+ 0, // cb_print,
+ 0,0,0, sizeof(startpoint), siman_params);
- cb_print(startpoint_X);
+ printcore(startpoint);
printf("[]\n");
fflush(stdout);