=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/nd.h,v retrieving revision 1.5 retrieving revision 1.11 diff -u -p -r1.5 -r1.11 --- OpenXM_contrib2/asir2018/engine/nd.h 2018/10/19 23:27:38 1.5 +++ OpenXM_contrib2/asir2018/engine/nd.h 2020/10/26 02:41:05 1.11 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.h,v 1.4 2018/10/01 05:49:06 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.h,v 1.10 2020/07/03 03:37:59 noro Exp $ */ #include "ca.h" #include "parse.h" #include "ox.h" @@ -28,12 +28,18 @@ typedef struct oPGeoBucket { struct oND *body[32]; } *PGeoBucket; +typedef struct oSIG { + int pos; + DL dl; +} *SIG; + /* distributed polynomial; linked list rep. */ typedef struct oND { struct oNM *body; int nv; int len; int sugar; + SIG sig; } *ND; /* distributed polynomial; array rep. */ @@ -42,6 +48,7 @@ typedef struct oNDV { int nv; int len; int sugar; + SIG sig; } *NDV; typedef union oNDC { @@ -71,6 +78,7 @@ typedef struct oRHist { struct oRHist *next; int index; int sugar; + SIG sig; UINT dl[1]; } *RHist; @@ -80,6 +88,8 @@ typedef struct oND_pairs { int i1,i2; int sugar; int sugar2; + SIG sig; + int zero; UINT lcm[1]; } *ND_pairs; @@ -105,6 +115,7 @@ typedef struct oNM_ind_pair { NM mul; int index,sugar; + SIG sig; } *NM_ind_pair; typedef struct oIndArray @@ -186,7 +197,7 @@ extern int *current_module_weight_vector; ((r)=(RHist)MALLOC(sizeof(struct oRHist)+(nd_wpd-1)*sizeof(UINT))) #define NEWND_pairs(m) \ if(!_ndp_free_list)_NDP_alloc();\ -(m)=_ndp_free_list; _ndp_free_list = NEXT(_ndp_free_list) +(m)=_ndp_free_list; (m)->zero = 0; _ndp_free_list = NEXT(_ndp_free_list) #define NEWNM(m)\ if(!_nm_free_list)_NM_alloc();\ (m)=_nm_free_list; _nm_free_list = NEXT(_nm_free_list) @@ -198,6 +209,8 @@ NV(d)=(n); LEN(d)=(len); BDY(d)=(m) #define MKNDV(n,m,l,d) NEWNDV(d); NV(d)=(n); BDY(d)=(m); LEN(d) = l; #define NEWNM_ind_pair(p)\ ((p)=(NM_ind_pair)MALLOC(sizeof(struct oNM_ind_pair))) +#define NEWSIG(r) \ +((r)=(SIG)MALLOC(sizeof(struct oSIG)),NEWDL((r)->dl,nd_nvar)) /* allocate and link a new object */ #define NEXTRHist(r,c) \ @@ -208,7 +221,8 @@ if(!(r)){NEWNM(r);(c)=(r);}else{NEWNM(NEXT(c));(c)=NEX if(!(r)){(c)=(r)=(s);}else{NEXT(c)=(s);(c)=(s);} #define NEXTND_pairs(r,c) \ if(!(r)){NEWND_pairs(r);(c)=(r);}else{NEWND_pairs(NEXT(c));(c)=NEXT(c);} -#define MKNM_ind_pair(p,m,i,s) (NEWNM_ind_pair(p),(p)->mul=(m),(p)->index=(i),(p)->sugar = (s)) +#define MKNM_ind_pair(p,m,i,s,sg)\ + (NEWNM_ind_pair(p),(p)->mul=(m),(p)->index=(i),(p)->sugar = (s),(p)->sig=(sg)) /* deallocators */ #define FREENM(m) NEXT(m)=_nm_free_list; _nm_free_list=(m) @@ -257,15 +271,16 @@ ND_pairs crit_B( ND_pairs d, int s ); ND_pairs crit_M( ND_pairs d1 ); ND_pairs crit_F( ND_pairs d1 ); int crit_2( int dp1, int dp2 ); -int ndv_newps(int m,NDV a,NDV aq,int f4); +int ndv_newps(int m,NDV a,NDV aq); /* top level functions */ void nd_gr(LIST f,LIST v,int m,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp); -void nd_gr_trace(LIST f,LIST v,int trace,int homo,int f4,struct order_spec *ord,LIST *rp); +void nd_gr_trace(LIST f,LIST v,int trace,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp); NODE nd_f4(int m,int checkonly,int **indp); NODE nd_gb(int m,int ishomo,int checkonly,int gensyz,int **indp); NODE nd_gb_trace(int m,int ishomo,int **indp); NODE nd_f4_trace(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); /* ndl functions */ int ndl_weight(UINT *d); @@ -314,7 +329,8 @@ void ndp_print(ND_pairs d); /* setup, reconstruct */ void nd_init_ord(struct order_spec *spec); ND_pairs nd_reconstruct(int trace,ND_pairs ndp); -int ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont); +void nd_reconstruct_s(int trace,ND_pairs *ndp); +int ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont,int sba); void nd_setup_parameters(int nvar,int max); BlockMask nd_create_blockmask(struct order_spec *ord); EPOS nd_create_epos(struct order_spec *ord); @@ -383,7 +399,7 @@ P ndvtop(int mod,VL vl,VL dvl,NDV p); NDV ndtondv(int mod,ND p); ND ndvtond(int mod,NDV p); Z *nm_ind_pair_to_vect(int m,UINT *s0,int n,NM_ind_pair pair); -IndArray nm_ind_pair_to_vect_compress(int m,UINT *s0,int n,int *s0hash,NM_ind_pair pair); +IndArray nm_ind_pair_to_vect_compress(int m,UINT *s0,int n,NM_ind_pair pair,int prevh); int nd_to_vect(int mod,UINT *s0,int n,ND d,UINT *r); int nd_to_vect_q(UINT *s0,int n,ND d,Z *r); NDV vect_to_ndv_q(Z *vect,int spcol,int col,int *rhead,UINT *s0vect); @@ -397,7 +413,7 @@ int ndl_ww_lex_compare(UINT *a1,UINT *a2); #if SIZEOF_LONG == 8 int nd_to_vect64(int mod,UINT *s0,int n,ND d,mp_limb_t *r); -int ndv_reduce_vect64(int m,mp_limb_t *svect,mp_limb_t *cvect,int col,IndArray *imat,NM_ind_pair *rp0,int nred); +int ndv_reduce_vect64(int m,mp_limb_t *svect,mp_limb_t *cvect,int col,IndArray *imat,NM_ind_pair *rp0,int nred,SIG sig); NDV vect64_to_ndv(mp_limb_t *vect,int spcol,int col,int *rhead,UINT *s0vect); void red_by_vect64(int m, mp_limb_t *p,unsigned int *c,mp_limb_t *r,unsigned int hc,int len); int nd_gauss_elim_mod64(mp_limb_t **mat,int *sugar,ND_pairs *spactive,int row,int col,int md,int *colstat);