Skip to content

Instantly share code, notes, and snippets.

@jamesasefa
Last active February 2, 2021 16:16
Show Gist options
  • Save jamesasefa/77dc6edbe5e63c8734b235d0f72caf6f to your computer and use it in GitHub Desktop.
Save jamesasefa/77dc6edbe5e63c8734b235d0f72caf6f to your computer and use it in GitHub Desktop.
Benchmarking Slsqp4j vs. SciPy

Slsqp4j Benchmark

public class TestClassTest
{
    @Test
    public void test10Vars() {
        final Slsqp slsqp = new Slsqp.SlsqpBuilder()
            .withObjectiveFunction(new RosenBrock())
            .build();

        final int length = 10;
        final double[] x = new double[length];

        for (int i = 0; i < length; i++)
        {
            x[i] = i;
        }

        final long now = System.nanoTime();
        OptimizeResult result = slsqp.minimize(x);
        do {
            result = slsqp.minimize(x);
        } while (!result.success());
        final long after = System.nanoTime();
        final long diff = after - now;

        System.out.println("10vars diff: " + diff);
        System.out.println("succes: " + result.success());
        System.out.println("exitMode: " + result.exitMode());
        System.out.println("numiters " + result.numIters());
        final double[] resultVec = result.resultVec();
        for (int i = 0; i < resultVec.length; i++)
        {
            System.out.println(resultVec[i]);
        }
    }

    @Test
    public void test50Vars() {
        final Slsqp slsqp = new Slsqp.SlsqpBuilder()
            .withObjectiveFunction(new RosenBrock())
            .build();

        final int length = 50;
        final double[] x = new double[length];

        for (int i = 0; i < length; i++)
        {
            x[i] = i;
        }

        final long now = System.nanoTime();
        OptimizeResult result = slsqp.minimize(x);
        do {
            result = slsqp.minimize(x);
        } while (!result.success());
        final long after = System.nanoTime();
        final long diff = after - now;

        System.out.println("50vars diff: " + diff );
        System.out.println("succes: " + result.success());
        System.out.println("exitMode: " + result.exitMode());
        System.out.println("numiters " + result.numIters());
        final double[] resultVec = result.resultVec();
        for (int i = 0; i < resultVec.length; i++)
        {
            System.out.println(resultVec[i]);
        }
    }

    @Test
    public void test100Vars() {
        final Slsqp slsqp = new Slsqp.SlsqpBuilder()
            .withObjectiveFunction(new RosenBrock())
            .build();

        final int length = 100;
        final double[] x = new double[length];

        for (int i = 0; i < length; i++)
        {
            x[i] = i;
        }

        final long now = System.nanoTime();
        OptimizeResult result = slsqp.minimize(x);
        do {
            result = slsqp.minimize(x);
        } while (!result.success());
        final long after = System.nanoTime();
        final long diff = after - now;

        System.out.println("100vars diff: " + diff);
        System.out.println("succes: " + result.success());
        System.out.println("exitMode: " + result.exitMode());
        System.out.println("numiters " + result.numIters());
        final double[] resultVec = result.resultVec();
        for (int i = 0; i < resultVec.length; i++)
        {
            System.out.println(resultVec[i]);
        }
    }

    @Test
    public void test500Vars() {
        final Slsqp slsqp = new Slsqp.SlsqpBuilder()
            .withObjectiveFunction(new RosenBrock())
            .build();

        final int length = 500;
        final double[] x = new double[length];

        for (int i = 0; i < length; i++)
        {
            x[i] = i;
        }

        final long now = System.nanoTime();
        OptimizeResult result = slsqp.minimize(x);
        do {
            result = slsqp.minimize(x);
        } while (!result.success());
        final long after = System.nanoTime();
        final long diff = after - now;

        System.out.println("500vars diff: " + diff);
        System.out.println("succes: " + result.success());
        System.out.println("exitMode: " + result.exitMode());
        System.out.println("numiters " + result.numIters());
        final double[] resultVec = result.resultVec();
        for (int i = 0; i < resultVec.length; i++)
        {
            System.out.println(resultVec[i]);
        }
    }

    @Test
    public void test1000Vars() {
        final Slsqp slsqp = new Slsqp.SlsqpBuilder()
            .withObjectiveFunction(new RosenBrock())
            .build();

        final int length = 1000;
        final double[] x = new double[length];

        for (int i = 0; i < length; i++)
        {
            x[i] = i;
        }

        final long now = System.nanoTime();
        OptimizeResult result = slsqp.minimize(x);
        do {
            result = slsqp.minimize(x);
        } while (!result.success());
        final long after = System.nanoTime();
        final long diff = after - now;

        System.out.println("1000vars diff: " + diff);
        System.out.println("succes: " + result.success());
        System.out.println("exitMode: " + result.exitMode());
        System.out.println("numiters " + result.numIters());
        final double[] resultVec = result.resultVec();
        for (int i = 0; i < resultVec.length; i++)
        {
            System.out.println(resultVec[i]);
        }
    }

    public static final class RosenBrock implements Vector2ScalarFunc
    {
        @Override
        public double apply(double[] x, double... arg)
        {
            double val = 0;
            for (int i = 0; i < x.length - 1; i++) {
                val += 100 * Math.pow((x[i + 1] - Math.pow(x[i], 2)), 2) + Math.pow((1 - x[i]), 2);
            }
            return val;
        }
    }
}

SciPy benchmark

#!/usr/bin/python3

import time
from scipy.optimize import minimize

def rosenbrock(x):
    val = 0
    for i in range(0, len(x) - 1):
        val += 100 * ((x[i + 1] - x[i] ** 2) ** 2) + (1 - x[i]) ** 2
    return val


if __name__ == "__main__":

    x = []
    length = 10
    for i in range(0, length):
        x.append(i)

    start = time.time_ns()
    while True:
        result = minimize(rosenbrock, x, method='SLSQP')
        if result.success or result.nit > 100:
            break
    end = time.time_ns()
    diff = (end - start)
    print("10 vars time: {}".format(diff))
    print(result.x)
    print(result.success)
    print(result.nit)
    print(result.message)

    x = []
    length = 50
    for i in range(0, length):
        x.append(i)

    start = time.time_ns()
    while True:
        result = minimize(rosenbrock, x, method='SLSQP')
        if result.success or result.nit > 100:
            break
    end = time.time_ns()
    diff = (end - start)
    print("50 vars time: {}".format(diff))
    print(result.x)
    print(result.success)
    print(result.nit)
    print(result.message)

    x = []
    length = 100
    for i in range(0, length):
        x.append(i)

    start = time.time_ns()
    while True:
        result = minimize(rosenbrock, x, method='SLSQP')
        if result.success or result.nit > 100:
            break
    end = time.time_ns()
    diff = (end - start)
    print("100 vars time: {}".format(diff))
    print(result.x)
    print(result.success)
    print(result.nit)
    print(result.message)

    x = []
    length = 500
    for i in range(0, length):
        x.append(i)

    start = time.time_ns()
    while True:
        result = minimize(rosenbrock, x, method='SLSQP')
        if result.success or result.nit > 100:
            break
    end = time.time_ns()
    diff = (end - start)
    print("500 vars time: {}".format(diff))
    print(result.x)
    print(result.success)
    print(result.nit)
    print(result.message)

    x = []
    length = 1000
    for i in range(0, length):
        x.append(i)

    start = time.time_ns()
    while True:
        result = minimize(rosenbrock, x, method='SLSQP')
        if result.success or result.nit > 100:
            break
    end = time.time_ns()
    diff = (end - start)
    print("1000 vars time: {}".format(diff))
    print(result.x)
    print(result.success)
    print(result.nit)
    print(result.message)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment