diff options
Diffstat (limited to 'test/ccured_olden/power')
-rw-r--r-- | test/ccured_olden/power/.cvsignore | 21 | ||||
-rw-r--r-- | test/ccured_olden/power/.gdbinit | 5 | ||||
-rw-r--r-- | test/ccured_olden/power/CVS/Entries | 11 | ||||
-rw-r--r-- | test/ccured_olden/power/CVS/Repository | 1 | ||||
-rw-r--r-- | test/ccured_olden/power/CVS/Root | 1 | ||||
-rw-r--r-- | test/ccured_olden/power/Makefile | 41 | ||||
-rw-r--r-- | test/ccured_olden/power/README | 21 | ||||
-rw-r--r-- | test/ccured_olden/power/build.c | 154 | ||||
-rw-r--r-- | test/ccured_olden/power/compute.c | 379 | ||||
-rw-r--r-- | test/ccured_olden/power/main.c | 116 | ||||
-rw-r--r-- | test/ccured_olden/power/out.orig | 37 | ||||
-rw-r--r-- | test/ccured_olden/power/output | 38 | ||||
-rw-r--r-- | test/ccured_olden/power/power.h | 114 | ||||
-rwxr-xr-x | test/ccured_olden/power/testit | 26 |
14 files changed, 965 insertions, 0 deletions
diff --git a/test/ccured_olden/power/.cvsignore b/test/ccured_olden/power/.cvsignore new file mode 100644 index 00000000..c4eadcc3 --- /dev/null +++ b/test/ccured_olden/power/.cvsignore @@ -0,0 +1,21 @@ +*.i +*_all*.c +*cil.c +*box.c +code +data.in +data.out +*.origi +*_ppp.c +power.cil +power.*box +*infer.c +changes.out +allcfiles +ope.m +*cured.c +*.optim.c +*_comb.c +*.exe_comb.browser +changes +output diff --git a/test/ccured_olden/power/.gdbinit b/test/ccured_olden/power/.gdbinit new file mode 100644 index 00000000..81003d62 --- /dev/null +++ b/test/ccured_olden/power/.gdbinit @@ -0,0 +1,5 @@ +# .gdbinit + +file power.exe.orig +break main +run diff --git a/test/ccured_olden/power/CVS/Entries b/test/ccured_olden/power/CVS/Entries new file mode 100644 index 00000000..fccdd5e3 --- /dev/null +++ b/test/ccured_olden/power/CVS/Entries @@ -0,0 +1,11 @@ +/README/1.1/Mon Jun 11 21:20:00 2001// +/build.c/1.1/Mon Jun 11 21:20:00 2001// +/compute.c/1.2/Wed Jun 13 18:16:23 2001// +/main.c/1.2/Mon Jun 11 22:47:26 2001// +/.gdbinit/1.1/Mon Nov 12 08:08:28 2001// +/Makefile/1.5/Mon Nov 12 15:44:12 2001// +/out.orig/1.1/Mon Nov 12 08:08:28 2001// +/testit/1.1/Mon Nov 12 08:08:28 2001// +/.cvsignore/1.10/Fri Oct 4 16:28:44 2002// +/power.h/1.6/Sat Jan 11 20:33:38 2003// +D diff --git a/test/ccured_olden/power/CVS/Repository b/test/ccured_olden/power/CVS/Repository new file mode 100644 index 00000000..edf93de9 --- /dev/null +++ b/test/ccured_olden/power/CVS/Repository @@ -0,0 +1 @@ +cil/test/olden/power diff --git a/test/ccured_olden/power/CVS/Root b/test/ccured_olden/power/CVS/Root new file mode 100644 index 00000000..35f411e9 --- /dev/null +++ b/test/ccured_olden/power/CVS/Root @@ -0,0 +1 @@ +/home/cvs-repository diff --git a/test/ccured_olden/power/Makefile b/test/ccured_olden/power/Makefile new file mode 100644 index 00000000..e982f5b5 --- /dev/null +++ b/test/ccured_olden/power/Makefile @@ -0,0 +1,41 @@ + +CC = gcc -arch ppc +CCOMP=../../../../ccomp +CCOMPFLAGS=-dump-c + +CFLAGS = $(EXTRA_CFLAGS) +#CFLAGS = -O2 +LDFLAGS = $(EXTRA_LDFLAGS) + +CFLAGS += -DPLAIN + +ifdef _MSVC + # ... +else + MATH = -lm + CFLAGS += -g -ffloat-store + LDFLAGS += -g -ffloat-store +endif + +PROGS = compute build main + +#defaulttarget: $(OBJS) +# $(CC) $(LDFLAGS) $(OBJS) $(EXTRA_LIBS) -o power.exe $(MATH) + +all_s: $(PROGS:%=%.s) + +all: $(PROGS:%=%.compcert) + +all_gcc: $(PROGS:%=%.gcc) + +%.compcert: %.s + $(CC) $(LDFALGS) -o $*.compcert $*.s + +%.s: %.c ../../../../ccomp + $(CCOMP) $(CCOMPFLAGS) $*.c + +%.gcc: %.c + $(CC) $(CFLAGS) $(LDFALGS) $(OPTFLAGS) -o $*.gcc $*.c + +clean: + rm -f $(TARGET) $(OBJS) *~ *.obj *.o *.exe .make.state .nse_depinfo *.light.c *.s *.compcert diff --git a/test/ccured_olden/power/README b/test/ccured_olden/power/README new file mode 100644 index 00000000..478692e8 --- /dev/null +++ b/test/ccured_olden/power/README @@ -0,0 +1,21 @@ +/* For copyright information, see olden_v1.0/COPYRIGHT */ +********************** +olden_v1.0/benchmarks/power/README +January 3, 1995 +Martin C. Carlisle + +this directory contains the Power Pricing benchmark: + +S. Lumetta, L. Murphy, X. Li, D. Culler, and I. Khalil. "Decentralized +optimal power pricing: The development of a parallel program." +Supercomputing '93, 243-249 + +as implemented for Olden by Martin C. Carlisle +********************** + +Makefile - use "make power" to create executable + +args.c - process command line args +main.c,power.h - main routines +build.c - build tree +compute.c - compute prices diff --git a/test/ccured_olden/power/build.c b/test/ccured_olden/power/build.c new file mode 100644 index 00000000..881b8e60 --- /dev/null +++ b/test/ccured_olden/power/build.c @@ -0,0 +1,154 @@ +/* For copyright information, see olden_v1.0/COPYRIGHT */ + +/* build.c + * + * By: Martin C. Carlisle + * 6/15/94 + * builds the tree for the Power Pricing problem + * + * based on code by: Steve Lumetta, Sherry Li, and Ismail Khalil + * University of California at Berkeley + */ + +#include "power.h" + +Root build_tree() +{ + register int i; + register Root t; +#ifdef FUTURES + int j; + future_cell_int fc[NUM_FEEDERS]; +#else + register Lateral l; +#endif + + t = (Root) ALLOC(0,sizeof(*t)); +#ifdef FUTURES + for (i=0,j=0; i<NUM_FEEDERS; i++,j+=LATERALS_PER_FEEDER) { + FUTURE(j,LATERALS_PER_FEEDER,build_lateral,&fc[i]); + } + for (i=0; i<NUM_FEEDERS; i++) { + TOUCH(&fc[i]); + t->feeders[i]=(Lateral) fc[i].value; + } +#else + for (i=0; i<NUM_FEEDERS; i++) { + /* Insert future here, split into two loops */ + l = build_lateral(i*LATERALS_PER_FEEDER,LATERALS_PER_FEEDER); + t->feeders[i]=l; + } +#endif + t->theta_R = 0.8; + t->theta_I = 0.16; + return t; +} + +Lateral build_lateral(int i, int num) +{ + register int j,k; + register Lateral l; + register Branch b; +#ifdef FUTURES + future_cell_int fc; +#else + register Lateral next; +#endif + + if (num == 0) return NULL; + +#ifndef PLAIN + { int x,m,q,proc; + x = (i+num-1)*BRANCHES_PER_LATERAL+BRANCHES_PER_LATERAL-1; + m = 1000%__NumNodes; + q = 1000/__NumNodes; + if (x<m*(q+1)) proc = x/(q+1); + else proc = (x-m)/q; + l = (Lateral) ALLOC(__NumNodes-1-proc,sizeof(*l)); + } +#else + l = (Lateral) ALLOC(0,sizeof(*l)); +#endif + +#ifdef FUTURES + FUTURE(i,num-1,build_lateral,&fc); + b = build_branch(i*BRANCHES_PER_LATERAL,(num-1)*BRANCHES_PER_LATERAL, + BRANCHES_PER_LATERAL); +#else + next = build_lateral(i,num-1); + b = build_branch(i*BRANCHES_PER_LATERAL,(num-1)*BRANCHES_PER_LATERAL, + BRANCHES_PER_LATERAL); +#endif + +#ifdef FUTURES + TOUCH(&fc); + l->next_lateral = (Lateral) fc.value; +#else + l->next_lateral = next; +#endif + l->branch = b; + l->R = 1/300000.0; + l->X = 0.000001; + l->alpha = 0.0; + l->beta = 0.0; + return l; +} + +Branch build_branch(int i, int j, int num) +{ + register Leaf l; + register Branch b; +#ifdef FUTURES + future_cell_int fc; +#endif + + if (num == 0) return NULL; + /* allocate branch */ +#ifndef PLAIN + { int x,m,q,proc; + x = i+j+num-1; + m = 1000%__NumNodes; + q = 1000/__NumNodes; + if (x<m*(q+1)) proc = x/(q+1); + else proc = (x-m)/q; + b = (Branch) ALLOC(__NumNodes-1-proc,sizeof(*b)); + } +#else + b = (Branch) ALLOC(0,sizeof(*b)); +#endif + + /* fill in children */ +#ifndef FUTURES + b->next_branch= build_branch(i,j,num-1); +#else + FUTURE(i,j,num-1,build_branch,&fc); +#endif + + for (i=0; i<LEAVES_PER_BRANCH; i++) { + l = build_leaf(); + b->leaves[i] = l; + } + + +#ifdef FUTURES + TOUCH(&fc); + b->next_branch = (Branch) fc.value; +#endif + + /* fill in values */ + b->R = 0.0001; + b->X = 0.00002; + b->alpha = 0.0; + b->beta = 0.0; + return b; +} + +Leaf build_leaf() +{ + register Leaf l; + + l = (Leaf) mymalloc(sizeof(*l)); + l->D.P = 1.0; + l->D.Q = 1.0; + return l; +} diff --git a/test/ccured_olden/power/compute.c b/test/ccured_olden/power/compute.c new file mode 100644 index 00000000..83d47b59 --- /dev/null +++ b/test/ccured_olden/power/compute.c @@ -0,0 +1,379 @@ +/* For copyright information, see olden_v1.0/COPYRIGHT */ + +/* compute.c + * + * By: Martin C. Carlisle + * 6/15/94 + * + * Implements computation phase of the Power Pricing problem + * based on code by: Steve Lumetta, Sherry Li, and Ismail Khalil + * University of California at Berkeley + * + */ + +#include "power.h" +#include <math.h> + +/*----------------------------------------------------------------------*/ +/* Leaf optimization 'global' variables */ + + static double P=1.0; + static double Q=1.0; + + +/*----------------------------------------------------------------------*/ +/* Leaf optimization procedures */ + +void optimize_node (double pi_R, double pi_I); +double find_g (); +double find_h (); +double find_gradient_f (double pi_R, double pi_I, local double* gradient); +double find_gradient_g (local double* gradient); +double find_gradient_h (local double* gradient); +void find_dd_grad_f (double pi_R, double pi_I, local double* dd_grad); +double make_orthogonal (local double* v_mod, local double* v_static); + + +void Compute_Tree(Root r) { + register int i; + Lateral l; +#ifndef FUTURES + Demand a; +#else + future_cell_demand fc[NUM_FEEDERS]; +#endif + Demand tmp; + double theta_R,theta_I; + + tmp.P = 0.0; + tmp.Q = 0.0; +#ifndef FUTURES + for (i=0; i<NUM_FEEDERS; i++) { + l = r->feeders[i]; + theta_R = r->theta_R; + theta_I = r->theta_I; + a = Compute_Lateral(l,theta_R,theta_I,theta_R,theta_I); + tmp.P += a.P; + tmp.Q += a.Q; + + } +#else + for (i=0; i<NUM_FEEDERS; i++) { + l = r->feeders[i]; + theta_R = r->theta_R; + theta_I = r->theta_I; + FUTURE(l,theta_R,theta_I,theta_R,theta_I,Compute_Lateral,&fc[i]); + } + for (i=NUM_FEEDERS-1; i>=0; i--) { + TOUCH(&fc[i]); + tmp.P += fc[i].value.P; + tmp.Q += fc[i].value.Q; + } +#endif + r->D.P = tmp.P; + r->D.Q = tmp.Q; +} + +Demand Compute_Lateral(Lateral l, double theta_R, double theta_I, + double pi_R, double pi_I) { +#ifndef FUTURES + Demand a1; +#else + future_cell_demand fc; +#endif + Demand a2; + double new_pi_R, new_pi_I; + double a,b,c,root; + Lateral next; + Branch br; + + new_pi_R = pi_R + l->alpha*(theta_R+(theta_I*l->X)/l->R); + new_pi_I = pi_I + l->beta*(theta_I+(theta_R*l->R)/l->X); + + next = l->next_lateral; + if (next != NULL) +#ifndef FUTURES + a1 = Compute_Lateral(next,theta_R,theta_I,new_pi_R,new_pi_I); +#else + FUTURE(next,theta_R,theta_I,new_pi_R,new_pi_I,Compute_Lateral,&fc); +#endif + + br = l->branch; + a2 = Compute_Branch(br,theta_R,theta_I,new_pi_R,new_pi_I); + + if (next != NULL) { +#ifndef FUTURES + l->D.P = a1.P + a2.P; + l->D.Q = a1.Q + a2.Q; +#else + TOUCH(&fc); + l->D.P = a2.P + fc.value.P; + l->D.Q = a2.Q + fc.value.Q; +#endif + } else { + l->D.P = a2.P; + l->D.Q = a2.Q; + } + + /* compute P,Q */ + a = l->R*l->R + l->X*l->X; + b = 2*l->R*l->X*l->D.Q - 2*l->X*l->X*l->D.P - l->R; + c = l->R*l->D.Q - l->X*l->D.P; + c = c*c + l->R*l->D.P; + root = (-b-sqrt(b*b-4*a*c))/(2*a); + l->D.Q = l->D.Q + ((root-l->D.P)*l->X)/l->R; + l->D.P = root; + + /* compute alpha, beta */ + a = 2*l->R*l->D.P; + b = 2*l->X*l->D.Q; + l->alpha = a/(1-a-b); + l->beta = b/(1-a-b); + return l->D; +} + +Demand Compute_Branch(Branch br, double theta_R, double theta_I, + double pi_R, double pi_I) { + Demand a2,tmp; + double new_pi_R, new_pi_I; + double a,b,c,root; + Leaf l; + Branch next; + int i; +#ifdef FUTURES + future_cell_demand fc; +#else + Demand a1; +#endif + + new_pi_R = pi_R + br->alpha*(theta_R+(theta_I*br->X)/br->R); + new_pi_I = pi_I + br->beta*(theta_I+(theta_R*br->R)/br->X); + + next = br->next_branch; + if (next != NULL) { +#ifndef FUTURES + a1 = Compute_Branch(next,theta_R,theta_I,new_pi_R,new_pi_I); +#else + FUTURE(next,theta_R,theta_I,new_pi_R,new_pi_I,Compute_Branch,&fc); +#endif + } + + /* Initialize tmp */ + tmp.P = 0.0; tmp.Q = 0.0; + + for (i=0; i<LEAVES_PER_BRANCH; i++) { + l = br->leaves[i]; + a2 = Compute_Leaf(l,new_pi_R,new_pi_I); + tmp.P += a2.P; + tmp.Q += a2.Q; + } + if (next != NULL) { +#ifndef FUTURES + br->D.P = a1.P + tmp.P; + br->D.Q = a1.Q + tmp.Q; +#else + TOUCH(&fc); + br->D.P = fc.value.P + tmp.P; + br->D.Q = fc.value.Q + tmp.Q; +#endif + } else { + br->D.P = tmp.P; + br->D.Q = tmp.Q; + } + + /* compute P,Q */ + a = br->R*br->R + br->X*br->X; + b = 2*br->R*br->X*br->D.Q - 2*br->X*br->X*br->D.P - br->R; + c = br->R*br->D.Q - br->X*br->D.P; + c = c*c + br->R*br->D.P; + root = (-b-sqrt(b*b-4*a*c))/(2*a); + br->D.Q = br->D.Q + ((root-br->D.P)*br->X)/br->R; + br->D.P = root; + /* compute alpha, beta */ + a = 2*br->R*br->D.P; + b = 2*br->X*br->D.Q; + br->alpha = a/(1-a-b); + br->beta = b/(1-a-b); + + return br->D; +} + +Demand Compute_Leaf(Leaf l, double pi_R, double pi_I) { + P = l->D.P; + Q = l->D.Q; + + optimize_node(pi_R,pi_I); + + if (P<0.0) { + P = 0.0; + Q = 0.0; + } + l->D.P = P; + l->D.Q = Q; + return l->D; +} + +/*----------------------------------------------------------------------*/ + +void optimize_node (double pi_R, double pi_I) +{ + double g; + double h; + + double grad_f[2]; + double grad_g[2]; + double grad_h[2]; + double dd_grad_f[2]; + double magnitude; + + int i; + double total; + double max_dist; + + do { + /* Move onto h=0 line */ + h=find_h (); + if (fabs (h)>H_EPSILON) { + magnitude=find_gradient_h (grad_h); + total=h/magnitude; + P-=total*grad_h[0]; + Q-=total*grad_h[1]; + } + + /* Check that g is still valid */ + g=find_g (); + if (g>G_EPSILON) { + magnitude=find_gradient_g (grad_g); + find_gradient_h (grad_h); + magnitude*=make_orthogonal (grad_g,grad_h); + total=g/magnitude; + P-=total*grad_g[0]; + Q-=total*grad_g[1]; + } + + /* Maximize benefit */ + magnitude=find_gradient_f (pi_R,pi_I,grad_f); + find_dd_grad_f (pi_R,pi_I,dd_grad_f); + total=0.0; + for (i=0; i<2; i++) + total+=grad_f[i]*dd_grad_f[i]; + magnitude/=fabs (total); + find_gradient_h (grad_h); + magnitude*=make_orthogonal (grad_f,grad_h); + find_gradient_g (grad_g); + total=0.0; + for (i=0; i<2; i++) + total+=grad_f[i]*grad_g[i]; + if (total>0) { + max_dist=-find_g ()/total; + if (magnitude>max_dist) + magnitude=max_dist; + } + P+=magnitude*grad_f[0]; + Q+=magnitude*grad_f[1]; + + h=find_h (); + g=find_g (); + find_gradient_f (pi_R,pi_I,grad_f); + find_gradient_h (grad_h); + + } while (fabs (h)>H_EPSILON || g>G_EPSILON || + (fabs (g)>G_EPSILON && + fabs (grad_f[0]*grad_h[1]-grad_f[1]*grad_h[0])>F_EPSILON)); +} + +double find_g () +{ + return (P*P+Q*Q-0.8); +} + +double find_h () +{ + return (P-5*Q); +} + +double find_gradient_f (double pi_R, double pi_I, local double* gradient) +{ + int i; + double magnitude=0.0; + + gradient[0]=1/(1+P)-pi_R; + gradient[1]=1/(1+Q)-pi_I; + for (i=0; i<2; i++) + magnitude+=gradient[i]*gradient[i]; + magnitude=sqrt (magnitude); + for (i=0; i<2; i++) + gradient[i]/=magnitude; + + return magnitude; +} + +double find_gradient_g (local double* gradient) +{ + int i; + double magnitude=0.0; + + gradient[0]=2*P; + gradient[1]=2*Q; + for (i=0; i<2; i++) + magnitude+=gradient[i]*gradient[i]; + magnitude=sqrt (magnitude); + for (i=0; i<2; i++) + gradient[i]/=magnitude; + + return magnitude; +} + +double find_gradient_h (local double* gradient) +{ + int i; + double magnitude=0.0; + + gradient[0]=1.0; + gradient[1]=-5.0; + for (i=0; i<2; i++) + magnitude+=gradient[i]*gradient[i]; + magnitude=sqrt (magnitude); + for (i=0; i<2; i++) + gradient[i]/=magnitude; + + return magnitude; +} + +void find_dd_grad_f (double pi_R, double pi_I, local double* dd_grad) +{ + double P_plus_1_inv=1/(P+1); + double Q_plus_1_inv=1/(Q+1); + double P_grad_term=P_plus_1_inv-pi_R; + double Q_grad_term=Q_plus_1_inv-pi_I; + double grad_mag; + + grad_mag=sqrt (P_grad_term*P_grad_term+Q_grad_term*Q_grad_term); + + dd_grad[0]=-P_plus_1_inv*P_plus_1_inv*P_grad_term/grad_mag; + dd_grad[1]=-Q_plus_1_inv*Q_plus_1_inv*Q_grad_term/grad_mag; +} + +double make_orthogonal (local double* v_mod, local double* v_static) +{ + int i; + double total=0.0; + double length=0.0; + + for (i=0; i<2; i++) + total+=v_mod[i]*v_static[i]; + for (i=0; i<2; i++) { + v_mod[i]-=total*v_static[i]; + length+=v_mod[i]*v_mod[i]; + } + length=sqrt (length); + for (i=0; i<2; i++) + v_mod[i]/=length; + + if (1-total*total<0) /* Roundoff error--vectors are parallel */ + return 0; + + return sqrt (1-total*total); +} + +/*----------------------------------------------------------------------*/ diff --git a/test/ccured_olden/power/main.c b/test/ccured_olden/power/main.c new file mode 100644 index 00000000..0fb87c0f --- /dev/null +++ b/test/ccured_olden/power/main.c @@ -0,0 +1,116 @@ +/* For copyright information, see olden_v1.0/COPYRIGHT */ + +/* main.c + * + * By: Martin C. Carlisle + * 6/16/94 + * + * main routine for the Power Pricing problem + * adapted from code by: Steve Lumetta, Sherry Li, and Ismail Khalil + * University of California at Berkeley + * + * Cleaned up the CM stuff. George Necula + */ + +#include "power.h" + +/* Domain of thetaR->P map is 0.65 to 1.00 [index*0.01+0.65] */ +double map_P[36] = +{8752.218091048, 8446.106670416, 8107.990680283, + 7776.191574285, 7455.920518777, 7146.602181352, + 6847.709026813, 6558.734204024, 6279.213382291, + 6008.702199986, 5746.786181029, 5493.078256495, + 5247.206333097, 5008.828069358, 4777.615815166, + 4553.258735900, 4335.470002316, 4123.971545694, + 3918.501939675, 3718.817618538, 3524.683625800, + 3335.876573044, 3152.188635673, 2973.421417103, + 2799.382330486, 2629.892542617, 2464.782829705, + 2303.889031418, 2147.054385395, 1994.132771399, + 1844.985347313, 1699.475053321, 1557.474019598, + 1418.860479043, 1283.520126656, 1151.338004216}; + +#define MIN_THETA_R 0.65 +#define PER_INDEX_R 0.01 +#define MAX_THETA_R 0.995 + +/* Domain of thetaI->Q map is 0.130 to 0.200 [index*0.002+0.130] */ +double map_Q[36] = +{1768.846590190, 1706.229490046, 1637.253873079, + 1569.637451623, 1504.419525242, 1441.477913810, + 1380.700660446, 1321.980440476, 1265.218982201, + 1210.322424636, 1157.203306183, 1105.780028163, + 1055.974296746, 1007.714103979, 960.930643875, + 915.558722782, 871.538200178, 828.810882006, + 787.322098340, 747.020941334, 707.858376214, + 669.787829741, 632.765987756, 596.751545633, + 561.704466609, 527.587580585, 494.365739051, + 462.004890691, 430.472546686, 399.738429196, + 369.773787595, 340.550287137, 312.041496095, + 284.222260660, 257.068973074, 230.557938283}; + +#define MIN_THETA_I 0.13 +#define PER_INDEX_I 0.002 +#define MAX_THETA_I 0.199 + +#ifdef PLAIN +double wallclock; +#endif + +main(int argc,char *argv[]) +{ + Root r; + int i,finished=0; + double d_theta_R,d_theta_I; + + chatting("Past initialization\n"); + + timer_start(0); + + /* initial pass */ + r = build_tree(); + chatting("Built tree\n"); + Compute_Tree(r); + r->last.P = r->D.P; + r->last.Q = r->D.Q; + r->last_theta_R = r->theta_R; + r->last_theta_I = r->theta_I; + r->theta_R = 0.7; + r->theta_I = 0.14; + + while (!finished) { + Compute_Tree(r); + chatting("TR=%13.9f, TI=%13.9f, P0=%13.9f, Q0=%13.9f\n", + r->theta_R,r->theta_I,r->D.P,r->D.Q); + if (fabs(r->D.P/10000.0 - r->theta_R) < ROOT_EPSILON && + fabs(r->D.Q/10000.0 - r->theta_I) < ROOT_EPSILON) { + finished = 1; + } else { + i = (int)((r->theta_R - MIN_THETA_R) / PER_INDEX_R); + if (i<0) i=0; + if (i>35) i=35; + d_theta_R = -(r->theta_R - r->D.P/10000.0) / + (1 - (map_P[i+1] - map_P[i]) / (PER_INDEX_R * 10000.0)); + + i = (int)((r->theta_I - MIN_THETA_I) / PER_INDEX_I); + if (i<0) i=0; + if (i>35) i=35; + d_theta_I = -(r->theta_I - r->D.Q/10000.0) / + (1 - (map_Q[i+1] - map_Q[i]) / (PER_INDEX_I * 10000.0)); + + chatting("D TR-%13.9f, TI=%13.9f\n", d_theta_R,d_theta_I); + r->last.P = r->D.P; + r->last.Q = r->D.Q; + r->last_theta_R = r->theta_R; + r->last_theta_I = r->theta_I; + r->theta_R = r->theta_R + d_theta_R; + r->theta_I = r->theta_I + d_theta_I; + } + } /* while */ + timer_stop(0); + chatting("Elapsed time %f\n", timer_elapsed(0)); + +#ifdef FUTURES + __ShutDown(0); +#endif + return 0; +} diff --git a/test/ccured_olden/power/out.orig b/test/ccured_olden/power/out.orig new file mode 100644 index 00000000..ce4ccae8 --- /dev/null +++ b/test/ccured_olden/power/out.orig @@ -0,0 +1,37 @@ +Past initialization +Built tree +TR= 0.70000, TI= 0.14000, P0=7368.11283, Q0=1486.61206 +D TR- 0.00899, TI= 0.00214 +TR= 0.70899, TI= 0.14214, P0=6825.69077, Q0=1376.20403 +D TR- -0.00662, TI= -0.00114 +TR= 0.70236, TI= 0.14099, P0=7102.87981, Q0=1432.59759 +D TR- 0.00198, TI= 0.00056 +TR= 0.70435, TI= 0.14155, P0=7000.94922, Q0=1411.85085 +D TR- -0.00106, TI= -0.00009 +TR= 0.70328, TI= 0.14146, P0=7047.52523, Q0=1421.32891 +D TR- 0.00036, TI= 0.00016 +TR= 0.70365, TI= 0.14162, P0=7029.01641, Q0=1417.56197 +D TR- -0.00018, TI= 0.00003 +TR= 0.70346, TI= 0.14166, P0=7037.01709, Q0=1419.19017 +D TR- 0.00005, TI= 0.00006 +TR= 0.70352, TI= 0.14172, P0=7033.77002, Q0=1418.52933 +D TR- -0.00003, TI= 0.00003 +TR= 0.70348, TI= 0.14175, P0=7035.10974, Q0=1418.80198 +D TR- 0.00000, TI= 0.00003 +TR= 0.70349, TI= 0.14178, P0=7034.59229, Q0=1418.69667 +D TR- -0.00000, TI= 0.00002 +TR= 0.70348, TI= 0.14180, P0=7034.76550, Q0=1418.73192 +D TR- -0.00000, TI= 0.00001 +TR= 0.70348, TI= 0.14182, P0=7034.73206, Q0=1418.72511 +D TR- -0.00000, TI= 0.00001 +TR= 0.70348, TI= 0.14183, P0=7034.72701, Q0=1418.72409 +D TR- -0.00000, TI= 0.00000 +TR= 0.70347, TI= 0.14184, P0=7034.72601, Q0=1418.72388 +D TR- -0.00000, TI= 0.00000 +TR= 0.70347, TI= 0.14185, P0=7034.72675, Q0=1418.72403 +D TR- -0.00000, TI= 0.00000 +TR= 0.70347, TI= 0.14185, P0=7034.72767, Q0=1418.72422 +D TR- -0.00000, TI= 0.00000 +TR= 0.70347, TI= 0.14186, P0=7034.72812, Q0=1418.72431 +D TR- -0.00000, TI= 0.00000 +TR= 0.70347, TI= 0.14186, P0=7034.72817, Q0=1418.72432 diff --git a/test/ccured_olden/power/output b/test/ccured_olden/power/output new file mode 100644 index 00000000..5d8d9f14 --- /dev/null +++ b/test/ccured_olden/power/output @@ -0,0 +1,38 @@ +Past initialization +Built tree +TR= 0.700000000, TI= 0.140000000, P0=7368.112832298, Q0=1486.612062522 +D TR- 0.008993314, TI= 0.002144467 +TR= 0.708993314, TI= 0.142144467, P0=6825.690778967, Q0=1376.204035288 +D TR- -0.006624389, TI= -0.001149403 +TR= 0.702368925, TI= 0.140995064, P0=7102.879810214, Q0=1432.597592989 +D TR- 0.001985258, TI= 0.000560726 +TR= 0.704354182, TI= 0.141555790, P0=7000.949225527, Q0=1411.850856419 +D TR- -0.001067770, TI= -0.000091784 +TR= 0.703286413, TI= 0.141464005, P0=7047.525235387, Q0=1421.328911557 +D TR- 0.000367545, TI= 0.000165612 +TR= 0.703653957, TI= 0.141629618, P0=7029.016413235, Q0=1417.561973965 +D TR- -0.000188601, TI= 0.000031340 +TR= 0.703465356, TI= 0.141660958, P0=7037.017091019, Q0=1419.190170854 +D TR- 0.000059252, TI= 0.000063894 +TR= 0.703524609, TI= 0.141724852, P0=7033.770028540, Q0=1418.529337079 +D TR- -0.000037004, TI= 0.000031712 +TR= 0.703487605, TI= 0.141756564, P0=7035.109740779, Q0=1418.801987979 +D TR- 0.000005859, TI= 0.000030611 +TR= 0.703493463, TI= 0.141787176, P0=7034.592291756, Q0=1418.696672935 +D TR- -0.000008582, TI= 0.000020424 +TR= 0.703484881, TI= 0.141807600, P0=7034.765506561, Q0=1418.731929644 +D TR- -0.000002088, TI= 0.000016240 +TR= 0.703482793, TI= 0.141823841, P0=7034.732061514, Q0=1418.725114927 +D TR- -0.000002403, TI= 0.000012051 +TR= 0.703480389, TI= 0.141835891, P0=7034.727015389, Q0=1418.724090079 +D TR- -0.000001927, TI= 0.000009042 +TR= 0.703478462, TI= 0.141844933, P0=7034.726010052, Q0=1418.723886296 +D TR- -0.000001469, TI= 0.000006798 +TR= 0.703476993, TI= 0.141851731, P0=7034.726755730, Q0=1418.724038175 +D TR- -0.000001082, TI= 0.000005119 +TR= 0.703475910, TI= 0.141856849, P0=7034.727670658, Q0=1418.724224195 +D TR- -0.000000788, TI= 0.000003856 +TR= 0.703475122, TI= 0.141860705, P0=7034.728128768, Q0=1418.724317198 +D TR- -0.000000579, TI= 0.000002903 +TR= 0.703474543, TI= 0.141863609, P0=7034.728179600, Q0=1418.724327425 +Elapsed time 5130.000000 diff --git a/test/ccured_olden/power/power.h b/test/ccured_olden/power/power.h new file mode 100644 index 00000000..b8fbd2dd --- /dev/null +++ b/test/ccured_olden/power/power.h @@ -0,0 +1,114 @@ +/* For copyright information, see olden_v1.0/COPYRIGHT */ + +/* + * power.h + * + * By: Martin C. Carlisle + * 6/15/94 + * + * Header file for the Power Pricing problem + * adapted from code by Steve Lumetta, Sherry Li, and Ismail Khalil + * University of California at Berkeley + * + */ + +typedef struct demand { + double P; + double Q; +} Demand; + +#ifndef PLAIN +#include "future-cell.h" +#include "mem-ref.h" +typedef struct fc_demand { + future_cell_impl impl; + Demand value; /* cell's value */ + } future_cell_demand; +#endif + +#ifdef PLAIN +#include <time.h> +#define local +#define mymalloc malloc +#define CMMD_node_timer_clear(x) (void)0 +#define TIMESTART(clk) {clk=(double)clock();} +#define TIMESTOP(clk) {clk=1000000.0 * ((double)clock()-(clk))/CLOCKS_PER_SEC;} +extern double wallclock; +#define timer_start(x) TIMESTART(wallclock) +#define timer_stop(x) TIMESTOP(wallclock) +#define timer_elapsed(x) (wallclock / 1000.0) +#endif + +#include "math.h" +#include <stdlib.h> // malloc +#include <stdio.h> // printf + +#ifndef NULL +#define NULL 0 +#endif + +#define NUM_FEEDERS 10 +#define LATERALS_PER_FEEDER 20 +#define BRANCHES_PER_LATERAL 5 +#define LEAVES_PER_BRANCH 10 + +#define F_EPSILON 0.000001 +#define G_EPSILON 0.000001 +#define H_EPSILON 0.000001 +#define ROOT_EPSILON 0.00001 + +typedef struct root { + Demand D; + double theta_R; + double theta_I; + Demand last; + double last_theta_R; + double last_theta_I; + struct lateral *feeders[NUM_FEEDERS]; +} *Root; + +typedef struct lateral { + Demand D; + double alpha; + double beta; + double R; + double X; + struct lateral *next_lateral; + struct branch *branch; +} *Lateral; + +typedef struct branch { + Demand D; + double alpha; + double beta; + double R; + double X; + struct branch *next_branch; + struct leaf *leaves[LEAVES_PER_BRANCH]; +} *Branch; + +typedef struct leaf { + Demand D; + double pi_R; + double pi_I; +} *Leaf; + +#ifdef PLAIN +#define ALLOC(pn,sz) malloc(sz) +#define chatting printf +#define __NumNodes 1 +#define __MyNodeId 0 +#endif + +/* Prototypes */ +Root build_tree(); +Lateral build_lateral(int i, int num); +Branch build_branch(int i, int j, int num); +Leaf build_leaf(); + +void Compute_Tree(Root r); +Demand Compute_Lateral(Lateral l, double theta_R, double theta_I, + double pi_R, double pi_I); +Demand Compute_Branch(Branch b, double theta_R, double theta_I, + double pi_R, double pi_I); +Demand Compute_Leaf(Leaf l, double pi_R, double pi_I); diff --git a/test/ccured_olden/power/testit b/test/ccured_olden/power/testit new file mode 100755 index 00000000..b5132dd7 --- /dev/null +++ b/test/ccured_olden/power/testit @@ -0,0 +1,26 @@ +#!/bin/sh +# test a power binary + +if [ "$1" = "" ]; then + echo "usage: $0 ./power.exe" + exit +fi + +# all of power's output is to stdout +echo "running: $1 >output" +if ! $1 >output; then + echo "$1 failed directly" + exit 2 +fi + +# must strip elapsed time +# must truncate precision to only 5 decimal places, because gcc's optimizer +# (even with -ffloat-store) seems to change the answer under boxing +if ! grep -v "Elapsed time" <output | \ + sed 's/\(\.[0-9]\{5\}\)[0-9]*/\1/g' | diff out.orig - >/dev/null; then + echo "$1 got the wrong answer" + exit 4 +else + echo "$1 seems to work" +fi +
\ No newline at end of file |