1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/examples/t1.cs Mon Dec 06 13:09:21 2010 +0100
1.3 @@ -0,0 +1,99 @@
1.4 +/*Find the minimum value which satisfies the linear inequality:
1.5 + a*x + b*y >= 1 {a,b,x,y Integers} {a,b > 0} {a,b entered on command line}
1.6 +
1.7 + Nigel_Galloway@operamail.com
1.8 + February 2008
1.9 +*/
1.10 +using System;
1.11 +using System.Runtime.InteropServices;
1.12 +
1.13 +unsafe class GLPK{
1.14 + double *lp;
1.15 + public int a;
1.16 + public int b;
1.17 +
1.18 + const string glpkLibrary = "libglpk.so";
1.19 + readonly int GLP_FR = 1;
1.20 + readonly int GLP_IV = 2;
1.21 + readonly int GLP_DB = 4;
1.22 + struct ConstraintMatrix{
1.23 + public fixed int ia[3];
1.24 + public fixed int ja[3];
1.25 + public fixed double ar[3];
1.26 + }
1.27 + [DllImport(glpkLibrary, SetLastError=true)]
1.28 + static extern double* glp_create_prob();
1.29 + [DllImport(glpkLibrary, SetLastError=true)]
1.30 + static extern void glp_add_rows(double* lp, int rows);
1.31 + [DllImport(glpkLibrary, SetLastError=true)]
1.32 + static extern void glp_add_cols(double* lp, int cols);
1.33 + [DllImport(glpkLibrary, SetLastError=true)]
1.34 + static extern void glp_set_col_bnds(double* lp, int col, int bound_type, double lower_bound, double upper_bound);
1.35 + [DllImport(glpkLibrary, SetLastError=true)]
1.36 + static extern void glp_set_col_kind(double* lp, int col, int kind);
1.37 + [DllImport(glpkLibrary, SetLastError=true)]
1.38 + static extern void glp_load_matrix(double* lp, int elements, int* ia, int* ja, double* ar);
1.39 + public GLPK(int a, int b){
1.40 + this.a = a;
1.41 + this.b = b;
1.42 + lp = glp_create_prob();
1.43 + //Col 1 is x, Col 2 is y
1.44 + glp_add_rows(lp, 1);
1.45 + glp_add_cols(lp, 2);
1.46 + glp_set_col_bnds(lp, 1, GLP_FR, 0.0, 0.0);
1.47 + glp_set_col_bnds(lp, 2, GLP_FR, 0.0, 0.0);
1.48 + glp_set_col_kind(lp, 1, GLP_IV);
1.49 + glp_set_col_kind(lp, 2, GLP_IV);
1.50 + //Row 1 is a*x + b*y
1.51 + ConstraintMatrix CM = new ConstraintMatrix();
1.52 + CM.ia[1]=1; CM.ja[1]=1; CM.ar[1]=a;
1.53 + CM.ia[2]=1; CM.ja[2]=2; CM.ar[2]=b;
1.54 + glp_load_matrix(lp, 2, CM.ia, CM.ja, CM.ar);
1.55 + Console.WriteLine("Hello Nigel");
1.56 + }
1.57 +
1.58 + [DllImport(glpkLibrary, SetLastError=true)]
1.59 + static extern void glp_set_row_bnds(double* lp, int row, int bound_type, double lower_bound, double upper_bound);
1.60 + [DllImport(glpkLibrary, SetLastError=true)]
1.61 + static extern void glp_simplex(double* lp, void* options);
1.62 + [DllImport(glpkLibrary, SetLastError=true)]
1.63 + static extern void glp_intopt(double* lp, void* options);
1.64 + [DllImport(glpkLibrary, SetLastError=true)]
1.65 + static extern double glp_mip_col_val(double* lp, int col);
1.66 + public int betterGuess(int upper_bound){
1.67 + //Find a new guess less than the old guess: 1 <= (a*x + b*y) <= (old guess - 1)
1.68 + glp_set_row_bnds(lp, 1, GLP_DB, 1.0, ((double)upper_bound)-0.5);
1.69 + glp_simplex(lp, null);
1.70 + glp_intopt(lp, null);
1.71 + int x = (int)glp_mip_col_val(lp, 1);
1.72 + int y = (int)glp_mip_col_val(lp, 2);
1.73 + int nextGuess = a*x + b*y;
1.74 + Console.WriteLine("x = {0}, y = {1}, a*x + b*y = {2}",x,y,nextGuess);
1.75 + return nextGuess;
1.76 + }
1.77 +
1.78 + [DllImport(glpkLibrary, SetLastError=true)]
1.79 + static extern void glp_delete_prob(double* lp);
1.80 + ~GLPK(){
1.81 + glp_delete_prob(lp);
1.82 + Console.WriteLine("Goodbye Nigel");
1.83 + }
1.84 +
1.85 +}
1.86 +
1.87 +class test{
1.88 + static bool isMinimum(int a, int b, int guess){
1.89 + Console.WriteLine("Trying {0}",guess);
1.90 + if (a%guess > 0) return false;
1.91 + if (b%guess > 0) return false;
1.92 + Console.WriteLine("Solution is {0}",guess);
1.93 + return true;
1.94 + }
1.95 +
1.96 + public static void Main(string[] args){
1.97 + Console.WriteLine("a = {0}, b = {1}",args[0], args[1]);
1.98 + GLPK lp = new GLPK(Int32.Parse(args[0]),Int32.Parse(args[1]));
1.99 + int guess = (lp.a > lp.b) ? lp.b : lp.a;
1.100 + while (!isMinimum(lp.a,lp.b,guess)) guess = lp.betterGuess(guess);
1.101 + }
1.102 +}