version 1.1, 1999/10/08 02:12:14 |
version 1.4, 2002/05/02 02:51:37 |
|
|
/* phc6.c , yama:1999/sm1-prog/phc6.c */ |
/* phc6.c , yama:1999/sm1-prog/phc6.c */ |
|
/* $OpenXM: OpenXM/src/phc/phc6.c,v 1.3 2000/10/31 12:22:05 takayama Exp $ */ |
/* This is a simple C interface to the black-box solver of phc. |
/* This is a simple C interface to the black-box solver of phc. |
** Requirements: |
** Requirements: |
** 1) executable version of phc will be searched in the following order: |
** 1) executable version of phc will be searched in the following order: |
|
|
int ival; |
int ival; |
char *str; |
char *str; |
struct phc_object *op; |
struct phc_object *op; |
long double longdouble; |
double longdouble; |
}; |
}; |
struct phc_object{ |
struct phc_object{ |
int tag; /* class identifier */ |
int tag; /* class identifier */ |
Line 41 struct phc_object{ |
|
Line 42 struct phc_object{ |
|
/********** macros to use Sarray **************/ |
/********** macros to use Sarray **************/ |
/* put to Object Array */ |
/* put to Object Array */ |
#define phc_putoa(ob,i,cc) {\ |
#define phc_putoa(ob,i,cc) {\ |
if ((ob).tag != Sarray) {fprintf(stderr,"Warning: PUTOA is for an array of objects\n");} else \ |
if ((ob).tag != Sarray) {fprintf(stderr,"Warning: PUTOA is for an array of objects\n");} else \ |
{if ((0 <= (i)) && ((i) < (ob).lc.ival)) {\ |
{if ((0 <= (i)) && ((i) < (ob).lc.ival)) {\ |
(ob.rc.op)[i] = cc;\ |
(ob.rc.op)[i] = cc;\ |
}else{\ |
}else{\ |
fprintf(stderr,"Warning: PUTOA, the size is %d.\n",(ob).lc.ival);\ |
fprintf(stderr,"Warning: PUTOA, the size is %d.\n",(ob).lc.ival);\ |
}}} |
}}} |
#define phc_getoa(ob,i) ((ob.rc.op)[i]) |
#define phc_getoa(ob,i) ((ob.rc.op)[i]) |
#define phc_getoaSize(ob) ((ob).lc.ival) |
#define phc_getoaSize(ob) ((ob).lc.ival) |
|
|
Line 55 struct phc_object phc_newObjectArray(int size); |
|
Line 56 struct phc_object phc_newObjectArray(int size); |
|
void phc_printObject(FILE *fp,struct phc_object ob); |
void phc_printObject(FILE *fp,struct phc_object ob); |
char *phc_generateUniqueFileName(char *s); |
char *phc_generateUniqueFileName(char *s); |
char *phc_which(char *s); /* search a path for the file s */ |
char *phc_which(char *s); /* search a path for the file s */ |
struct phc_object phc_complexTo(long double r, long double i); |
struct phc_object phc_complexTo(double r, double i); |
|
|
|
|
int phc_scan_for_string(FILE *fp, char str[], int lenstr); |
int phc_scan_for_string(FILE *fp, char str[]); |
struct phc_object phc_scan_solutions(FILE *fp, int npaths, int dim ); |
struct phc_object phc_scan_solutions(FILE *fp, int npaths, int dim ); |
struct phc_object phc_scan_output_of_phc(char *fname); |
struct phc_object phc_scan_output_of_phc(char *fname); |
struct phc_object phc_call_phc(char *sys); |
struct phc_object phc_call_phc(char *sys); |
|
|
int phc_verbose = 0; |
int phc_verbose = 0; |
int phc_overwrite = 1; /* Always use tmp.input.0 and tmp.output.0 |
int phc_overwrite = 1; /* Always use tmp.input.0 and tmp.output.0 |
for work files. */ |
for work files. */ |
|
|
main(int argc, char *argv[]) { |
main(int argc, char *argv[]) { |
struct phc_object ob; |
struct phc_object ob; |
int n,i,dim; |
int n,i,dim; |
#define INPUTSIZE 4096 |
#define INPUTSIZE 4096 |
char input[INPUTSIZE]; |
char input[INPUTSIZE]; |
|
char fname[INPUTSIZE]; |
#define A_SIZE 1024 |
#define A_SIZE 1024 |
char a[A_SIZE]; |
char a[A_SIZE]; |
int message = 0; |
int message = 0; |
for (i=1; i<argc; i++) { |
for (i=1; i<argc; i++) { |
if (strcmp(argv[i],"-v") == 0) { |
if (strcmp(argv[i],"-v") == 0) { |
phc_verbose = 1; |
phc_verbose = 1; message=1; |
}else if (strcmp(argv[i],"-g") == 0) { |
}else if (strcmp(argv[i],"-g") == 0) { |
phc_overwrite = 0; |
phc_overwrite = 0; |
|
}else if (strcmp(argv[i],"-file") == 0) { |
|
/* For debugging. */ |
|
i++; |
|
strncpy(fname,argv[i],INPUTSIZE-1); |
|
ob = phc_scan_output_of_phc(fname); |
|
n = phc_getoaSize(ob); |
|
printf("[\n"); |
|
for (i=0; i<n; i++) { |
|
phc_printObject(stdout,phc_getoa(ob,i)); |
|
if (i != n-1) printf(" ,\n"); else printf(" \n"); |
|
} |
|
printf("]\n"); |
|
exit(0); |
}else if (strcmp(argv[i],"-i") == 0) { |
}else if (strcmp(argv[i],"-i") == 0) { |
ob = phc_call_phc(argv[i+1]); |
ob = phc_call_phc(argv[i+1]); |
n = phc_getoaSize(ob); |
n = phc_getoaSize(ob); |
printf("[\n"); |
printf("[\n"); |
for (i=0; i<n; i++) { |
for (i=0; i<n; i++) { |
phc_printObject(stdout,phc_getoa(ob,i)); |
phc_printObject(stdout,phc_getoa(ob,i)); |
if (i != n-1) printf(" ,\n"); else printf(" \n"); |
if (i != n-1) printf(" ,\n"); else printf(" \n"); |
} |
} |
printf("]\n"); |
printf("]\n"); |
exit(0); |
exit(0); |
Line 98 main(int argc, char *argv[]) { |
|
Line 113 main(int argc, char *argv[]) { |
|
} |
} |
while (1) { |
while (1) { |
if (message) printf("dim= "); |
if (message) printf("dim= "); |
if (scanf("%d",&dim)<0) break; |
if (fgets(input,INPUTSIZE,stdin) <= 0) break; |
|
sscanf(input,"%d",&dim); |
sprintf(input,"%d\n",dim); |
sprintf(input,"%d\n",dim); |
if (message) printf("Input %d equations please.\n",dim); |
if (message) printf("Input %d equations please.\n",dim); |
for (i=0; i<dim; i++) { |
for (i=0; i<dim; i++) { |
if (message) {printf("eq[%d] = ",i); fflush(stdout);} |
if (message) {printf("eq[%d] = ",i); fflush(stdout);} |
do { |
do { |
fgets(a,A_SIZE-1, stdin); |
fgets(a,A_SIZE-1, stdin); |
} while (strlen(a) == 0); |
} while (strlen(a) == 0); |
if (strlen(a) >= A_SIZE-3) { |
if (strlen(a) >= A_SIZE-3) { |
fprintf(stderr,"Too big input for the input buffer a.\n"); exit(10); |
fprintf(stderr,"Too big input for the input buffer a.\n"); exit(10); |
} |
} |
if (strlen(input)+strlen(a) >= INPUTSIZE) { |
if (strlen(input)+strlen(a) >= INPUTSIZE) { |
fprintf(stderr,"Too big input for the input buffer input.\n"); exit(10); |
fprintf(stderr,"Too big input for the input buffer input.\n"); exit(10); |
} |
} |
sprintf(input+strlen(input),"%s\n",a); |
sprintf(input+strlen(input),"%s\n",a); |
} |
} |
ob = phc_call_phc(input); |
ob = phc_call_phc(input); |
if (message) { |
if (message) { |
Line 128 main(int argc, char *argv[]) { |
|
Line 144 main(int argc, char *argv[]) { |
|
} |
} |
} |
} |
|
|
int phc_scan_for_string(FILE *fp, char str[], int lenstr) |
int phc_scan_for_string(FILE *fp, char s[]) |
/* |
/* |
** Scans the file fp for a certain string str of length lenstr+1. |
** Scans the file fp for a certain string str of length lenstr+1. |
** Reading stops when the string has been found, then the variable |
** Reading stops when the string has been found, then the variable |
** on return equals 1, otherwise 0 is returned. |
** on return equals 1, otherwise 0 is returned. |
*/ |
*/ |
|
#define BUF_SIZE 1024 |
{ |
{ |
char buf[lenstr+1]; |
char buf[BUF_SIZE]; |
|
int pt,n,c,i; |
|
pt = 0; |
|
n=strlen(s); |
|
if (n > BUF_SIZE-2) { |
|
fprintf(stderr,"Too long string for scan_for_string.\n"); |
|
exit(1); |
|
} |
|
for (i=0; i<n; i++) { |
|
buf[i] = fgetc(fp); buf[i+1]='\0'; |
|
if (buf[i] == EOF) return 0; |
|
} |
|
if (strcmp(s,buf) == 0) return 0; |
|
while ((c=fgetc(fp)) != EOF) { |
|
for (i=0; i<n; i++) { |
|
buf[i] = buf[i+1]; |
|
} |
|
buf[n-1]=c; buf[n] = '\0'; |
|
if (strcmp(s,buf) == 0) return 1; |
|
} |
|
return 0; |
|
} |
|
|
|
int phc_scan_for_string_old(FILE *fp, char str[]) |
|
/* |
|
** Scans the file fp for a certain string str of length lenstr+1. |
|
** Reading stops when the string has been found, then the variable |
|
** on return equals 1, otherwise 0 is returned. |
|
*/ |
|
{ |
|
#define BUF_SIZE 1024 |
|
char buf[BUF_SIZE]; |
char ch; |
char ch; |
int index,i,compare,npaths,dim,found; |
int index,i,compare,npaths,dim,found; |
|
int lenstr; |
|
lenstr = strlen(str); |
|
if (lenstr >= BUF_SIZE-1) { |
|
fprintf(stderr,"Too long string in phc_scan_for_string\n"); |
|
exit(-1); |
|
} |
index = -1; |
index = -1; |
found = 0; |
found = 0; |
while ((fscanf(fp,"%c",&ch)!=EOF) && found == 0) |
while (((ch = fgetc(fp))!=EOF) && found == 0) |
{ |
{ |
if (index == -1 && ch == str[0]) |
if (index == -1 && ch == str[0]) |
{ |
{ |
index = 0; |
index = 0; |
buf[index] = ch; |
buf[index] = ch; |
} |
} |
else |
else |
{ |
{ |
if (index == lenstr) |
if (index == lenstr) |
{ |
{ |
compare = 0; |
compare = 0; |
for (i=0; i<lenstr+1; i++) |
for (i=0; str[i] != '\0'; i++) |
{ |
{ |
if (buf[i]!=str[i]) |
if (buf[i]!=str[i]) |
{ |
{ |
compare = compare+1; |
compare = compare+1; |
} |
} |
} |
} |
if (compare == 0) |
if (compare == 0) |
{ |
{ |
found = 1; |
found = 1; |
} |
} |
index = -1; |
index = -1; |
} |
} |
else |
else |
if (index > -1 && index < lenstr) |
if (index > -1 && index < lenstr) |
{ |
{ |
index = index+1; |
index = index+1; |
buf[index] = ch; |
buf[index] = ch; |
} |
} |
} |
} |
if (found == 1) break; |
if (found == 1) break; |
} |
} |
return found; |
return found; |
Line 183 struct phc_object phc_scan_solutions(FILE *fp, int npa |
|
Line 237 struct phc_object phc_scan_solutions(FILE *fp, int npa |
|
** The tolerance for the residual to a solution is set to 1.0E-12. |
** The tolerance for the residual to a solution is set to 1.0E-12. |
** Returns solutions. |
** Returns solutions. |
*/ |
*/ |
|
#define BUFSIZE 1024 |
{ |
{ |
struct phc_object rob,sob; |
struct phc_object rob,sob; |
char ch; |
char ch; |
int fnd,i,j,nsols; |
int fnd,i,j,nsols; |
float res; |
double res; |
long double realpart; |
double realpart; |
long double imagpart; |
double imagpart; |
long double realparts[npaths][dim]; |
/* double realparts[npaths][dim]; |
long double imagparts[npaths][dim]; |
double imagparts[npaths][dim]; */ |
|
double *realparts; |
|
double *imagparts; |
|
char buf[BUFSIZE]; |
nsols = 0; |
nsols = 0; |
while (fscanf(fp,"%c",&ch)!=EOF) |
realparts = (double *)sGC_malloc(sizeof(double)*npaths*dim+1); |
|
imagparts = (double *)sGC_malloc(sizeof(double)*npaths*dim+1); |
|
while ((ch = fgetc(fp)) != EOF) |
{ |
{ |
fnd = phc_scan_for_string(fp,"start residual :",15); |
fnd = phc_scan_for_string(fp,"start residual :"); |
if (fnd==1) |
if (fnd==1) |
{ |
{ |
fscanf(fp,"%E",&res); |
fscanf(fp,"%le",&res); |
/* printf(" residual = "); printf("%E\n",res); */ |
/* printf(" residual = "); printf("%E\n",res); */ |
if (res < 1.0E-12) nsols = nsols+1; |
if (res < 1.0E-12) { |
fnd = phc_scan_for_string(fp,"the solution for t :",19); |
nsols = nsols+1; |
for (i=0;i<dim;i++) |
if (nsols > npaths) { |
{ |
fprintf(stderr,"Something is wrong in phc_scan_solutions\n"); |
fnd = phc_scan_for_string(fp,":",0); |
fprintf(stderr,"npaths=%d, nsols=%d \n",npaths,nsols); |
fscanf(fp,"%LE",&realpart); |
exit(-1); |
fscanf(fp,"%LE",&imagpart); |
} |
if (res < 1.0E-12) |
} |
{ |
fnd = phc_scan_for_string(fp,"the solution for t :"); |
realparts[nsols-1][i] = realpart; |
for (i=0;i<dim;i++) |
imagparts[nsols-1][i] = imagpart; |
{ |
} |
fnd = phc_scan_for_string(fp,":"); |
} |
fgets(buf,BUFSIZE-1,fp); |
} |
sscanf(buf,"%le %le",&realpart,&imagpart); |
|
if (phc_verbose) fprintf(stderr,"sols in string: %s\n",buf); |
|
/*fscanf(fp,"%le",&realpart); |
|
fscanf(fp,"%le",&imagpart);*/ |
|
if (res < 1.0E-12) |
|
{ |
|
/*realparts[nsols-1][i] = realpart; |
|
imagparts[nsols-1][i] = imagpart;*/ |
|
realparts[(nsols-1)*npaths+i] = realpart; |
|
imagparts[(nsols-1)*npaths+i] = imagpart; |
|
} |
|
} |
|
} |
} |
} |
if(phc_verbose) fprintf(stderr," number of solutions = %i\n",nsols); |
if(phc_verbose) fprintf(stderr," number of solutions = %i\n",nsols); |
rob = phc_newObjectArray(nsols); |
rob = phc_newObjectArray(nsols); |
Line 222 struct phc_object phc_scan_solutions(FILE *fp, int npa |
|
Line 294 struct phc_object phc_scan_solutions(FILE *fp, int npa |
|
/* fprintf(stderr,"Solution %i :\n",i+1); */ |
/* fprintf(stderr,"Solution %i :\n",i+1); */ |
sob = phc_newObjectArray(dim); |
sob = phc_newObjectArray(dim); |
for (j=0;j<dim;j++) |
for (j=0;j<dim;j++) |
{ |
{ |
/* |
/* |
printf("%20.14LE",realparts[i][j]); printf(" "); |
printf("%20.14le",realparts[i][j]); printf(" "); |
printf("%20.14LE",imagparts[i][j]); printf("\n"); |
printf("%20.14le",imagparts[i][j]); printf("\n"); |
*/ |
*/ |
phc_putoa(sob,j,phc_complexTo(realparts[i][j],imagparts[i][j])); |
|
} |
printf("%20.14le",realparts[i*npaths+j]); printf(" "); |
|
printf("%20.14le",imagparts[i*npaths+j]); printf("\n"); |
|
|
|
/*phc_putoa(sob,j,phc_complexTo(realparts[i][j],imagparts[i][j]));*/ |
|
phc_putoa(sob,j,phc_complexTo(realparts[i*npaths+j], |
|
imagparts[i*npaths+j])); |
|
} |
phc_putoa(rob,i,sob); |
phc_putoa(rob,i,sob); |
} |
} |
return(rob); |
return(rob); |
Line 244 struct phc_object phc_scan_output_of_phc(char *fname) |
|
Line 322 struct phc_object phc_scan_output_of_phc(char *fname) |
|
char ch; |
char ch; |
int fnd,npaths,dim,i,nsols; |
int fnd,npaths,dim,i,nsols; |
otp = fopen(fname,"r"); |
otp = fopen(fname,"r"); |
|
if (otp == NULL) { |
|
fprintf(stderr,"The file %d is not found.\n",fname); |
|
exit(0); |
|
} |
if (phc_verbose) fprintf(stderr,"Scanning the %s of phc.\n",fname); |
if (phc_verbose) fprintf(stderr,"Scanning the %s of phc.\n",fname); |
fnd = phc_scan_for_string(otp,"THE SOLUTIONS :",14); |
fnd = phc_scan_for_string(otp,"THE SOLUTIONS :"); |
fscanf(otp,"%i",&npaths); |
fscanf(otp,"%i",&npaths); |
if (phc_verbose) fprintf(stderr," number of paths traced = %i\n",npaths); |
if (phc_verbose) fprintf(stderr," number of paths traced = %i\n",npaths); |
fscanf(otp,"%i",&dim); |
fscanf(otp,"%i",&dim); |
Line 290 struct phc_object phc_call_phc(char *sys) /* call phc |
|
Line 372 struct phc_object phc_call_phc(char *sys) /* call phc |
|
|
|
|
|
struct phc_object phc_newObjectArray(size) |
struct phc_object phc_newObjectArray(size) |
int size; |
int size; |
{ |
{ |
struct phc_object rob; |
struct phc_object rob; |
struct phc_object *op; |
struct phc_object *op; |
Line 323 void phc_printObject(FILE *fp,struct phc_object ob) |
|
Line 405 void phc_printObject(FILE *fp,struct phc_object ob) |
|
fprintf(fp,"]"); |
fprintf(fp,"]"); |
}else if (ob.tag == SlongdoubleComplex) { |
}else if (ob.tag == SlongdoubleComplex) { |
/* Try your favorite way to print complex numbers. */ |
/* Try your favorite way to print complex numbers. */ |
/*fprintf(fp,"(%20.14LE)+I*(%20.14LE)",ob.lc.longdouble,ob.rc.longdouble);*/ |
/*fprintf(fp,"(%20.14le)+I*(%20.14le)",ob.lc.longdouble,ob.rc.longdouble);*/ |
fprintf(fp,"[%Lf , %Lf]",ob.lc.longdouble,ob.rc.longdouble); |
fprintf(fp,"[%lf , %lf]",ob.lc.longdouble,ob.rc.longdouble); |
}else{ |
}else{ |
fprintf(stderr,"Unknown phc_object tag %d",ob.tag); |
fprintf(stderr,"Unknown phc_object tag %d",ob.tag); |
} |
} |
Line 355 char *phc_which(char *s) { |
|
Line 437 char *phc_which(char *s) { |
|
a = getenv("OpenXM_HOME"); |
a = getenv("OpenXM_HOME"); |
if (a != NULL) { |
if (a != NULL) { |
cmd = (char *) sGC_malloc(sizeof(char)*(strlen(s)+strlen(a) |
cmd = (char *) sGC_malloc(sizeof(char)*(strlen(s)+strlen(a) |
+strlen("/usr/local/bin/")+1)); |
+strlen("/usr/local/bin/")+1)); |
if (cmd == NULL) {fprintf(stderr,"No more memory.\n"); exit(1);} |
if (cmd == NULL) {fprintf(stderr,"No more memory.\n"); exit(1);} |
strcpy(cmd,a); strcat(cmd,"/bin/"); strcat(cmd,s); |
strcpy(cmd,a); strcat(cmd,"/bin/"); strcat(cmd,s); |
if (stat(cmd,&statbuf) == 0) { |
if (stat(cmd,&statbuf) == 0) { |
Line 363 char *phc_which(char *s) { |
|
Line 445 char *phc_which(char *s) { |
|
} |
} |
} |
} |
cmd = (char *) sGC_malloc(sizeof(char)*(strlen(s) |
cmd = (char *) sGC_malloc(sizeof(char)*(strlen(s) |
+strlen("/usr/local/bin/")+1)); |
+strlen("/usr/local/bin/")+1)); |
if (cmd == NULL) {fprintf(stderr,"No more memory.\n"); exit(1);} |
if (cmd == NULL) {fprintf(stderr,"No more memory.\n"); exit(1);} |
strcpy(cmd,"/usr/local/bin/"); strcat(cmd,s); |
strcpy(cmd,"/usr/local/bin/"); strcat(cmd,s); |
if (stat(cmd,&statbuf) == 0) { |
if (stat(cmd,&statbuf) == 0) { |
Line 377 char *phc_which(char *s) { |
|
Line 459 char *phc_which(char *s) { |
|
} |
} |
|
|
|
|
struct phc_object phc_complexTo(long double r, long double i) |
struct phc_object phc_complexTo(double r, double i) |
{ |
{ |
struct phc_object rob; |
struct phc_object rob; |
rob.tag = SlongdoubleComplex; |
rob.tag = SlongdoubleComplex; |