=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/nd.c,v retrieving revision 1.53 retrieving revision 1.64 diff -u -p -r1.53 -r1.64 --- OpenXM_contrib2/asir2018/engine/nd.c 2021/03/12 01:18:33 1.53 +++ OpenXM_contrib2/asir2018/engine/nd.c 2022/03/09 07:50:51 1.64 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.52 2021/03/09 08:48:50 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.63 2022/01/13 08:15:02 noro Exp $ */ #include "nd.h" @@ -70,7 +70,7 @@ static NODE nd_tracelist; static NODE nd_alltracelist; static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect,nd_lf,nd_norb; static int nd_f4_td,nd_sba_f4step,nd_sba_pot,nd_sba_largelcm,nd_sba_dontsort,nd_sba_redundant_check; -static int nd_top,nd_sba_syz,nd_sba_inputisgb; +static int nd_top,nd_sba_syz,nd_sba_inputisgb,nd_sba_heu; static int *nd_gbblock; static NODE nd_nzlist,nd_check_splist; static int nd_splist; @@ -1301,7 +1301,9 @@ 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 ) { singular = 0; break; } if ( ret == 0 ) { /* fprintf(asir_out,"s"); fflush(asir_out); */ singular = 1; } } @@ -1709,6 +1711,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; @@ -2414,6 +2424,7 @@ int do_diagonalize(int sugar,int m) LIST l; Z iq; + if ( diag_period == 0 ) return 1; for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { if ( nd_gentrace ) { /* Trace = [1,index,1,1] */ @@ -2470,80 +2481,82 @@ 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 0 + 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; +#else + w = current_dl_weight_vector; +#endif 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,¤t->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 -1; + 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 +2573,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+) = H(I)-t^d*H(I:new), d=tdeg(new) makevar("t",&tv); UTOZ(new->td,dz); @@ -2568,28 +2584,26 @@ 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) { struct oND_pairs root; ND_pairs prev,cur; + int i; root.next = d; prev = &root; cur = d; + i = 0; while ( cur ) { - if ( SG(cur) == sugar ) + if ( SG(cur) == sugar ) { prev->next = cur->next; - else + i++; + } else prev = cur; cur = cur->next; } + if ( DP_Print && i ) fprintf(asir_out,"[%d]",i); return root.next; } @@ -2642,18 +2656,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(¤t_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,11 +2714,20 @@ get_eg(&eg2); add_eg(&eg_update,&eg1,&eg2); g = update_base(g,nh); FREENDP(l); if ( nd_hpdata ) { - update_hpdata(¤t_hpdata,nh,1); - if ( final_hpvalue == hpvalue(¤t_hpdata,sugar) ) { -// if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); - d = nd_remove_same_sugar(d,sugar); + int dg,sugar0; + + update_hpdata(¤t_hpdata,nh); + dg = comp_hn(final_hpdata.hn,current_hpdata.hn); + if ( dg < 0 ) { + int d_len; + for ( d_len = 0; d; d = d->next, d_len++); + fprintf(asir_out,"[%d] We found a gb\n",d_len); } + sugar0 = sugar; + while ( d && dg > sugar0 ) { + d = nd_remove_same_sugar(d,sugar0); + sugar0++; + } } } else { Nnfz++; @@ -2727,14 +2738,14 @@ get_eg(&eg2); add_eg(&eg_update,&eg1,&eg2); MKNODE(t,list,nd_alltracelist); nd_alltracelist = t; nd_tracelist = 0; } - if ( DP_Print ) { printf("."); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"."); fflush(asir_out); } FREENDP(l); } } conv_ilist(nd_demand,0,g,indp); if ( !checkonly && DP_Print ) { - printf("\nnd_gb done. Nnd_add=%d,Npairs=%d, Nnfnz=%d,Nnfz=%d,",Nnd_add,Npairs,Nnfnz,Nnfz); - printf("Nremoved=%d\n",NcriB+NcriMF+Ncri2); + fprintf(asir_out,"\nnd_gb done. Nbase=%d,Nnd_add=%d,Npairs=%d, Nnfnz=%d,Nnfz=%d,",nd_psn,Nnd_add,Npairs,Nnfnz,Nnfz); + fprintf(asir_out,"Nremoved=%d\n",NcriB+NcriMF+Ncri2); fflush(asir_out); } if ( DP_Print ) { @@ -2886,12 +2897,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 +2930,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 +2990,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 +3066,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 +3134,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,23 +3162,35 @@ 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(¤t_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 ) { + int dg,sugar0; + + get_eg(&eg1); + update_hpdata(¤t_hpdata,nh); + get_eg(&eg2); add_eg(&eg_hpdata,&eg1,&eg2); + dg = comp_hn(final_hpdata.hn,current_hpdata.hn); +// if ( !compp(CO,final_hpdata.hn,current_hpdata.hn) ) + if ( dg < 0 ) { + if ( DP_Print ) { printf("\nWe found a gb.\n"); } + break; + } else if ( nd_sba_heu == 1 ) { + for ( i = 0; i < ngen; i++ ) { + sugar0 = sugar; + while ( d[i] && dg > sugar0 ) { + d[i] = nd_remove_same_sugar(d[i],sugar0); + sugar0++; + } + } } } } else { @@ -3181,7 +3211,7 @@ get_eg(&eg2); add_eg(&eg_remove,&eg1,&eg2); g = conv_ilist_s(nd_demand,0,indp); if ( DP_Print ) { printf("\ndlen=%d,nd_sba done. nd_add=%d,Nsyz=%d,Nsamesig=%d,Nnominimal=%d\n",dlen,Nnd_add,Nsyz,Nsamesig,Nnominimal); - printf("Nnfnz=%d,Nnfz=%d,Nnfsingular=%d\n",Nnfnz,Nnfz,Nnfs); + printf("Nbase=%d,Nnfnz=%d,Nnfz=%d,Nnfsingular=%d\n",nd_psn,Nnfnz,Nnfz,Nnfs); fflush(stdout); if ( nd_sba_redundant_check ) printf("Nredundant=%d\n",Nredundant); @@ -3316,6 +3346,7 @@ int do_diagonalize_trace(int sugar,int m) Z iq; P cont,cont1; + if ( diag_period == 0 ) return 1; for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { if ( nd_gentrace ) { /* Trace = [1,index,1,1] */ @@ -3425,18 +3456,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(¤t_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,17 +3530,26 @@ again: d = update_pairs(d,g,nh,0); g = update_base(g,nh); if ( nd_hpdata ) { - update_hpdata(¤t_hpdata,nh,1); - if ( final_hpvalue == hpvalue(¤t_hpdata,sugar) ) { -// if ( DP_Print ) fprintf(asir_out,"sugar=%d done.\n",sugar); - d = nd_remove_same_sugar(d,sugar); + int dg,sugar0; + + update_hpdata(¤t_hpdata,nh); + dg = comp_hn(final_hpdata.hn,current_hpdata.hn); + if ( dg < 0 ) { + int d_len; + for ( d_len = 0; d; d = d->next, d_len++); + fprintf(asir_out,"[%d] We found a gb\n",d_len); } + sugar0 = sugar; + while ( d && dg > sugar0 ) { + d = nd_remove_same_sugar(d,sugar0); + sugar0++; + } } } else { - if ( DP_Print ) { printf("*"); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"*"); fflush(asir_out); } } } else { - if ( DP_Print ) { printf("."); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"."); fflush(asir_out); } } FREENDP(l); } @@ -3533,7 +3561,7 @@ again: } } conv_ilist(nd_demand,1,g,indp); - if ( DP_Print ) { printf("\nnd_gb_trace done.\n"); fflush(stdout); } + if ( DP_Print ) { fprintf(asir_out,"\nnd_gb_trace done. Nbase=%d\n",nd_psn); fflush(asir_out); } return g; } @@ -3919,7 +3947,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 +3975,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 +3984,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 +4024,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 +4033,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 +4055,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 +4739,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 +5105,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 +5118,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 +5192,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 +5210,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 +5226,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); @@ -5451,7 +5498,7 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int Obj obj; NumberField nf; struct order_spec *ord1; - struct oEGT eg_check,eg0,eg1; + struct oEGT eg_check,eg_gb,eg_intred,eg0,eg1; NODE tr,tl1,tl2,tl3,tl4; LIST l1,l2,l3,l4,l5; int *perm; @@ -5589,7 +5636,8 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int } if ( MaxDeg > 0 ) nocheck = 1; while ( 1 ) { - tl1 = tl2 = tl3 = tl4 = 0; + get_eg(&eg0); + tl1 = tl2 = tl3 = tl4 = 0; if ( Demand ) nd_demand = 1; ret = ndv_setup(m,1,fd0,nd_gbblock?1:0,0,0); @@ -5615,10 +5663,13 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int nd_init_ord(ord); nd_setup_parameters(nvar,0); } + get_eg(&eg1); init_eg(&eg_gb); add_eg(&eg_gb,&eg0,&eg1); nd_demand = 0; cand = ndv_reducebase(cand,perm); if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } + get_eg(&eg0); cand = ndv_reduceall(0,cand); + get_eg(&eg1); init_eg(&eg_intred); add_eg(&eg_intred,&eg0,&eg1); cbpe = nd_bpe; if ( nd_gentrace ) { tl2 = nd_alltracelist; nd_alltracelist = 0; } get_eg(&eg0); @@ -5629,7 +5680,7 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int tl3 = nd_alltracelist; nd_alltracelist = 0; } else tl3 = 0; /* gbcheck : cand is a GB of Id(cand) ? */ - if ( nd_vc || nd_gentrace || nd_gensyz ) + if ( nd_vc || nd_gentrace || nd_gensyz || do_weyl ) ret = nd_gb(0,0,1,nd_gensyz?1:0,0)!=0; else ret = nd_f4(0,1,0)!=0; @@ -5656,7 +5707,8 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int } get_eg(&eg1); init_eg(&eg_check); add_eg(&eg_check,&eg0,&eg1); if ( DP_Print ) - fprintf(asir_out,"check=%.3fsec\n",eg_check.exectime); + fprintf(asir_out,"gb=%.3fsec,check=%.3fsec,intred=%.3fsec\n", + eg_gb.exectime,eg_check.exectime,eg_intred.exectime); /* dp->p */ nd_bpe = cbpe; nd_setup_parameters(nd_nvar,0); @@ -10638,7 +10690,7 @@ void parse_nd_option(VL vl,NODE opt) nd_f4_td = 0; nd_sba_f4step = 2; nd_sba_pot = 0; nd_sba_largelcm = 0; nd_sba_dontsort = 0; nd_top = 0; nd_sba_redundant_check = 0; nd_sba_syz = 0; nd_sba_modord = 0; nd_sba_inputisgb = 0; - nd_hpdata = 0; + nd_hpdata = 0; nd_sba_heu = 0; for ( t = opt; t; t = NEXT(t) ) { p = BDY((LIST)BDY(t)); @@ -10707,6 +10759,8 @@ void parse_nd_option(VL vl,NODE opt) nd_sba_dontsort = value?1:0; } else if ( !strcmp(key,"sba_syz") ) { nd_sba_syz = value?1:0; + } else if ( !strcmp(key,"sba_heu") ) { + nd_sba_heu = value?1:0; } else if ( !strcmp(key,"sba_modord") ) { // value=[vlist,ordspec,weight] u = BDY((LIST)value); @@ -11912,6 +11966,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 +12017,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));