From e499467d2c67f214b0871376b068c5b6fc7896a1 Mon Sep 17 00:00:00 2001 From: Alberto Ruiz Date: Fri, 10 Apr 2015 09:53:23 +0200 Subject: merge recent --- packages/glpk/src/C/glpk.c | 130 +++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 63 deletions(-) (limited to 'packages/glpk/src/C') diff --git a/packages/glpk/src/C/glpk.c b/packages/glpk/src/C/glpk.c index bfbb435..86b1277 100644 --- a/packages/glpk/src/C/glpk.c +++ b/packages/glpk/src/C/glpk.c @@ -10,67 +10,71 @@ /*-----------------------------------------------------*/ -int c_simplex_sparse(int m, int n, DMAT(c), DMAT(b), DVEC(s)) { - glp_prob *lp; - lp = glp_create_prob(); - glp_set_obj_dir(lp, GLP_MAX); - int i,j,k; - int tot = cr - n; - glp_add_rows(lp, m); - glp_add_cols(lp, n); +#define C_X_SPARSE(X) \ + int c_##X##_sparse(int m, int n, DMAT(c), DMAT(b), DVEC(s)) { \ + glp_prob *lp; \ + lp = glp_create_prob(); \ + glp_set_obj_dir(lp, GLP_MAX); \ + int i,j,k; \ + int tot = cr - n; \ + glp_add_rows(lp, m); \ + glp_add_cols(lp, n); \ + \ + /*printf("%d %d\n",m,n);*/ \ + \ + /* the first n values */ \ + for (k=1;k<=n;k++) { \ + glp_set_obj_coef(lp, k, AT(c, k-1, 2)); \ + /*printf("%d %f\n",k,AT(c, k-1, 2)); */ \ + } \ + \ + int * ia = malloc((1+tot)*sizeof(int)); \ + int * ja = malloc((1+tot)*sizeof(int)); \ + double * ar = malloc((1+tot)*sizeof(double)); \ + \ + for (k=1; k<= tot; k++) { \ + ia[k] = rint(AT(c,k-1+n,0)); \ + ja[k] = rint(AT(c,k-1+n,1)); \ + ar[k] = AT(c,k-1+n,2); \ + /*printf("%d %d %f\n",ia[k],ja[k],ar[k]);*/ \ + } \ + glp_load_matrix(lp, tot, ia, ja, ar); \ + \ + int t; \ + for (i=1;i<=m;i++) { \ + switch((int)rint(AT(b,i-1,0))) { \ + case 0: { t = GLP_FR; break; } \ + case 1: { t = GLP_LO; break; } \ + case 2: { t = GLP_UP; break; } \ + case 3: { t = GLP_DB; break; } \ + default: { t = GLP_FX; break; } \ + } \ + glp_set_row_bnds(lp, i, t , AT(b,i-1,1), AT(b,i-1,2)); \ + } \ + for (j=1;j<=n;j++) { \ + switch((int)rint(AT(b,m+j-1,0))) { \ + case 0: { t = GLP_FR; break; } \ + case 1: { t = GLP_LO; break; } \ + case 2: { t = GLP_UP; break; } \ + case 3: { t = GLP_DB; break; } \ + default: { t = GLP_FX; break; } \ + } \ + glp_set_col_bnds(lp, j, t , AT(b,m+j-1,1), AT(b,m+j-1,2)); \ + } \ + glp_term_out(0); \ + glp_##X(lp, NULL); \ + sp[0] = glp_get_status(lp); \ + sp[1] = glp_get_obj_val(lp); \ + for (k=1; k<=n; k++) { \ + sp[k+1] = glp_get_col_prim(lp, k); \ + } \ + glp_delete_prob(lp); \ + free(ia); \ + free(ja); \ + free(ar); \ + \ + return 0; \ + } \ - //printf("%d %d\n",m,n); - - // the first n values - for (k=1;k<=n;k++) { - glp_set_obj_coef(lp, k, AT(c, k-1, 2)); - //printf("%d %f\n",k,AT(c, k-1, 2)); - } - - int * ia = malloc((1+tot)*sizeof(int)); - int * ja = malloc((1+tot)*sizeof(int)); - double * ar = malloc((1+tot)*sizeof(double)); - - for (k=1; k<= tot; k++) { - ia[k] = rint(AT(c,k-1+n,0)); - ja[k] = rint(AT(c,k-1+n,1)); - ar[k] = AT(c,k-1+n,2); - //printf("%d %d %f\n",ia[k],ja[k],ar[k]); - } - glp_load_matrix(lp, tot, ia, ja, ar); - - int t; - for (i=1;i<=m;i++) { - switch((int)rint(AT(b,i-1,0))) { - case 0: { t = GLP_FR; break; } - case 1: { t = GLP_LO; break; } - case 2: { t = GLP_UP; break; } - case 3: { t = GLP_DB; break; } - default: { t = GLP_FX; break; } - } - glp_set_row_bnds(lp, i, t , AT(b,i-1,1), AT(b,i-1,2)); - } - for (j=1;j<=n;j++) { - switch((int)rint(AT(b,m+j-1,0))) { - case 0: { t = GLP_FR; break; } - case 1: { t = GLP_LO; break; } - case 2: { t = GLP_UP; break; } - case 3: { t = GLP_DB; break; } - default: { t = GLP_FX; break; } - } - glp_set_col_bnds(lp, j, t , AT(b,m+j-1,1), AT(b,m+j-1,2)); - } - glp_term_out(0); - glp_simplex(lp, NULL); - sp[0] = glp_get_status(lp); - sp[1] = glp_get_obj_val(lp); - for (k=1; k<=n; k++) { - sp[k+1] = glp_get_col_prim(lp, k); - } - glp_delete_prob(lp); - free(ia); - free(ja); - free(ar); - - return 0; -} +C_X_SPARSE(simplex); +C_X_SPARSE(exact); -- cgit v1.2.3