// e04us Example Program Text // C# version, NAG Copyright 2008 using System; using NagLibrary; using System.Globalization; using System.IO; namespace NagDotNetExamples { public class E04USE { static string datafile = "ExampleData/e04use.d"; // as a command line argument. It defaults to the named file specified below otherwise. // static void Main(String[] args) { if (args.Length == 1) { datafile = args[0]; } StartExample(); } public static void StartExample() { E04.E04US_CONFUN confunE04US = new E04.E04US_CONFUN(confun); E04.E04US_OBJFUN objfunE04US = new E04.E04US_OBJFUN(objfun); try { DataReader sr = new DataReader(datafile); double objf = 0.0; int i, iter, j, m, n, nclin, ncnln; int ifail; Console.WriteLine("e04us Example Program Results"); // Skip heading in data file sr.Reset(); sr.Reset(); m = int.Parse(sr.Next()); n = int.Parse(sr.Next()); sr.Reset(); nclin = int.Parse(sr.Next()); ncnln = int.Parse(sr.Next()); double[,] a = new double[nclin, n]; double[] bl = new double[nclin+ncnln+n]; double[] bu = new double[nclin+ncnln+n]; double[] c = new double[ncnln]; double[,] cjac = new double[ncnln, n]; double[] clamda = new double[nclin+ncnln+n]; double[] f = new double[m]; double[,] fjac = new double[m, n]; double[,] r = new double[n, n]; double[] work = new double[n+nclin]; double[] x = new double[n]; double[] y = new double[m]; int[] istate = new int[nclin+ncnln+n]; // // Read a, y, bl, bu and x from data file // if (nclin > 0) { sr.Reset(); for (i = 1; i <= nclin; i++) { for (j = 1; j <= n; j++) { a[i - 1, j - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } } } sr.Reset(); for (i = 1; i <= m; i++) { y[i - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } sr.Reset(); for (i = 1; i <= n + nclin + ncnln; i++) { bl[i - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } sr.Reset(); for (i = 1; i <= n + nclin + ncnln; i++) { bu[i - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } sr.Reset(); for (i = 1; i <= n; i++) { x[i - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } // // Initialise e04.e04us and check for error exits // E04.e04usOptions options = new E04.e04usOptions(); options.Set("List"); options.Set("Print level = 10"); // // Solve the problem // E04.e04us(m, n, nclin, ncnln, a, bl, bu, y, confunE04US, objfunE04US, out iter, istate, c, cjac, f, fjac, clamda, out objf, r, x, options, out ifail); // // Check for error exits // Console.WriteLine(""); if (ifail == 9) { Console.WriteLine(" ** An input parameter is invalid"); } else if (ifail >= 0) { Console.WriteLine(" ** e04us returned with ifail = {0, 3}", ifail); Console.WriteLine(""); Console.WriteLine(" Varbl Istate Value Lagr Mult"); Console.WriteLine(""); for (i = 1; i <= n; i++) { Console.WriteLine(" V {0,3} {1,3} {2,14:g6} {3,12:g4}", i, istate[i - 1], x[i - 1], clamda[i - 1]); } if (nclin > 0) { // // This performs the matrix vector multiplication A*X // (linear constraint values) and puts the result in // the first nclin locations of work. // F06.f06pa("N", nclin, n, 1.00e0, a, x, 1, 0.00e0, work, 1, out ifail); Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine(" L Con Istate Value Lagr Mult"); Console.WriteLine(""); for (i = n + 1; i <= n + nclin; i++) { j = i - n; Console.WriteLine(" L {0,3} {1,3} {2,14:g6} {3,12:g4}", j, istate[i - 1], work[j - 1], clamda[i - 1]); } } if (ncnln > 0) { Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine(" N Con Istate Value Lagr Mult"); Console.WriteLine(""); for (i = n + nclin + 1; i <= n + nclin + ncnln; i++) { j = i - n - nclin; Console.WriteLine(" N {0,3} {1,3} {2,14:g6} {3,12:g4}", j, istate[i - 1], c[j - 1], clamda[i - 1]); } } Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine(" Final objective value = {0,15:g7}", objf); } if (ifail < 0) { Console.WriteLine(" MODE < 0 on exit from OBJFUN or CONFUN.\n\n Problem abandoned."); } // // } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine( "Exception Raised"); } } public static void objfun(ref int mode, int m, int n, int needfi, double[] x, double[] f, double[,] fjac, int nstate) { // Evaluates the vector f(x) and its first derivatives. double pt49 = 0.490e0; double one = 1.00e0; double eight = 8.00e0; double ai, temp, x1, x2; int i; bool mode02 = false, mode12 = false; double[] a = new double[44] { 8.00e0, 8.00e0, 10.00e0, 10.00e0, 10.00e0, 10.00e0, 12.00e0, 12.00e0, 12.00e0, 12.00e0, 14.00e0, 14.00e0, 14.00e0, 16.00e0, 16.00e0, 16.00e0, 18.00e0, 18.00e0, 20.00e0, 20.00e0, 20.00e0, 22.00e0, 22.00e0, 22.00e0, 24.00e0, 24.00e0, 24.00e0, 26.00e0, 26.00e0, 26.00e0, 28.00e0, 28.00e0, 30.00e0, 30.00e0, 30.00e0, 32.00e0, 32.00e0, 34.00e0, 36.00e0, 36.00e0, 38.00e0, 38.00e0, 40.00e0, 42.00e0 }; x1 = x[0]; x2 = x[1]; mode02 = ((mode == 0) || (mode == 2)); mode12 = ((mode == 1) || (mode == 2)); for (i = 1; i <= m; i++) { if (needfi == i) { f[i - 1] = x1 + (pt49 - x1) * Math.Exp(-x2 * (a[i - 1] - eight)); } else { ai = a[i - 1]; temp = Math.Exp(-x2 * (ai - eight)); if (mode02) { f[i - 1] = x1 + (pt49 - x1) * temp; } if (mode12) { fjac[i - 1, 0] = one - temp; fjac[i - 1, 1] = -(pt49 - x1) * (ai - eight) * temp; } } } // } // public static void confun(ref int mode, int ncnln, int n, int[] needc, double[] x, double[] c, double[,] cjac, int nstate) { // Evaluates the vector c(x) and its first derivatives. double zero = 0.00e0; double pt09 = 0.090e0; double pt49 = 0.490e0; int i, j; if (nstate == 1) { // First call to confun. Set all Jacobian elements to zero. // Note that this will only work when 'Derivative Level = 3' // (the default; see Section 11.2). for (j = 1; j <= n; j++) { for (i = 1; i <= ncnln; i++) { cjac[i - 1, j - 1] = zero; } } } // if (needc[0] > 0) { if ((mode == 0) || (mode == 2)) { c[0] = -pt09 - x[0] * x[1] + pt49 * x[1]; } if ((mode == 1) || (mode == 2)) { cjac[0, 0] = -x[1]; cjac[0, 1] = -x[0] + pt49; } } // } } }