=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.205 retrieving revision 1.207 diff -u -p -r1.205 -r1.207 --- OpenXM_contrib2/asir2000/engine/nd.c 2013/09/09 09:47:09 1.205 +++ OpenXM_contrib2/asir2000/engine/nd.c 2013/09/12 06:46:16 1.207 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.204 2013/09/09 07:29:25 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.206 2013/09/10 02:10:00 noro Exp $ */ #include "nd.h" @@ -3080,7 +3080,6 @@ void nd_gr_postproc(LIST f,LIST v,int m,struct order_s MKLIST(*rp,r0); } -#if 0 NDV recompute_trace(NODE trace,NDV *p,int m); void nd_gr_recompute_trace(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,LIST *rp); @@ -3221,7 +3220,6 @@ void nd_gr_recompute_trace(LIST f,LIST v,int m,struct MKLIST(*rp,r0); if ( DP_Print ) fprintf(asir_out,"\n"); } -#endif void nd_gr_trace(LIST f,LIST v,int trace,int homo,int f4,struct order_spec *ord,LIST *rp) { @@ -6681,6 +6679,32 @@ void ndv_save(NDV p,int index) fclose(s); } +void nd_save_mod(ND p,int index) +{ + FILE *s; + char name[BUFSIZ]; + int nv,sugar,len,c; + NM m; + + sprintf(name,"%s/%d",Demand,index); + s = fopen(name,"w"); + if ( !p ) { + len = 0; + write_int(s,&len); + fclose(s); + return; + } + nv = NV(p); + sugar = SG(p); + len = LEN(p); + write_int(s,&nv); write_int(s,&sugar); write_int(s,&len); + for ( m = BDY(p); m; m = NEXT(m) ) { + c = CM(m); write_int(s,&c); + write_intarray(s,DL(m),nd_wpd); + } + fclose(s); +} + NDV ndv_load(int index) { FILE *s; @@ -6725,6 +6749,36 @@ NDV ndv_load(int index) return d; } +ND nd_load_mod(int index) +{ + FILE *s; + char name[BUFSIZ]; + int nv,sugar,len,i,c; + ND d; + NM m0,m; + + sprintf(name,"%s/%d",Demand,index); + s = fopen(name,"r"); + /* if the file does not exist, it means p[index]=0 */ + if ( !s ) return 0; + + read_int(s,&nv); + if ( !nv ) { fclose(s); return 0; } + + read_int(s,&sugar); + read_int(s,&len); + for ( m0 = 0, i = 0; i < len; i++ ) { + NEXTNM(m0,m); + read_int(s,&c); CM(m) = c; + read_intarray(s,DL(m),nd_wpd); + } + NEXT(m) = 0; + MKND(nv,m0,len,d); + SG(d) = sugar; + fclose(s); + return d; +} + void nd_det(int mod,MAT f,P *rp) { VL fv,tv; @@ -7223,8 +7277,8 @@ void parse_nd_option(NODE opt) ND mdptond(DP d); ND nd_mul_nm(int mod,NM m0,ND p); -ND *recompute_trace(NODE ti,ND **p,int nb,int mod); -ND recompute_trace_one(NODE ti,ND *p,int nb,int mod); +ND *btog(NODE ti,ND **p,int nb,int mod); +ND btog_one(NODE ti,ND *p,int nb,int mod); MAT nd_btog(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,MAT *rp); VECT nd_btog_one(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,int pos,MAT *rp); @@ -7267,7 +7321,7 @@ ND nd_mul_nm(int mod,NM m0,ND p) return r; } -ND *recompute_trace(NODE ti,ND **p,int nb,int mod) +ND *btog(NODE ti,ND **p,int nb,int mod) { PGeoBucket *r; int i,ci; @@ -7306,10 +7360,10 @@ ND *recompute_trace(NODE ti,ND **p,int nb,int mod) return rd; } -ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) +ND btog_one(NODE ti,ND *p,int nb,int mod) { PGeoBucket r; - int i,ci; + int i,ci,j; NODE t,s; ND m,tp; ND pi,rd; @@ -7323,9 +7377,16 @@ ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) ptomp(mod,(P)HCQ(m),&c); if ( ci = ((MQ)c)->cont ) { HCM(m) = ci; - pi = p[QTOS((Q)ARG1(s))]; - tp = nd_mul_nm(mod,BDY(m),pi); - add_pbucket(mod,r,tp); + pi = p[j=QTOS((Q)ARG1(s))]; + if ( !pi ) { + pi = nd_load_mod(j); + tp = nd_mul_nm(mod,BDY(m),pi); + nd_free(pi); + add_pbucket(mod,r,tp); + } else { + tp = nd_mul_nm(mod,BDY(m),pi); + add_pbucket(mod,r,tp); + } } ci = 1; } else { @@ -7334,6 +7395,7 @@ ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) } } rd = normalize_pbucket(mod,r); + free_pbucket(r); if ( ci != 1 ) nd_mul_c(mod,rd,ci); return rd; } @@ -7390,14 +7452,14 @@ MAT nd_btog(LIST f,LIST v,int mod,struct order_spec *o for ( t = trace,i=0; t; t = NEXT(t), i++ ) { printf("%d ",i); fflush(stdout); ti = BDY((LIST)BDY(t)); - p[j=QTOS((Q)ARG0(ti))] = recompute_trace(BDY((LIST)ARG1(ti)),p,nb,mod); + p[j=QTOS((Q)ARG0(ti))] = btog(BDY((LIST)ARG1(ti)),p,nb,mod); if ( j == 441 ) printf("afo"); } for ( t = intred, i=0; t; t = NEXT(t), i++ ) { printf("%d ",i); fflush(stdout); ti = BDY((LIST)BDY(t)); - p[j=QTOS((Q)ARG0(ti))] = recompute_trace(BDY((LIST)ARG1(ti)),p,nb,mod); + p[j=QTOS((Q)ARG0(ti))] = btog(BDY((LIST)ARG1(ti)),p,nb,mod); if ( j == 441 ) printf("afo"); } @@ -7463,16 +7525,29 @@ VECT nd_btog_one(LIST f,LIST v,int mod,struct order_sp for ( t = trace,i=0; t; t = NEXT(t), i++ ) { printf("%d ",i); fflush(stdout); ti = BDY((LIST)BDY(t)); - p[j=QTOS((Q)ARG0(ti))] = recompute_trace_one(BDY((LIST)ARG1(ti)),p,nb,mod); + p[j=QTOS((Q)ARG0(ti))] = btog_one(BDY((LIST)ARG1(ti)),p,nb,mod); + if ( Demand ) { + nd_save_mod(p[j],j); nd_free(p[j]); p[j] = 0; + } } for ( t = intred, i=0; t; t = NEXT(t), i++ ) { printf("%d ",i); fflush(stdout); ti = BDY((LIST)BDY(t)); - p[j=QTOS((Q)ARG0(ti))] = recompute_trace_one(BDY((LIST)ARG1(ti)),p,nb,mod); + p[j=QTOS((Q)ARG0(ti))] = btog_one(BDY((LIST)ARG1(ti)),p,nb,mod); + if ( Demand ) { + nd_save_mod(p[j],j); nd_free(p[j]); p[j] = 0; + } } m = length(ind); MKVECT(vect,m); - for ( j = 0, t = ind; j < m; j++, t = NEXT(t) ) - BDY(vect)[j] = ndtodp(mod,p[QTOS((Q)BDY(t))]); + for ( j = 0, t = ind; j < m; j++, t = NEXT(t) ) { + u = p[QTOS((Q)BDY(t))]; + if ( !u ) { + u = nd_load_mod(QTOS((Q)BDY(t))); + BDY(vect)[j] = ndtodp(mod,u); + nd_free(u); + } else + BDY(vect)[j] = ndtodp(mod,u); + } return vect; }