Legofit
infers population history from nucleotide site patterns.
|
#include "diffev.h"
#include "misc.h"
#include "simsched.h"
#include "pointbuff.h"
#include "jobqueue.h"
#include <gsl/gsl_rng.h>
#include <limits.h>
#include <float.h>
#include <math.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "dprintf.h"
Data Structures | |
struct | TaskArg |
Macros | |
#define | DPRINTF_ON |
#define | PRARRAY(nn, xx) |
Macro to print array. More... | |
Functions | |
static void | assignd (int dim, double a[], double b[]) |
void | sample (int k, int rtn[k], int n, int array[n], const gsl_rng *rng) |
Choose at random k distinct integers from array of n, placing result in "rtn". More... | |
TaskArg * | TaskArg_new (int dim, double(*objfun)(int xdim, double x[xdim], void *jdat, void *tdat), void *jobData) |
TaskArg constructor. | |
static void | TaskArg_setArray (TaskArg *self, int dim, double v[dim]) |
Set the array within a TaskArg equal to an external array, v. | |
void | TaskArg_free (TaskArg *self) |
TaskArg destructor. More... | |
void | TaskArg_print (TaskArg *self, FILE *fp) |
Print a TaskArg. | |
int | taskfun (void *voidPtr, void *tdat) |
Called by JobQueue. | |
void | printState (int nPts, int nPar, double par[nPts][nPar], double cost[nPts], int imin, FILE *fp) |
Print current state. Current optimal point is printed first. | |
void | stratDE_best_1_exp (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/best/1/exp Our oldest strategy but still not bad. More... | |
void | stratDE_rand_1_exp (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/rand/1/exp This is one of my favourite strategies. More... | |
void | stratDE_rand_to_best_1_exp (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/rand-to-best/1/exp This strategy seems to be one of the best strategies. More... | |
void | stratDE_best_2_exp (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/best/2/exp is another powerful strategy worth trying. | |
void | stratDE_rand_2_exp (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/rand/2/exp seems to be a robust optimizer for many functions. | |
void | stratDE_best_1_bin (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
Remaining strategies have binomial crossover. More... | |
void | stratDE_rand_1_bin (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/rand/1/bin. | |
void | stratDE_rand_to_best_1_bin (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/rand-to-best/1/bin. | |
void | stratDE_best_2_bin (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/best/2/bin. | |
void | stratDE_rand_2_bin (int dim, double tmp[dim], int nPts, int ndx[nPts], double bestit[dim], double F, double CR, double(*pold)[nPts][dim], gsl_rng *rng) |
DE/rand/2/bin. | |
void * | getStratFun (int strategy) |
Return pointer to function implementing given strategy. | |
void | sighandle (int signo) |
Signal handler. | |
void | handleSIGTERM (int signo) |
SIGTERM is translated to SIGINT. | |
const char * | diffEvStrategyLbl (int i) |
Return a const pointer to the label of the i'th strategy. | |
static void | assignd (int dim, double a[dim], double b[dim]) |
Assigns dim-dimensional vector b to vector a. | |
DEStatus | diffev (int dim, double estimate[dim], double *loCost, double *yspread, DiffEvPar dep, gsl_rng *rng) |
The diffev optimizer. | |
Variables | |
pthread_mutex_t | outputLock |
volatile sig_atomic_t | sigstat =0 |
static const char * | stratLbl [] |
#define PRARRAY | ( | nn, | |
xx | |||
) |
Macro to print array.
void sample | ( | int | k, |
int | rtn[k], | ||
int | n, | ||
int | array[n], | ||
const gsl_rng * | rng | ||
) |
Choose at random k distinct integers from array of n, placing result in "rtn".
The function can be called repeatedly without re-initializing "array".
Referenced by stratDE_best_1_bin(), stratDE_best_1_exp(), stratDE_best_2_bin(), stratDE_best_2_exp(), stratDE_rand_1_bin(), stratDE_rand_1_exp(), stratDE_rand_2_bin(), stratDE_rand_2_exp(), stratDE_rand_to_best_1_bin(), and stratDE_rand_to_best_1_exp().
void stratDE_best_1_bin | ( | int | dim, |
double | tmp[dim], | ||
int | nPts, | ||
int | ndx[nPts], | ||
double | bestit[dim], | ||
double | F, | ||
double | CR, | ||
double(*) | pold[nPts][dim], | ||
gsl_rng * | rng | ||
) |
Remaining strategies have binomial crossover.
DE/best/1/bin
References sample().
Referenced by getStratFun().
void stratDE_best_1_exp | ( | int | dim, |
double | tmp[dim], | ||
int | nPts, | ||
int | ndx[nPts], | ||
double | bestit[dim], | ||
double | F, | ||
double | CR, | ||
double(*) | pold[nPts][dim], | ||
gsl_rng * | rng | ||
) |
DE/best/1/exp Our oldest strategy but still not bad.
However, we have found several optimization problems where misconvergence occurs. strategy DE0 (not in our paper)
References sample().
Referenced by getStratFun().
void stratDE_rand_1_exp | ( | int | dim, |
double | tmp[dim], | ||
int | nPts, | ||
int | ndx[nPts], | ||
double | bestit[dim], | ||
double | F, | ||
double | CR, | ||
double(*) | pold[nPts][dim], | ||
gsl_rng * | rng | ||
) |
DE/rand/1/exp This is one of my favourite strategies.
It works especially well when the "bestit[]"-schemes experience misconvergence. Try e.g. F=0.7 and CR=0.5. as a first guess. strategy DE1 in the techreport
References sample().
Referenced by getStratFun().
void stratDE_rand_to_best_1_exp | ( | int | dim, |
double | tmp[dim], | ||
int | nPts, | ||
int | ndx[nPts], | ||
double | bestit[dim], | ||
double | F, | ||
double | CR, | ||
double(*) | pold[nPts][dim], | ||
gsl_rng * | rng | ||
) |
DE/rand-to-best/1/exp This strategy seems to be one of the best strategies.
Try F=0.85 and CR=1. If you get misconvergence try to increase nPts. If this doesn't help you should play around with all three control variables. similiar to DE2 but generally better
References sample().
Referenced by getStratFun().
void TaskArg_free | ( | TaskArg * | self | ) |
TaskArg destructor.
Doesn't free self->jobData or self->objfun, which are not locally owned.
|
static |