summaryrefslogtreecommitdiff
path: root/glpk-5.0/src/proxy/proxy1.c
diff options
context:
space:
mode:
authorPasha <pasha@member.fsf.org>2023-01-27 00:54:07 +0000
committerPasha <pasha@member.fsf.org>2023-01-27 00:54:07 +0000
commitef800d4ffafdbde7d7a172ad73bd984b1695c138 (patch)
tree920cc189130f1e98f252283fce94851443641a6d /glpk-5.0/src/proxy/proxy1.c
parentec4ae3c2b5cb0e83fb667f14f832ea94f68ef075 (diff)
downloadoneapi-ef800d4ffafdbde7d7a172ad73bd984b1695c138.tar.gz
oneapi-ef800d4ffafdbde7d7a172ad73bd984b1695c138.tar.bz2
simplex-glpk with modified glpk for fpgaHEADmaster
Diffstat (limited to 'glpk-5.0/src/proxy/proxy1.c')
-rw-r--r--glpk-5.0/src/proxy/proxy1.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/glpk-5.0/src/proxy/proxy1.c b/glpk-5.0/src/proxy/proxy1.c
new file mode 100644
index 0000000..f32bec5
--- /dev/null
+++ b/glpk-5.0/src/proxy/proxy1.c
@@ -0,0 +1,86 @@
+/* proxy1.c */
+
+/***********************************************************************
+* This code is part of GLPK (GNU Linear Programming Kit).
+* Copyright (C) 2013, 2018 Free Software Foundation, Inc.
+* Written by Andrew Makhorin <mao@gnu.org>.
+*
+* GLPK is free software: you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* GLPK is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+* License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with GLPK. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+#include "env.h"
+#include "ios.h"
+#include "proxy.h"
+
+void ios_proxy_heur(glp_tree *T)
+{ glp_prob *prob;
+ int j, status;
+ double *xstar, zstar;
+ /* this heuristic is applied only once on the root level */
+ if (!(T->curr->level == 0 && T->curr->solved == 1))
+ goto done;
+ prob = glp_create_prob();
+ glp_copy_prob(prob, T->mip, 0);
+ xstar = xcalloc(1+prob->n, sizeof(double));
+ for (j = 1; j <= prob->n; j++)
+ xstar[j] = 0.0;
+ if (T->mip->mip_stat != GLP_FEAS)
+ status = proxy(prob, &zstar, xstar, NULL, 0.0,
+ T->parm->ps_tm_lim, 1);
+ else
+ { double *xinit = xcalloc(1+prob->n, sizeof(double));
+ for (j = 1; j <= prob->n; j++)
+ xinit[j] = T->mip->col[j]->mipx;
+ status = proxy(prob, &zstar, xstar, xinit, 0.0,
+ T->parm->ps_tm_lim, 1);
+ xfree(xinit);
+ }
+ if (status == 0)
+#if 0 /* 17/III-2016 */
+ glp_ios_heur_sol(T, xstar);
+#else
+ { /* sometimes the proxy heuristic reports a wrong solution, so
+ * make sure that the solution is really integer feasible */
+ int i, feas1, feas2, ae_ind, re_ind;
+ double ae_max, re_max;
+ glp_copy_prob(prob, T->mip, 0);
+ for (j = 1; j <= prob->n; j++)
+ prob->col[j]->mipx = xstar[j];
+ for (i = 1; i <= prob->m; i++)
+ { GLPROW *row;
+ GLPAIJ *aij;
+ row = prob->row[i];
+ row->mipx = 0.0;
+ for (aij = row->ptr; aij != NULL; aij = aij->r_next)
+ row->mipx += aij->val * aij->col->mipx;
+ }
+ glp_check_kkt(prob, GLP_MIP, GLP_KKT_PE, &ae_max, &ae_ind,
+ &re_max, &re_ind);
+ feas1 = (re_max <= 1e-6);
+ glp_check_kkt(prob, GLP_MIP, GLP_KKT_PB, &ae_max, &ae_ind,
+ &re_max, &re_ind);
+ feas2 = (re_max <= 1e-6);
+ if (feas1 && feas2)
+ glp_ios_heur_sol(T, xstar);
+ else
+ xprintf("WARNING: PROXY HEURISTIC REPORTED WRONG SOLUTION; "
+ "SOLUTION REJECTED\n");
+ }
+#endif
+ xfree(xstar);
+ glp_delete_prob(prob);
+done: return;
+}
+
+/* eof */