Skip to content

Commit

Permalink
COMMIT VOID *PARAMS Updates
Browse files Browse the repository at this point in the history
  • Loading branch information
rafat committed Aug 21, 2014
1 parent 5633f9c commit 6c94a72
Show file tree
Hide file tree
Showing 29 changed files with 529 additions and 920 deletions.
58 changes: 48 additions & 10 deletions header/optimc.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ struct opt_set{
double stol;
double ftol;
double xtol;
double maxstep;
int MaxIter;
int Iter;
int Method;
Expand Down Expand Up @@ -56,37 +57,74 @@ struct nls_set{
double xopt[1];
};

typedef struct custom_function_set custom_function;

struct custom_function_set{
double(*funcpt) (double *x,int N,void *params);// Function in N variables
void *params;
};

typedef struct custom_gradient_set custom_gradient;

struct custom_gradient_set{
void(*funcgrad) (double *x, int N,double *g, void *params);
void *params;
};

typedef struct custom_funcuni_set custom_funcuni;

struct custom_funcuni_set{
double(*funcuni) (double x, void *params);// Function in one variable
void *params;
};

typedef struct custom_funcmult_set custom_funcmult;

struct custom_funcmult_set{
void(*funcmult) (double *x,int M, int N, double *f, void *params);// M Functions in N variables
void *params;
};

typedef struct custom_jacobian_set custom_jacobian;

struct custom_jacobian_set{
void(*jacobian) (double *x, int M, int N, double *jac, void *params);
void *params;
};

void setnlsTOL(nls_object obj,double gtol,double ftol,double xtol);

void summary(opt_object obj);

void setMaxIter(opt_object obj,int MaxIter);

void setMaxStep(opt_object obj, double maxstep);

void setTOL(opt_object obj,double gtol,double stol,double ftol,double xtol);

int fminsearch(double (*funcpt)(double *,int),int N,double *xi,double *xf);
int fminsearch(custom_function *funcpt,int N,double *xi,double *xf);

double fminbnd(double (*funcpt)(double),double a, double b);
double fminbnd(custom_funcuni *funcuni,double a, double b);

int fminunc(double (*funcpt)(double *,int),void(*funcgrad)(double *, int,double *),int N,double *xi,int method,double *xf);
int fminunc(custom_function *funcpt,custom_gradient *funcgrad,int N,double *xi,double maxstep, int method,double *xf);

int fminnewt(double (*funcpt)(double *,int),void(*funcgrad)(double *, int,double *),int N,double *xi,
double delta,double *dx,double fsval,int method,double *xf);
int fminnewt(custom_function *funcpt, custom_gradient *funcgrad, int N, double *xi,
double delta,double *dx,double fsval,double maxstep,int method,double *xf);

double brent_local_min(double (*funcpt)(double ),double a, double b, double t, double eps, double *x);
double brent_local_min(custom_funcuni *funcuni,double a, double b, double t, double eps, double *x);

void optimize(opt_object obj,double (*funcpt)(double *,int),void(*funcgrad)(double *, int,double *),int N,double *xi,
void optimize(opt_object obj, custom_function *funcpt, custom_gradient *funcgrad, int N, double *xi,
int method);

void free_opt(opt_object object);

int levmar(void (*funcmult)(double *,int,int,double *),void(*jacobian)(double *, int,int,double *),
int levmar(custom_funcmult *funcmult, custom_jacobian *jacobian,
double *xi,int M, int N,double *xf);

void nls(nls_object obj,void (*funcmult)(double *,int,int,double *),void(*jacobian)(double *, int,int,double *),
void nls(nls_object obj, custom_funcmult *funcmult, custom_jacobian *jacobian,
double *xi);

void nls_scale(nls_object obj,void (*funcmult)(double *,int,int,double *),void(*jacobian)(double *, int,int,double *),
void nls_scale(nls_object obj, custom_funcmult *funcmult, custom_jacobian *jacobian,
double *diag,double *xi);

void nlssummary(nls_object obj);
Expand Down
Binary file modified optimc-doc.pdf
Binary file not shown.
14 changes: 7 additions & 7 deletions src/brent.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* Algoritms For Minimization Without Derivatives, Richard P. Brent
* Chapters 3-5
*/
double brent_zero(double (*funcpt)(double ),double ai, double bi, double tol,double eps) {
double brent_zero(custom_funcuni *funcuni, double ai, double bi, double tol, double eps) {
double bz;
double a,b,c,d,e,fa,fb,fc;
double m,s,etol,fd,p,q,r;
Expand All @@ -24,8 +24,8 @@ double brent_zero(double (*funcpt)(double ),double ai, double bi, double tol,dou
a = ai;
b = bi;
c = a;
fa = funcpt(a);
fb = funcpt(b);
fa = FUNCUNI_EVAL(funcuni,a);
fb = FUNCUNI_EVAL(funcuni,b);
fc = fa;
e = b - a;
d = e;
Expand Down Expand Up @@ -94,7 +94,7 @@ double brent_zero(double (*funcpt)(double ),double ai, double bi, double tol,dou
b -= etol;
}

fb = funcpt(b);
fb = FUNCUNI_EVAL(funcuni,b);

bz = b;
if ( ( 0.0 < fb && 0.0 < fc ) || ( fb <= 0.0 && fc <= 0.0 ) ) {
Expand Down Expand Up @@ -123,7 +123,7 @@ double brent_zero(double (*funcpt)(double ),double ai, double bi, double tol,dou
return bz;
}

double brent_local_min(double (*funcpt)(double ),double a, double b, double t, double eps, double *x) {
double brent_local_min(custom_funcuni *funcuni, double a, double b, double t, double eps, double *x) {
double c,d,e,m,p,q,r,tol,t2;
double u,v,w,fu,fv,fw,fx;
double fd;
Expand All @@ -134,7 +134,7 @@ double brent_local_min(double (*funcpt)(double ),double a, double b, double t, d
*x = a + c * (b - a);
w = *x; v = w;
e = 0;
fx = funcpt(*x);
fx = FUNCUNI_EVAL(funcuni,*x);
fw = fx; fv = fw;

m = 0.5 * (a + b);
Expand Down Expand Up @@ -186,7 +186,7 @@ double brent_local_min(double (*funcpt)(double ),double a, double b, double t, d
u = *x - tol;
}

fu = funcpt(u);
fu = FUNCUNI_EVAL(funcuni,u);

if (fu <= fx) {
if (u < *x) {
Expand Down
4 changes: 2 additions & 2 deletions src/brent.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ extern "C" {
#endif


double brent_zero(double (*funcpt)(double ),double a, double b, double tol, double eps);
double brent_zero(custom_funcuni *funcuni,double a, double b, double tol, double eps);

double brent_local_min(double (*funcpt)(double ),double a, double b, double t, double eps, double *x);
double brent_local_min(custom_funcuni *funcuni, double a, double b, double t, double eps, double *x);

#ifdef __cplusplus
}
Expand Down
42 changes: 21 additions & 21 deletions src/conjgrad.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,13 @@ int stopcheck2(double fx,int N,double *xc,double *xf,double *jac,double *dx,doub
}


int cgpr_mt(double(*funcpt)(double *, int),void(*funcgrad)(double *, int,double *), double *xc, int N, double *dx, int MAXITER,int *niter,
int cgpr_mt(custom_function *funcpt, custom_gradient *funcgrad, double *xc, int N, double *dx,double maxstep, int MAXITER, int *niter,
double eps,double gtol,double ftol,double xtol,double *xf) {
int i, rcode, retval, k, restart,gfdcode;
int siter;
double *xi,*temp, *rk, *pk, *jac, *jacf, *apk;
double fsval,fxf,eps2,fo;
double maxstep, dt1, dt2,alpha;
double dt1, dt2,alpha;

temp = (double*)malloc(sizeof(double)* 8);
rk = (double*)malloc(sizeof(double)*N);
Expand All @@ -154,26 +154,28 @@ int cgpr_mt(double(*funcpt)(double *, int),void(*funcgrad)(double *, int,double
fsval = 1.0;
alpha = 1.0;

maxstep = 1000.0; // Needs to be set at a much higher value proportional to l2 norm of dx
dt1 = dt2 = 0.0;
for (i = 0; i < N; ++i) {
xi[i] = xc[i];
}

if (maxstep <= 0.0) {
maxstep = 1000.0;
dt1 = dt2 = 0.0;
for (i = 0; i < N; ++i) {
dt1 += dx[i] * dx[i];
dt2 += dx[i] * xi[i] * dx[i] * xi[i];
}

for (i = 0; i < N; ++i) {
dt1 += dx[i] * dx[i];
dt2 += dx[i] * xi[i] * dx[i] * xi[i];
dt1 = sqrt(dt1);
dt2 = sqrt(dt2);
if (dt1 > dt2) {
maxstep *= dt1;
}
else {
maxstep *= dt2;
}
}

dt1 = sqrt(dt1);
dt2 = sqrt(dt2);

if (dt1 > dt2) {
maxstep *= dt1;
}
else {
maxstep *= dt2;
}


gfdcode = grad_fd(funcpt,funcgrad, xi, N, dx,eps2, jac);
Expand All @@ -185,7 +187,7 @@ int cgpr_mt(double(*funcpt)(double *, int),void(*funcgrad)(double *, int,double
xf[i] = xi[i];
}

fxf = funcpt(xi, N);
fxf = FUNCPT_EVAL(funcpt,xi, N);

if (fxf >= DBL_MAX || fxf <= -DBL_MAX) {
printf("Program Exiting as the function value exceeds the maximum double value");
Expand Down Expand Up @@ -259,7 +261,7 @@ int cgpr_mt(double(*funcpt)(double *, int),void(*funcgrad)(double *, int,double
return rcode;
}

int conjgrad_min_lin(double (*funcpt)(double *,int),void(*funcgrad)(double *, int,double *),double *xi,int N,double *dx,int MAXITER,int *niter,
int conjgrad_min_lin(custom_function *funcpt, custom_gradient *funcgrad, double *xi, int N, double *dx, double maxstep, int MAXITER, int *niter,
double eps,double gtol,double ftol,double xtol,double *xf) {
int rcode,i;

Expand All @@ -282,17 +284,15 @@ int conjgrad_min_lin(double (*funcpt)(double *,int),void(*funcgrad)(double *, in
dx[i] = 1.0 / dx[i];
}


//rcode = cgpc(xi,N,A,b,xf);
//rcode = cgpr(funcpt,xi,N,dx,xf);// FR
rcode = cgpr_mt(funcpt,funcgrad,xi,N,dx,MAXITER,niter,eps,gtol,ftol,xtol,xf);//PR+
rcode = cgpr_mt(funcpt,funcgrad,xi,N,dx,maxstep,MAXITER,niter,eps,gtol,ftol,xtol,xf);//PR+

for(i = 0; i < N;++i) {
xi[i] *= dx[i];
dx[i] = 1.0 / dx[i];
}



return rcode;
}
4 changes: 2 additions & 2 deletions src/conjgrad.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ int ichol(double *A, int N);

int stopcheck2(double fx,int N,double *xc,double *xf,double *jac,double *dx,double fsval,double gtol,double stol) ;

int cgpr_mt(double(*funcpt)(double *, int),void(*funcgrad)(double *, int,double *), double *xi, int N, double *dx, int MAXITER,int *niter,
int cgpr_mt(custom_function *funcpt, custom_gradient *funcgrad, double *xi, int N, double *dx,double maxstep, int MAXITER, int *niter,
double eps,double gtol,double ftol,double xtol,double *xf); //Polak Ribiere + (More Thuentes Line Search)

int conjgrad_min_lin(double (*funcpt)(double *,int),void(*funcgrad)(double *, int,double *),double *xi,int N,double *dx,int MAXITER,int *niter,
int conjgrad_min_lin(custom_function *funcpt, custom_gradient *funcgrad, double *xi, int N, double *dx, double maxstep, int MAXITER, int *niter,
double eps,double gtol,double ftol,double xtol,double *xf);


Expand Down
Loading

0 comments on commit 6c94a72

Please sign in to comment.