===================================================================
RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/nd.c,v
retrieving revision 1.54
retrieving revision 1.56
diff -u -p -r1.54 -r1.56
--- OpenXM_contrib2/asir2018/engine/nd.c	2021/10/29 20:50:02	1.54
+++ OpenXM_contrib2/asir2018/engine/nd.c	2021/12/05 22:41:04	1.56
@@ -1,4 +1,4 @@
-/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.53 2021/03/12 01:18:33 noro Exp $ */
+/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.55 2021/11/29 09:19:33 noro Exp $ */
 
 #include "nd.h"
 
@@ -1301,6 +1301,7 @@ INLINE int ndl_find_reducer_s(UINT *dg,SIG sig)
       _ndltodl(tmp,DL(quo));
       _addtodl(nd_nvar,DL(nd_psh[i]->sig),DL(quo));
       quo->pos = nd_psh[i]->sig->pos;
+      _adddl(nd_nvar,DL(quo),nd_sba_hm[quo->pos],DL2(quo));
       ret = comp_sig(sig,quo);
       if ( ret > 0 ) { singular = 0; break; }
       if ( ret == 0 ) { /* fprintf(asir_out,"s"); fflush(asir_out); */ singular = 1; }
@@ -1709,6 +1710,14 @@ int nd_nf_s(int mod,ND d,ND g,NDV *ps,int full,ND *rp)
                 nd_removecont2(d,g);
                 hmag = ((double)p_mag(HCP(g)))*nd_scale;
             }
+            if ( nd_gentrace ) {
+                /* Trace=[div,index,mul,ONE] */
+                STOZ(index,iq);
+                nmtodp(mod,mul,&dmul);
+                node = mknode(4,div,iq,dmul,ONE);
+            }
+            MKLIST(hist,node);
+            MKNODE(node,hist,nd_tracelist); nd_tracelist = node;
         } else if ( index == -1 ) {
           // singular top reducible
           return -1;
@@ -2470,80 +2479,78 @@ LIST compute_splist()
 }
 
 typedef struct oHPDATA {
-  P hn; // HP(t)=hn(t)/(1-t)^n
-  int len;
-  P *head; // hp(i)=head[i] (i=0,...,len-1)
-  P hp; // dim Hm(i)=hp(i) (i >= len)
+  int n;
+  P hn; // HP(t)=hn(t)/((1-t^w0)*...*(1-t^w(n-1)))
   VECT x; // BDY(x)[i] = <<0,...,1,...,0>>
-  P *plist; // plist[i]=(1-t)^i
+  int *w;
 } *HPDATA;
 
 void make_reduced(VECT b,int nv);
 void mhp_rec(VECT b,VECT x,P t,P *r);
 P mhp_ctop(P *r,P *plist,int n);
-void mhp_to_hf(VL vl,P hp,int n,P *plist,VECT *head,P *hf);
 DL monomial_colon(DL a,DL b,int n);
-LIST dp_monomial_hilbert_poincare(VECT b,VECT x,P *plist);
+LIST dp_monomial_hilbert_poincare(VECT b,VECT x);
+LIST dp_monomial_hilbert_poincare_weight(VECT b,VECT x,int *w);
 
-int hpvalue(HPDATA data,int d)
-{
-  P *head;
-  int len;
-  P hp,val;
-  Z dz;
-
-  head = data->head;
-  len = data->len;
-  hp = data->hp;
-  if ( d < len )
-    return ZTOS((Z)head[d]);
-  else {
-    STOZ(d,dz);
-    substp(CO,hp,hp->v,(P)dz,&val);
-    return ZTOS((Z)val);
-  }
-}
-
 void setup_hpdata(HPDATA final,HPDATA current)
 {
-  int n,i;
-  P *r;
+  int n,i,wlen;
   DL *p;
-  P tv;
-  VECT b,x,head;
+  VECT b,x;
   DL dl;
+  LIST weight;
+  LIST ret;
+  int *w;
+  NODE nd;
 
-  n = nd_nvar;
-  final->hn = (P)ARG0(nd_hpdata);
-  head = (VECT)ARG2(nd_hpdata);
-  final->len = head->len;
-  final->head = (P *)BDY(head);
-  final->hp = (P)ARG3(nd_hpdata);
-  final->plist = (P *)BDY((VECT)ARG4(nd_hpdata));
+  final->n = n = nd_nvar;
+  final->hn = (P)BDY(nd_hpdata);
+  if ( NEXT(nd_hpdata) != 0 && (weight=(LIST)BDY(NEXT(nd_hpdata))) != 0 ) {
+    wlen = length(BDY(weight));
+    if ( n != wlen )
+      error("setup_hpdata : inconsistent weight length");
+    w = (int *)MALLOC(n*sizeof(int));
+    for ( i = 0, nd = BDY((LIST)weight); i < n; i++, nd = NEXT(nd) ) 
+      w[i] = ZTOS((Z)BDY(nd));
+  } else
+    w = 0;
   MKVECT(x,n);
   for ( i = 0; i < n; i++ ) {
     NEWDL(dl,n); dl->d[i] = 1; dl->td = 1; BDY(x)[i] = dl;
   }
   final->x = x;
+  final->w = w;
 
-  r = (P *)CALLOC(n+1,sizeof(P));
   MKVECT(b,nd_psn); p = (DL *)BDY(b);
   for ( i = 0; i < nd_psn; i++ ) {
     p[i] = ndltodl(n,nd_psh[i]->dl);
   }
-  make_reduced(b,n);
-  makevar("t",&tv);
-  mhp_rec(b,x,tv,r);
-  current->hn = mhp_ctop(r,final->plist,n);
-  mhp_to_hf(CO,current->hn,n,final->plist,&head,&current->hp);
-  current->head = (P *)BDY(head);
-  current->len = head->len;
+  if ( w ) {
+    ret = dp_monomial_hilbert_poincare_weight(b,x,w);
+  } else
+    ret = dp_monomial_hilbert_poincare(b,x);
+  current->n = n;
+  current->hn = (P)BDY(BDY(ret));
   current->x = x;
-  current->plist = final->plist;
+  current->w = w;
 }
 
-void update_hpdata(HPDATA current,int nh,int do_hf)
+int comp_hn(P a, P b)
 {
+  P s;
+  DCP dc;
+
+  subp(CO,a,b,&s);
+  if ( !s ) return 99999999; /* XXX */
+  else if ( OID(s) == 1 ) return 0;
+  else {
+    for ( dc = DC(s); NEXT(dc); dc = NEXT(dc) );
+    return (int)ZTOS((Z)dc->d);
+  }
+}
+
+void update_hpdata(HPDATA current,int nh)
+{
   NODE data1,nd,t;
   DL new,dl;
   int len,i,n;
@@ -2560,7 +2567,10 @@ void update_hpdata(HPDATA current,int nh,int do_hf)
     p[i] = monomial_colon(ndltodl(n,nd_psh[i]->dl),new,n);
   }
   // compute HP(I:new)
-  list1 = dp_monomial_hilbert_poincare(b,current->x,current->plist);
+  if ( current->w )
+    list1 = dp_monomial_hilbert_poincare_weight(b,current->x,current->w);
+  else
+    list1 = dp_monomial_hilbert_poincare(b,current->x);
   data1 = BDY((LIST)list1);
   // HP(I+<new>) = H(I)-t^d*H(I:new), d=tdeg(new)
   makevar("t",&tv); UTOZ(new->td,dz);
@@ -2568,12 +2578,6 @@ void update_hpdata(HPDATA current,int nh,int do_hf)
   mulp(CO,(P)ARG0(data1),td,&s);
   subp(CO,current->hn,s,&hn);
   current->hn = hn;
-  if ( do_hf ) {
-    mhp_to_hf(CO,hn,n,current->plist,&head,&hpoly);
-    current->head = (P *)BDY(head);
-    current->len = head->len;
-    current->hp = hpoly;
-  }
 }
 
 ND_pairs nd_remove_same_sugar( ND_pairs d, int sugar)
@@ -2642,18 +2646,6 @@ again:
       }
       sugar = SG(l);
       if ( DP_Print ) fprintf(asir_out,"%d",sugar);
-      if ( nd_hpdata ) {
-        if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) )
-          break;
-        else {
-          final_hpvalue = hpvalue(&final_hpdata,sugar);
-          if ( final_hpvalue == hpvalue(&current_hpdata,sugar) ) {
-//            if ( DP_Print ) fprintf(asir_out,"done.\n",sugar);
-            d = nd_remove_same_sugar(d,sugar);
-            continue;
-          }
-        }
-      }
     }
     stat = nd_sp(m,0,l,&h);
     if ( !stat ) {
@@ -2712,10 +2704,17 @@ get_eg(&eg2); add_eg(&eg_update,&eg1,&eg2);
       g = update_base(g,nh);
       FREENDP(l);
       if ( nd_hpdata ) {
-        update_hpdata(&current_hpdata,nh,1);
-        if ( final_hpvalue == hpvalue(&current_hpdata,sugar) ) {
-//          if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar);
+        int dg;
+
+        update_hpdata(&current_hpdata,nh); 
+        dg = comp_hn(final_hpdata.hn,current_hpdata.hn);
+        if ( dg > sugar ) {
+          printexpr(CO,(Obj)current_hpdata.hn); printf("\n");
+        }
+        while ( d && dg > sugar ) {
+          if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar);
           d = nd_remove_same_sugar(d,sugar);
+          sugar++;
         }
       }
     } else {
@@ -2886,12 +2885,12 @@ ND_pairs find_smallest_lcm(ND_pairs l)
   NODE t;
   ND_pairs r;
   struct oSIG sig1;
-  static DL mul,quo,minlm;
+  static DL mul,quo,quo2,minlm;
   static int nvar = 0;
 
   if ( nvar < nd_nvar ) {
     nvar = nd_nvar; 
-    NEWDL(quo,nvar); NEWDL(mul,nvar);
+    NEWDL(quo,nvar); NEWDL(quo2,nvar); NEWDL(mul,nvar);
     NEWDL(minlm,nvar);
   }
   sig = l->sig;
@@ -2919,6 +2918,8 @@ ND_pairs find_smallest_lcm(ND_pairs l)
       _addtodl(nd_nvar,nd_ps[i]->sig->dl,quo);
       sig1.pos = nd_ps[i]->sig->pos;
       sig1.dl = quo;
+      sig1.dl2 = quo2;
+      _adddl(nd_nvar,sig1.dl,nd_sba_hm[sig1.pos],sig1.dl2);
       if ( comp_sig(sig,&sig1) > 0 ) {
 //        printf("X");
         NEWND_pairs(r);
@@ -2977,16 +2978,21 @@ SIG trivial_sig(int i,int j)
 
   if ( nvar != nd_nvar ) {
     nvar = nd_nvar; NEWDL(lcm,nvar); NEWDL(sigi.dl,nvar); NEWDL(sigj.dl,nvar);
+    NEWDL(sigi.dl2,nvar); NEWDL(sigj.dl2,nvar);
   }
   if ( nd_sba_inputisgb != 0 ) {
     lcm_of_DL(nd_nvar,nd_sba_hm[i],nd_sba_hm[j],lcm);
     sigi.pos = i; _subdl(nd_nvar,lcm,nd_sba_hm[i],sigi.dl);
+    _copydl(nd_nvar,lcm,sigi.dl2);
     sigj.pos = j; _subdl(nd_nvar,lcm,nd_sba_hm[j],sigj.dl);
+    _copydl(nd_nvar,lcm,sigj.dl2);
     if ( comp_sig(&sigi,&sigj) > 0 ) sig = dup_sig(&sigi);
     else sig = dup_sig(&sigj);
   } else {
     sigi.pos = i; _copydl(nd_nvar,nd_sba_hm[j],sigi.dl);
+    _adddl(nd_nvar,sigi.dl,nd_sba_hm[i],sigi.dl2);
     sigj.pos = j; _copydl(nd_nvar,nd_sba_hm[i],sigj.dl);
+    _adddl(nd_nvar,sigj.dl,nd_sba_hm[j],sigj.dl2);
     if ( comp_sig(&sigi,&sigj) > 0 ) sig = dup_sig(&sigi);
     else sig = dup_sig(&sigj);
   }
@@ -3048,7 +3054,7 @@ init_eg(&eg_remove);
   Nnominimal = 0;
   Nredundant = 0;
   ngen = nd_psn;
-  if ( !do_weyl ) {
+  if ( !do_weyl || nd_sba_inputisgb ) {
     for ( i = 0; i < nd_psn; i++ )
       for ( j = i+1; j < nd_psn; j++ ) {
         sig = trivial_sig(i,j);
@@ -3116,7 +3122,7 @@ get_eg(&eg2); add_eg(&eg_sp,&eg1,&eg2);
     }
 get_eg(&eg1);
 #if USE_GEOBUCKET
-    stat = m?nd_nf_pbucket_s(m,h,nd_ps,!nd_top&&!Top,&nf):nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf);
+    stat = (m&&!nd_gentrace)?nd_nf_pbucket_s(m,h,nd_ps,!nd_top&&!Top,&nf):nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf);
 #else
     stat = nd_nf_s(m,0,h,nd_ps,!nd_top&&!Top,&nf);
 #endif
@@ -3144,24 +3150,24 @@ get_eg(&eg2); 
       }
       add_eg(&eg_nf,&eg1,&eg2);
       hc = HCU(nf);
-      get_eg(&eg1);
-      nd_removecont(m,nf);
-      get_eg(&eg2); add_eg(&eg_removecont,&eg1,&eg2);
-      nfv = ndtondv(m,nf); nd_free(nf);
-      nh = ndv_newps(m,nfv,0);
- 
-      get_eg(&eg1);
-      dlen += update_pairs_array_s(d,nh,syzlist);
-      get_eg(&eg2); add_eg(&eg_updatepairs,&eg1,&eg2);
-      nd_sba_pos[sig->pos] = append_one(nd_sba_pos[sig->pos],nh);
-      if ( nd_hpdata ) {
-        get_eg(&eg1);
-        update_hpdata(&current_hpdata,nh,0);
-        get_eg(&eg2); add_eg(&eg_hpdata,&eg1,&eg2);
-        if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) {
-          if ( DP_Print ) { printf("\nWe found a gb.\n"); }
-            break;
-        }
+       get_eg(&eg1);
+       nd_removecont(m,nf);
+       get_eg(&eg2); add_eg(&eg_removecont,&eg1,&eg2);
+       nfv = ndtondv(m,nf); nd_free(nf);
+       nh = ndv_newps(m,nfv,0);
+  
+       get_eg(&eg1);
+       dlen += update_pairs_array_s(d,nh,syzlist);
+       get_eg(&eg2); add_eg(&eg_updatepairs,&eg1,&eg2);
+       nd_sba_pos[sig->pos] = append_one(nd_sba_pos[sig->pos],nh);
+       if ( nd_hpdata ) {
+         get_eg(&eg1);
+         update_hpdata(&current_hpdata,nh);
+         get_eg(&eg2); add_eg(&eg_hpdata,&eg1,&eg2);
+         if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) {
+           if ( DP_Print ) { printf("\nWe found a gb.\n"); }
+             break;
+         }
       }
    } else {
       d[ind] = d[ind]->next; dlen--;
@@ -3425,18 +3431,6 @@ again:
 #endif
       sugar = SG(l);
       if ( DP_Print ) fprintf(asir_out,"%d",sugar);
-      if ( nd_hpdata ) {
-        if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) )
-          break;
-        else {
-          final_hpvalue = hpvalue(&final_hpdata,sugar);
-          if ( final_hpvalue == hpvalue(&current_hpdata,sugar) ) {
-//            if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar);
-            d = nd_remove_same_sugar(d,sugar);
-            continue;
-          }
-        }
-      }
     }
     stat = nd_sp(m,0,l,&h);
     if ( !stat ) {
@@ -3511,10 +3505,17 @@ again:
         d = update_pairs(d,g,nh,0);
         g = update_base(g,nh);
         if ( nd_hpdata ) {
-          update_hpdata(&current_hpdata,nh,1);
-          if ( final_hpvalue == hpvalue(&current_hpdata,sugar) ) {
-//            if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar);
+          int dg;
+
+          update_hpdata(&current_hpdata,nh);
+          dg = comp_hn(final_hpdata.hn,current_hpdata.hn);
+          if ( dg > sugar ) {
+            printexpr(CO,(Obj)current_hpdata.hn); printf("\n");
+          }
+          while ( d && dg > sugar ) {
+            if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar);
             d = nd_remove_same_sugar(d,sugar);
+            sugar++;
           }
         }
       } else {
@@ -3919,7 +3920,9 @@ int comp_sig_monomial(int n,DL d1,DL d2)
   }
   if ( !nd_sba_modord )
     return (*cmpdl)(n,d1,d2);
-  else {
+  else if ( !nd_sba_modord->weight && !nd_sba_modord->oldv ) {
+    return (*nd_sba_modord->cmpdl)(n,d1,d2);
+  } else {
     weight = nd_sba_modord->weight;
     oldv = nd_sba_modord->oldv;
     if ( oldv ) {
@@ -3945,7 +3948,7 @@ int comp_sig(SIG s1,SIG s2)
   if ( nd_sba_pot ) {
     if ( s1->pos > s2->pos ) return 1;
     else if ( s1->pos < s2->pos ) return -1;
-    else return comp_sig_monomial(nd_nvar,s1->dl,s2->dl);
+    else return comp_sig_monomial(nd_nvar,DL(s1),DL(s2));
   } else {
     static DL m1,m2;
     static int nvar = 0;
@@ -3954,12 +3957,10 @@ int comp_sig(SIG s1,SIG s2)
     if ( nvar != nd_nvar ) {
       nvar = nd_nvar; NEWDL(m1,nvar); NEWDL(m2,nvar);
     }
-    _adddl(nd_nvar,s1->dl,nd_sba_hm[s1->pos],m1);
-    _adddl(nd_nvar,s2->dl,nd_sba_hm[s2->pos],m2);
     if ( !nd_sba_modord )
-      ret = (*cmpdl)(nd_nvar,m1,m2);
+      ret = (*cmpdl)(nd_nvar,DL2(s1),DL2(s2));
     else
-      ret = comp_sig_monomial(nd_nvar,m1,m2);
+      ret = comp_sig_monomial(nd_nvar,DL2(s1),DL2(s2));
     if ( ret != 0 ) return ret;
     else if ( s1->pos > s2->pos ) return 1;
     else if ( s1->pos < s2->pos ) return -1;
@@ -3996,6 +3997,7 @@ int _create_spair_s(int i1,int i2,ND_pairs sp,SIG sig1
   _ndltodl(lcm,DL(sig1));
   _addtodl(nd_nvar,DL(p1->sig),DL(sig1));
   sig1->pos = p1->sig->pos;
+  _adddl(nd_nvar,DL(sig1),nd_sba_hm[sig1->pos],DL2(sig1));
 
   // DL(sig2) <- sp->lcm
   // DL(sig2) -= DL(p2)
@@ -4004,6 +4006,7 @@ int _create_spair_s(int i1,int i2,ND_pairs sp,SIG sig1
   _ndltodl(lcm,DL(sig2));
   _addtodl(nd_nvar,DL(p2->sig),DL(sig2));
   sig2->pos = p2->sig->pos;
+  _adddl(nd_nvar,DL(sig2),nd_sba_hm[sig2->pos],DL2(sig2));
 
   ret = comp_sig(sig1,sig2);
   if ( ret == 0 ) return 0;
@@ -4025,6 +4028,7 @@ SIG dup_sig(SIG sig)
   else {
     NEWSIG(r);
     _copydl(nd_nvar,DL(sig),DL(r));
+    _copydl(nd_nvar,DL2(sig),DL2(r));
     r->pos = sig->pos;
     return r;
   }
@@ -4708,6 +4712,7 @@ int ndv_setup(int mod,int trace,NODE f,int dont_sort,i
         ndv_lm_modord(nd_ps[i],nd_sba_hm[i]);
       else
         _ndltodl(DL(nd_psh[i]),nd_sba_hm[i]);
+      _adddl(nd_nvar,DL(sig),nd_sba_hm[i],DL2(sig));
     }
     nd_sba_pos = (NODE *)MALLOC(nd_psn*sizeof(NODE));
     for ( i = 0; i < nd_psn; i++ ) {
@@ -5073,7 +5078,7 @@ NODE nd_sba_f4(int m,int **indp);
 void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp)
 {
   VL tv,fv,vv,vc,av;
-  NODE fd,fd0,r,r0,t,x,s,xx,nd,syz;
+  NODE fd,fd0,r,r0,t,x,s,xx,nd,nd1,syz;
   int e,max,nvar,i;
   NDV b;
   int ishomo,nalg,wmax,len;
@@ -5086,6 +5091,8 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
   EPOS oepos;
   int obpe,oadv,ompos,cbpe;
   struct oEGT eg0,eg1,egconv,egintred;
+  LIST l1,redind;
+  Z z;
 
   nd_module = 0;
   nd_demand = 0;
@@ -5158,6 +5165,9 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
   }
 
   ndv_setup(m,0,fd0,nd_sba_dontsort,0,1);
+  if ( nd_gentrace ) {
+    MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0);
+  }
   x = f4 ? nd_sba_f4(m,&perm) : nd_sba_buch(m,ishomo || homo,&perm,&syz);
   if ( !x ) {
     *rp = 0; return;
@@ -5173,6 +5183,10 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
   nd_demand = 0;
   get_eg(&eg0);
   x = ndv_reducebase(x,perm);
+  for ( nd = 0, i = length(x)-1; i >= 0; i-- ) {
+    STOZ(perm[i],z); MKNODE(nd1,z,nd); nd = nd1;
+  }
+  MKLIST(redind,nd);
   x = ndv_reduceall(m,x);
   get_eg(&eg1); init_eg(&egintred); add_eg(&egintred,&eg0,&eg1);
   nd_setup_parameters(nd_nvar,0);
@@ -5185,12 +5199,18 @@ void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
   if ( r0 ) NEXT(r) = 0;
   if ( nd_sba_syz ) {
     LIST gb,hsyz;
-    NODE nd;
 
     MKLIST(gb,r0);
     MKLIST(hsyz,syz);
     nd = mknode(2,gb,hsyz);
     MKLIST(*rp,nd);
+  } else if ( nd_gentrace ) {
+    LIST gb,trace;
+
+    MKLIST(trace,nd_alltracelist);
+    MKLIST(gb,r0);
+    nd = mknode(3,gb,redind,trace);
+    MKLIST(*rp,nd);
   } else
     MKLIST(*rp,r0);
   get_eg(&eg1); init_eg(&egconv); add_eg(&egconv,&eg0,&eg1);
@@ -11912,6 +11932,7 @@ INLINE int ndl_find_reducer_minsig(UINT *dg)
       _ndltodl(tmp,DL(quo));
       _addtodl(nd_nvar,DL(nd_psh[i]->sig),DL(quo));
       quo->pos = nd_psh[i]->sig->pos;
+      _adddl(nd_nvar,DL(quo),nd_sba_hm[quo->pos],DL2(quo));
       if ( imin < 0 || comp_sig(quomin,quo) > 0 ) {
         t = quo; quo = quomin; quomin = t;
         imin = i;
@@ -11962,6 +11983,7 @@ int nd_symbolic_preproc_s(PGeoBucket bucket,int trace,
       _ndltodl(DL(mul),DL(sig));
       _addtodl(nd_nvar,DL(nd_psh[index]->sig),DL(sig));
       sig->pos = nd_psh[index]->sig->pos;
+      _adddl(nd_nvar,DL(sig),nd_sba_hm[sig->pos],DL2(sig));
       MKNM_ind_pair(pair,mul,index,sugar,sig);
       red = ndv_mul_nm_symbolic(mul,ps[index]);
       add_pbucket_symbolic(bucket,nd_remove_head(red));