rcgsheffield / sheffield_hpc

Docs for University of Sheffield HPC systems
https://docs.hpc.shef.ac.uk/
Other
52 stars 50 forks source link

Add NLopt Example - Stanage R9 #2138

Open nahceigna opened 1 week ago

nahceigna commented 1 week ago

The example is missing from NLopt. Example can be added according to NLopt Tutorial.

The testing code can be added as follow (file named as tutorial.c):

// Obtained from: https://nlopt.readthedocs.io/en/latest/NLopt_Tutorial/

#include <stdio.h>
#include <math.h>
#include <nlopt.h>

// Objective function
double myfunc(unsigned n, const double *x, double *grad, void *my_func_data)
{
    if (grad) {
        grad[0] = 0.0;
        grad[1] = 0.5 / sqrt(x[1]);
    }
    return sqrt(x[1]);
}

// Constraint data structure
typedef struct {
    double a, b;
} my_constraint_data;

// Constraint function
double myconstraint(unsigned n, const double *x, double *grad, void *data)
{
    my_constraint_data *d = (my_constraint_data *) data;
    double a = d->a, b = d->b;
    if (grad) {
        grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);
        grad[1] = -1.0;
    }
    return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]);
}

int main()
{
    double lb[2] = { -HUGE_VAL, 0 }; /* lower bounds */
    nlopt_opt opt;

    opt = nlopt_create(NLOPT_LD_MMA, 2); /* algorithm and dimensionality */
    nlopt_set_lower_bounds(opt, lb);
    nlopt_set_min_objective(opt, myfunc, NULL);

    // Adding inequality constraints
    my_constraint_data data[2] = { {2, 0}, {-1, 1} };

    nlopt_add_inequality_constraint(opt, myconstraint, &data[0], 1e-8);
    nlopt_add_inequality_constraint(opt, myconstraint, &data[1], 1e-8);

    nlopt_set_xtol_rel(opt, 1e-4); // Stopping criteria

    double x[2] = { 1.234, 5.678 };  /* `*`some` `initial` `guess`*` */
    double minf; /* `*`the` `minimum` `objective` `value,` `upon` `return`*` */
    // Perform optimisation
    if (nlopt_optimize(opt, x, &minf) < 0) {
        printf("nlopt failed!\n");
    }
    else {
        printf("found minimum at f(%g,%g) = %0.10g\n", x[0], x[1], minf);
    }

    nlopt_destroy(opt); // Clean up

    return 0;
}

The tutorial.c program can be compiled and run as follow:

cc tutorial.c -o tutorial -lnlopt -lm
./tutorial

Further details can be found in Jira.