examples/t1.cs
changeset 1 c445c931472f
     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 +}