The following code sample demonstrates integration with the AlgLib library.

class Program
{
    static void Main(string[] args)
    {
        var x = new Variable();
        var y = new Variable();

        // f(x, y) = log(exp(x²-2y²-xy+17) + exp(x²-3x+y))
        var func = TermBuilder.Log(
            TermBuilder.Exp(x * x + 2 * y * y - x + y + 17) +
            TermBuilder.Exp(x * x + y * y + 3 * x + y));

        double[] minimum = Minimize(func.Compile(x, y));

        Console.WriteLine("The minimum is at ({0}, {1})", minimum[0], minimum[1]);
    }

    private static double[] Minimize(ICompiledTerm func)
    {
        // we will use an array of zeros as our initial guess.
        var x = new double[func.Variables.Count];
            
        // we will optimize using AlgLib's conjuate gradient algorithm
        alglib.mincgstate state;
        alglib.mincgcreate(x, out state);
        alglib.mincgoptimize(state, (double[] arg, ref double val, double[] grad, object obj) =>
            {
                // perform differentiation with AutoDiff
                var diff = func.Differentiate(arg);

                // copy the results to AlgLib
                val = diff.Item2;
                Array.Copy(diff.Item1, grad, grad.Length);
            }, null, null);
            
        // extract the resulting minimum point
        alglib.mincgreport report;
        alglib.mincgresults(state, out x, out report);

        // return minimum
        return x;
    }
}

Last edited Nov 18, 2011 at 5:40 PM by alexshtf, version 1

Comments

No comments yet.