install-lib: compile_flags lib
mv libcgo.a /usr/local/lib
- mkdir -p /usr/local/include/cgo
- cp include/* /usr/local/include/cgo
+ cp include/cgo.h /usr/local/include
#compile_flags_gtk:
# echo "-Iinclude `pkg-config --cflags gtk4` -lm -fopenmp `pkg-config --libs gtk4`" | perl -pe 's|(-.*?)\s|\1\n|g' > compile_flags.txt
--- /dev/null
+typedef struct {
+ int dim;
+ int particlec;
+ double *sample_range_min;
+ double *sample_range_max;
+ double (*f)(double*); // fitness function
+ double cr; // crossover probability = .9
+ double dw; // differential weight = .8
+} cgo_de_parameters;
+
+typedef struct {
+ int dim;
+ int particlec;
+ double *sample_range_min;
+ double *sample_range_max;
+ double (*f)(double*); // fitness function
+ double eps; // convergence tolerance
+ double w; // inertia
+ double c; // cognitive factor
+ double s; // social factor
+} cgo_pso_parameters;
+
+void cgo_de(cgo_de_parameters *par, double *res);
+void cgo_pso(cgo_pso_parameters *par, double *res);
+
+++ /dev/null
-#include "rand.h"
-
-typedef struct {
- int dim;
- int particlec;
- range *rrange;
- double (*f)(double*); // fitness function
- double cr; // crossover probability = .9
- double dw; // differential weight = .8
-} de_parameters;
-
-void de_optimize(de_parameters *par, double *res);
+++ /dev/null
-#include "rand.h"
-
-typedef struct particle particle;
-
-typedef struct {
- double *x;
- double fitness;
-} particle_state;
-
-typedef struct {
- int dim;
- int particlec;
- range *rrange;
- double (*f)(double*); // fitness function
- double eps; // convergence tolerance
- double w; // inertia
- double c; // cognitive factor
- double s; // social factor
-} pso_parameters;
-
-typedef struct {
- particle *particles;
- particle *global_best;
-} swarm;
-
-struct particle {
- particle_state current;
- particle_state best;
- double *velocity;
-};
-
-void swarm_alloc(pso_parameters *par, swarm *sw);
-void swarm_free(pso_parameters *par, swarm *sw);
-void swarm_populate(pso_parameters *par, swarm *sw, const range *rrange);
-void swarm_velocity_update(pso_parameters *par, swarm *sw);
-void pso_optimize(pso_parameters *par, particle_state *res);
#ifndef RAND_H
#define RAND_H
-typedef struct {
- double min;
- double max;
-} range;
-
double rands();
double randrange(double min, double max);
-void vec_pick(const int dim, const range *rrange, double *v);
+void vec_pick(const int dim, const double *min, const double *max, double *v);
#endif
+#ifndef VECTOR_H
+#define VECTOR_H
+
double *vec_alloc(const int dim);
void vec_print(const int dim, const double *v);
void vec_copy(const int dim, const double *v, double *vp);
void vec_add(const int dim, const double *b, double *a); // a = a + b
void vec_sub(const int dim, const double *b, double *a); // a = a - b
double vec_dotprod(const int dim, const double *a, const double *b);
+
+#endif
#include <stdlib.h>
#include "vector.h"
-#include "de.h"
+#include "rand.h"
+#include "cgo.h"
-void de_optimize(de_parameters *par, double *res) {
+void cgo_de(cgo_de_parameters *par, double *res) {
int l = par->particlec * par->dim;
double *mem = malloc(sizeof(double) * (l + par->dim));
int conv = 0;
double *xs = mem;
double *y = mem + l;
for (double *x = xs; x < y; x += par->dim)
- vec_pick(par->dim, par->rrange, x);
+ vec_pick(par->dim, par->sample_range_min, par->sample_range_max, x);
while (conv < 1000) {
for (double *x = xs; x < y; x += par->dim) {
double *picks[4] = { x }; // agents { x, a, b, c }
#include <math.h>
#include "argph.h"
#include "vector.h"
-#include "de.h"
+#include "cgo.h"
double b0(double *x) {
return -x[0];
args.algorithm = de;
args.outfile = "out.log";
argp_parse(&argp, argc, argv, 0, 0, &args);
- range sample[2] = { (range) { -100.0, 100.0 }, { -100.0, 100.0 } };
- de_parameters par = {2, 1000, sample, f};
+ double sample_min[2] = { -100.0, -100.0 };
+ double sample_max[2] = { 100.0, 100.0 };
+ cgo_de_parameters par = {2, 1000, sample_min, sample_max, f};
double *res = vec_alloc(2);
- de_optimize(&par, res);
+ cgo_de(&par, res);
printf("Converged at x=");
vec_print(2, res);
printf(" with fitness f(x)=%f\n", f(res));
#include <math.h>
#include <omp.h>
#include <stdlib.h>
-#include "pso.h"
#include "vector.h"
+#include "rand.h"
+#include "cgo.h"
-void swarm_alloc(pso_parameters *par, swarm *sw) {
+typedef struct particle particle;
+
+typedef struct {
+ double *x;
+ double fitness;
+} particle_state;
+
+typedef struct {
+ particle *particles;
+ particle *global_best;
+} swarm;
+
+struct particle {
+ particle_state current;
+ particle_state best;
+ double *velocity;
+};
+
+void swarm_alloc(cgo_pso_parameters *par, swarm *sw) {
sw->particles = malloc(sizeof(particle) * par->particlec);
#pragma omp parallel for
for (int p = 0; p < par->particlec; p++) {
}
}
-void swarm_free(pso_parameters *par, swarm *sw) {
+void swarm_free(cgo_pso_parameters *par, swarm *sw) {
#pragma omp parallel for
for (int p = 0; p < par->particlec; p++) {
free(sw->particles[p].current.x);
free(sw->particles);
}
-void swarm_populate(pso_parameters *par, swarm *sw, const range *rrange) {
+void swarm_populate(cgo_pso_parameters *par, swarm *sw, const double *min, const double *max) {
sw->global_best = &sw->particles[0];
#pragma omp parallel for
for (int p = 0; p < par->particlec; p++) {
particle *pt = &sw->particles[p];
for (int d = 0; d < par->dim; d++) {
- vec_pick(par->dim, rrange, pt->current.x);
+ vec_pick(par->dim, min, max, pt->current.x);
vec_copy(par->dim, pt->current.x, pt->best.x);
}
pt->current.fitness = par->f(pt->current.x);
}
}
-void swarm_velocity_update(pso_parameters *par, swarm *sw) {
+void swarm_velocity_update(cgo_pso_parameters *par, swarm *sw) {
#pragma omp parallel for
for (int p = 0; p < par->particlec; p++) {
particle *pt = &sw->particles[p];
}
}
-void pso_optimize(pso_parameters *par, particle_state *res) {
+void cgo_pso(cgo_pso_parameters *par, double *res) {
swarm sw;
swarm_alloc(par, &sw);
- swarm_populate(par, &sw, par->rrange);
+ swarm_populate(par, &sw, par->sample_range_min, par->sample_range_max);
int conv = 0;
double best = INFINITY;
while (conv < 1000) {
conv = 0;
}
}
- vec_copy(par->dim, sw.global_best->best.x, res->x);
- res->fitness = sw.global_best->best.fitness;
+ vec_copy(par->dim, sw.global_best->best.x, res);
swarm_free(par, &sw);
}
return rands() * (max - min) + min;
}
-void vec_pick(const int dim, const range *rrange, double *v) {
- for (int d = 0; d < dim; d++) v[d] = randrange(rrange[d].min, rrange[d].max);
+void vec_pick(const int dim, const double *min, const double *max, double *v) {
+ for (int d = 0; d < dim; d++) v[d] = randrange(min[d], max[d]);
}