commit ce09e6791c74be80afa1102234e4dfe4d139cc1a
Author: Chris Matrakidis <cmatraki@gmail.com>
Date:   Mon Jan 9 14:10:51 2017 +0200

    reset row wise representation of N matrix if re-entering dual simplex

diff --git a/src/simplex/spydual.c b/src/simplex/spydual.c
index 5e1c828..d1d2493 100644
--- a/src/simplex/spydual.c
+++ b/src/simplex/spydual.c
@@ -1871,9 +1871,51 @@ struct csa *spy_dual_init(glp_prob *P, int use_delta)
 *
 *  On exit the return values are as in spy_dual described earlier */
 
+static void reset_nt(glp_prob *P, struct csa *csa)
+{     int i, j, k, jj;
+      SPXLP *lp = csa->lp;
+      int *map = csa->map;
+      int *head = lp->head;
+      int m = P->m;
+      int n = P->n;
+      int status;
+      /* remove columns that have changed */
+      jj = 0;
+      for (i = 1; i <= m+n; i++)
+      {  if ((k = map[i]) == 0)
+            continue;
+         if (k < 0)
+            k = -k;
+         status = (i <= m) ? P->row[i]->stat : P->col[i-m]->stat;
+         if (status == GLP_BS)
+            continue;
+         jj++;
+         if (head[m+jj] != k)
+            spx_nt_del_col(lp, csa->nt, jj, head[m+jj]);
+      }
+      /* restore original columns */
+      jj = 0;
+      for (i = 1; i <= m+n; i++)
+      {  if ((k = map[i]) == 0)
+            continue;
+         if (k < 0)
+            k = -k;
+         status = (i <= m) ? P->row[i]->stat : P->col[i-m]->stat;
+         if (status == GLP_BS)
+            continue;
+         jj++;
+         if (head[m+jj] != k)
+            spx_nt_add_col(lp, csa->nt, jj, k);
+      }
+      return;
+}
+
 int spy_dual_main(glp_prob *P, const glp_smcp *parm, struct csa *csa)
 {     /* dual simplex using previously initialised state */
       int ret;
+      /* reset row wise representation of N matrix if re-entering */
+      if (csa->nt != NULL)
+         reset_nt(P, csa);
       /* build working LP initial basis */
       spx_build_basis(csa->lp, P, csa->map);
       memcpy(csa->orig_b, csa->lp->b, (1+csa->lp->m) * sizeof(double));
@@ -1895,8 +1937,8 @@ int spy_dual_main(glp_prob *P, const glp_smcp *parm, struct csa *csa)
       {  csa->nt = talloc(1, SPXNT);
          spx_alloc_nt(csa->lp, csa->nt);
          spx_init_nt(csa->lp, csa->nt);
+         spx_build_nt(csa->lp, csa->nt);
       }
-      spx_build_nt(csa->lp, csa->nt);
 #endif
       /* initialize working components */
       csa->phase = 0;
