version 1.205, 2013/09/09 09:47:09 |
version 1.206, 2013/09/10 02:10:00 |
|
|
/* $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.205 2013/09/09 09:47:09 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 6681 void ndv_save(NDV p,int index) |
|
Line 6681 void ndv_save(NDV p,int index) |
|
fclose(s); |
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) |
NDV ndv_load(int index) |
{ |
{ |
FILE *s; |
FILE *s; |
Line 6725 NDV ndv_load(int index) |
|
Line 6751 NDV ndv_load(int index) |
|
return d; |
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) |
void nd_det(int mod,MAT f,P *rp) |
{ |
{ |
VL fv,tv; |
VL fv,tv; |
Line 7309 ND *recompute_trace(NODE ti,ND **p,int nb,int mod) |
|
Line 7365 ND *recompute_trace(NODE ti,ND **p,int nb,int mod) |
|
ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) |
ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) |
{ |
{ |
PGeoBucket r; |
PGeoBucket r; |
int i,ci; |
int i,ci,j; |
NODE t,s; |
NODE t,s; |
ND m,tp; |
ND m,tp; |
ND pi,rd; |
ND pi,rd; |
Line 7323 ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) |
|
Line 7379 ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) |
|
ptomp(mod,(P)HCQ(m),&c); |
ptomp(mod,(P)HCQ(m),&c); |
if ( ci = ((MQ)c)->cont ) { |
if ( ci = ((MQ)c)->cont ) { |
HCM(m) = ci; |
HCM(m) = ci; |
pi = p[QTOS((Q)ARG1(s))]; |
pi = p[j=QTOS((Q)ARG1(s))]; |
tp = nd_mul_nm(mod,BDY(m),pi); |
if ( !pi ) { |
add_pbucket(mod,r,tp); |
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; |
ci = 1; |
} else { |
} else { |
Line 7334 ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) |
|
Line 7397 ND recompute_trace_one(NODE ti,ND *p,int nb,int mod) |
|
} |
} |
} |
} |
rd = normalize_pbucket(mod,r); |
rd = normalize_pbucket(mod,r); |
|
free_pbucket(r); |
if ( ci != 1 ) nd_mul_c(mod,rd,ci); |
if ( ci != 1 ) nd_mul_c(mod,rd,ci); |
return rd; |
return rd; |
} |
} |
Line 7464 VECT nd_btog_one(LIST f,LIST v,int mod,struct order_sp |
|
Line 7528 VECT nd_btog_one(LIST f,LIST v,int mod,struct order_sp |
|
printf("%d ",i); fflush(stdout); |
printf("%d ",i); fflush(stdout); |
ti = BDY((LIST)BDY(t)); |
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))] = recompute_trace_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++ ) { |
for ( t = intred, i=0; t; t = NEXT(t), i++ ) { |
printf("%d ",i); fflush(stdout); |
printf("%d ",i); fflush(stdout); |
ti = BDY((LIST)BDY(t)); |
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))] = recompute_trace_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); |
m = length(ind); |
MKVECT(vect,m); |
MKVECT(vect,m); |
for ( j = 0, t = ind; j < m; j++, t = NEXT(t) ) |
for ( j = 0, t = ind; j < m; j++, t = NEXT(t) ) { |
BDY(vect)[j] = ndtodp(mod,p[QTOS((Q)BDY(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; |
return vect; |
} |
} |