=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.h,v retrieving revision 1.19 retrieving revision 1.40 diff -u -p -r1.19 -r1.40 --- OpenXM_contrib2/asir2000/engine/nd.h 2009/01/04 05:44:51 1.19 +++ OpenXM_contrib2/asir2000/engine/nd.h 2020/11/02 08:30:55 1.40 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.h,v 1.18 2006/12/14 02:49:59 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.h,v 1.39 2020/10/04 03:14:08 noro Exp $ */ #include "ca.h" #include "parse.h" #include "ox.h" @@ -7,8 +7,8 @@ #include #if defined(__GNUC__) -#define INLINE inline -#elif defined(VISUAL) +#define INLINE static inline +#elif defined(VISUAL) || defined(__MINGW32__) #define INLINE __inline #else #define INLINE @@ -24,98 +24,106 @@ typedef unsigned int UINT; /* GeoBucket for polynomial addition */ typedef struct oPGeoBucket { - int m; - struct oND *body[32]; + int m; + struct oND *body[32]; } *PGeoBucket; /* distributed polynomial; linked list rep. */ typedef struct oND { - struct oNM *body; - int nv; - int len; - int sugar; + struct oNM *body; + int nv; + int len; + int sugar; } *ND; /* distributed polynomial; array rep. */ typedef struct oNDV { - struct oNMV *body; - int nv; - int len; - int sugar; + struct oNMV *body; + int nv; + int len; + int sugar; } *NDV; typedef union oNDC { - int m; - Q z; - P p; - R r; - DAlg a; + int m; + Q z; + LM lm; + GZ gz; + P p; + R r; + DAlg a; } *NDC; /* monomial; linked list rep. */ typedef struct oNM { - struct oNM *next; - union oNDC c; - UINT dl[1]; + struct oNM *next; + union oNDC c; + UINT dl[1]; } *NM; /* monomial; array rep. */ typedef struct oNMV { - union oNDC c; - UINT dl[1]; + union oNDC c; + UINT dl[1]; } *NMV; /* history of reducer */ typedef struct oRHist { - struct oRHist *next; - int index; - int sugar; - UINT dl[1]; + struct oRHist *next; + int index; + int sugar; + UINT dl[1]; } *RHist; /* S-pair list */ typedef struct oND_pairs { - struct oND_pairs *next; - int i1,i2; - int sugar; - UINT lcm[1]; + struct oND_pairs *next; + int i1,i2; + int sugar; + int sugar2; + UINT lcm[1]; } *ND_pairs; /* index and shift count for each exponent */ typedef struct oEPOS { - int i; /* index */ - int s; /* shift */ + int i; /* index */ + int s; /* shift */ } *EPOS; typedef struct oBlockMask { - int n; - struct order_pair *order_pair; - UINT **mask; + int n; + struct order_pair *order_pair; + UINT **mask; } *BlockMask; typedef struct oBaseSet { - int len; - NDV *ps; - UINT **bound; + int len; + NDV *ps; + UINT **bound; } *BaseSet; typedef struct oNM_ind_pair { - NM mul; - int index,sugar; + NM mul; + int index,sugar; } *NM_ind_pair; typedef struct oIndArray { - char width; - int head; - union { - unsigned char *c; - unsigned short *s; - unsigned int *i; - } index; + char width; + int head; + union { + unsigned char *c; + unsigned short *s; + unsigned int *i; + } index; } *IndArray; +typedef struct oNDVI { + NDV p; + int i; +} *NDVI; + extern int (*ndl_compare_function)(UINT *a1,UINT *a2); extern int nd_dcomp; @@ -128,17 +136,23 @@ extern char *Demand; extern VL CO; extern int Top,Reverse,DP_Print,dp_nelim,do_weyl,NoSugar; extern int *current_weyl_weight_vector; +extern int *current_module_weight_vector; /* fundamental macros */ #define TD(d) (d[0]) #define HDL(d) ((d)->body->dl) #define HTD(d) (TD(HDL(d))) +#define HCU(d) ((d)->body->c) #define HCM(d) ((d)->body->c.m) +#define HCLM(d) ((d)->body->c.lm) #define HCQ(d) ((d)->body->c.z) +#define HCZ(d) ((d)->body->c.gz) #define HCP(d) ((d)->body->c.p) #define HCA(d) ((d)->body->c.a) #define CM(x) ((x)->c.m) +#define CLM(x) ((x)->c.lm) #define CQ(x) ((x)->c.z) +#define CZ(x) ((x)->c.gz) #define CP(x) ((x)->c.p) #define CA(x) ((x)->c.a) #define DL(x) ((x)->dl) @@ -164,7 +178,7 @@ extern int *current_weyl_weight_vector; (nd_dcomp>0?TD_DL_COMPARE(d1,d2)\ :(nd_dcomp==0?ndl_lex_compare(d1,d2)\ :(nd_blockmask?ndl_block_compare(d1,d2)\ - :(*ndl_compare_function)(d1,d2)))) + :(*ndl_compare_function)(d1,d2)))) #else #define DL_COMPARE(d1,d2)\ (nd_dcomp>0?TD_DL_COMPARE(d1,d2):(*ndl_compare_function)(d1,d2)) @@ -227,6 +241,7 @@ void removecont_array_q(Q *c,int n); ND normalize_pbucket(int mod,PGeoBucket g); int head_pbucket(int mod,PGeoBucket g); int head_pbucket_q(PGeoBucket g); +int head_pbucket_lf(PGeoBucket g); void add_pbucket_symbolic(PGeoBucket g,ND d); void add_pbucket(int mod,PGeoBucket g,ND d); void free_pbucket(PGeoBucket b); @@ -240,26 +255,26 @@ ND_pairs nd_newpairs( NODE g, int t ); ND_pairs nd_minp( ND_pairs d, ND_pairs *prest ); ND_pairs nd_minsugarp( ND_pairs d, ND_pairs *prest ); NODE update_base(NODE nd,int ndp); -ND_pairs update_pairs( ND_pairs d, NODE /* of index */ g, int t); +ND_pairs update_pairs( ND_pairs d, NODE /* of index */ g, int t, int gensyz); ND_pairs equivalent_pairs( ND_pairs d1, ND_pairs *prest ); 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 ndv_newps(int m,NDV a,NDV aq,int f4); /* top level functions */ -void nd_gr(LIST f,LIST v,int m,int f4,struct order_spec *ord,LIST *rp); +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); -NODE nd_f4(int m); -NODE nd_gb(int m,int ishomo,int checkonly); -NODE nd_gb_trace(int m,int ishomo); -NODE nd_f4_trace(int m); +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); /* ndl functions */ int ndl_weight(UINT *d); void ndl_weight_mask(UINT *d); -void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepos,int weight); +void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepos,int ompos,int weight); void ndl_dehomogenize(UINT *p); void ndl_reconstruct(UINT *d,UINT *r,int obpe,EPOS oepos); INLINE int ndl_reducible(UINT *d1,UINT *d2); @@ -278,11 +293,12 @@ INLINE int ndl_hash_value(UINT *d); /* normal forms */ INLINE int ndl_find_reducer(UINT *g); int nd_sp(int mod,int trace,ND_pairs p,ND *nf); +int nd_sp_f4(int m,int trace,ND_pairs l,PGeoBucket bucket); int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND *nf); int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *nf); /* finalizers */ -NODE ndv_reducebase(NODE x); +NODE ndv_reducebase(NODE x,int *perm); NODE ndv_reduceall(int m,NODE f); /* allocators */ @@ -302,23 +318,25 @@ 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); -void ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont); +int ndv_setup(int mod,int trace,NODE f,int dont_sort,int dont_removecont); void nd_setup_parameters(int nvar,int max); BlockMask nd_create_blockmask(struct order_spec *ord); EPOS nd_create_epos(struct order_spec *ord); int nd_get_exporigin(struct order_spec *ord); void ndv_mod(int mod,NDV p); NDV ndv_dup(int mod,NDV p); +NDV ndv_symbolic(int mod,NDV p); ND nd_dup(ND p); +int ndv_ishomo(NDV p); /* ND functions */ -int ndv_check_candidate(NODE input,int obpe,int oadv,EPOS oepos,NODE cand); +int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand); void nd_mul_c(int mod,ND p,int mul); void nd_mul_c_q(ND p,P mul); void nd_mul_c_p(VL vl,ND p,P mul); ND nd_remove_head(ND p); ND nd_separate_head(ND p,ND *head); -int nd_length(ND p); +INLINE int nd_length(ND p); void nd_append_red(UINT *d,int i); UINT *ndv_compute_bound(NDV p); UINT *nd_compute_bound(ND p); @@ -332,9 +350,15 @@ INLINE int nd_length(ND p); NODE nd_f4_red(int m,ND_pairs sp0,int trace,UINT *s0vect,int col,NODE rp0,ND_pairs *nz); NODE nd_f4_red_dist(int m,ND_pairs sp0,UINT *s0vect,int col,NODE rp0, ND_pairs *nz); NODE nd_f4_red_main(int m,ND_pairs sp0,int nsp,UINT *s0vect,int col, - NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred,ND_pairs *nz); + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred,ND_pairs *nz); +NODE nd_f4_red_mod_main(int m,ND_pairs sp0,int nsp,UINT *s0vect,int col, + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred,ND_pairs *nz); +NODE nd_f4_red_sf_main(int m,ND_pairs sp0,int nsp,UINT *s0vect,int col, + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred,ND_pairs *nz); NODE nd_f4_red_q_main(ND_pairs sp0,int nsp,int trace,UINT *s0vect,int col, - NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred); + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred); +NODE nd_f4_red_gz_main(ND_pairs sp0,int nsp,int trace,UINT *s0vect,int col, + NM_ind_pair *rvect,int *rhead,IndArray *imat,int nred); /* NDV functions */ ND weyl_ndv_mul_nm(int mod,NM m0,NDV p); @@ -346,7 +370,7 @@ ND ndv_mul_nm(int mod,NM m0,NDV p); ND ndv_mul_nmv_trunc(int mod,NMV m0,NDV p,UINT *d); void ndv_realloc(NDV p,int obpe,int oadv,EPOS oepos); NDV ndv_dup_realloc(NDV p,int obpe,int oadv,EPOS oepos); -void ndv_homogenize(NDV p,int obpe,int oadv,EPOS eops); +void ndv_homogenize(NDV p,int obpe,int oadv,EPOS eops,int ompos); void ndv_dehomogenize(NDV p,struct order_spec *spec); void ndv_removecont(int mod,NDV p); void ndv_print(NDV p); @@ -362,7 +386,7 @@ P ndvtop(int mod,VL vl,VL dvl,NDV p); NDV ndtondv(int mod,ND p); ND ndvtond(int mod,NDV p); Q *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,NM_ind_pair pair); +IndArray nm_ind_pair_to_vect_compress(int m,UINT *s0,int n,int *s0hash,NM_ind_pair pair); 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,Q *r); NDV vect_to_ndv_q(Q *vect,int spcol,int col,int *rhead,UINT *s0vect); @@ -374,4 +398,11 @@ int nd_gauss_elim_q(Q **mat0,int *sugar,int row,int co int ndl_ww_lex_compare(UINT *a1,UINT *a2); +void red_by_vect_lf(mpz_t *p,mpz_t *r,mpz_t hc,int len); +int nd_symbolic_preproc(PGeoBucket bucket,int trace,UINT **s0vect,NODE *r); + +#if SIZEOF_LONG==8 +void red_by_vect64(int m, U64 *p,unsigned int *c,U64 *r,unsigned int hc,int len); +int nd_gauss_elim_mod64(U64 **mat,int *sugar,ND_pairs *spactive,int row,int col,int md,int *colstat); +#endif