diff options
Diffstat (limited to 'charf.c')
| -rw-r--r-- | charf.c | 117 |
1 files changed, 71 insertions, 46 deletions
@@ -41,7 +41,7 @@ #define K 24 /*maximal number of exponents*/ -#define P 1 +#define P 2 /*given function df[0] on domain [0,M-1], compute derivatives f' until f^{(K)} and store f^{(K)} in df*/ void differentiate(VALUETYPE* f, VALUETYPE* df, int D, int k){ @@ -182,7 +182,7 @@ void format_result(char* s, int index, int k, EXPTYPE p, VALUETYPE r, int format int l = 0; char v[128]; root_to_latex(v,r,p); - l += sprintf(s+l,"$%d$ & $\\frac1{%1.0f}$ & %s",k,exptype_to_double(p),v); + l += sprintf(s+l,"$%d$ & %s",k,v); for(int i=0; i<d; i++){ valuetype_to_latex(v,f[i]); l += sprintf(s+l,"& %s ",v); @@ -195,7 +195,7 @@ bool over_threshold_charf(double t, int k){ return (k==1 && t>=1) || (k==2 && t>=.5) || (k==3 && t>.53) || (k==4 && t>=.5) || (k==5 && t>=.58) || (k==6 && t>=.58) || (k==7 && t>=.69) || (k==8 && t>=.83) || (k==9 && t>=.8699) || (k==10 && t>=.919) || (k==11 && t>=.97) || (k==12 && t>=.97) || (k==13 && t>=.98) || (k==14 && t>=.98) || (k==15 && t>=.9817) || (k==16 && t>=.9817) || (k==17 && t>=.987) || (k==18 && t>=.991) || (k==19 && t>=.994) || (k==20 && t>=1.001) || (k==21 && t>=1.009) || (k==22 && t>=1.009) || (k==23 && t>=1.003) || (k==24 && t>=1.174) ; } -int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE (*records_ratio)[K+1][P], int (*records_index)[K+1][P]){ +int compute(int index, EXPTYPE exponents[P], VALUETYPE (*records_ratio)[K+1][P], int (*records_index)[K+1][P]){ VALUETYPE f[N]; int D = generate_function(f,index); /*Immediately abort if index is out of bounds.*/ @@ -224,7 +224,7 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET differentiate(dMf[(k+1)%2],dMf[k%2],D,1); } - for(int p=0; p<num_exponents[k]; p++){ + for(int p=0; p<P; p++){ /*Print derivatives*/ /* for(int k=0; k<=K; k++){ @@ -238,8 +238,8 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET */ /*Compute L^p norm of derivatives*/ - VALUETYPE intdfp = integratep(df[k%2],exponents[k][p],D); - VALUETYPE intdMfp = integratep(dMf[k%2],exponents[k][p],D); + VALUETYPE intdfp = integratep(df[k%2],exponents[p],D); + VALUETYPE intdMfp = integratep(dMf[k%2],exponents[p],D); //printf("%d: %f / %f = %f\n",k,intdMfp[k],intdfp[k],intdMfp[k]/intdfp[k]); @@ -254,7 +254,7 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET if(is_greater_certainly(r,(*records_ratio)[k][p])){ (*records_index)[k][p] = index; char s[1024]; - format_result(s, index, k, exponents[k][p], r, FORMAT_TEXT); + format_result(s, index, k, exponents[p], r, FORMAT_TEXT); printf("%s\n",s); } (*records_ratio)[k][p] = maximum((*records_ratio)[k][p],r); @@ -264,49 +264,78 @@ int compute(int index, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUET return D; } -void format_results(char* text, int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], int format){ +void format_results(char* text, EXPTYPE exponents[P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], int format){ + char beginning[1024]; + char end[1024]; + char beginningp[P][1024]; + char endp[P][1024]; char newline[4]; - if(format == FORMAT_TEXT) strcpy(newline,""); - else if(format == FORMAT_LATEX) strcpy(newline,"\\\\"); + + if(format == FORMAT_TEXT){ + strcpy(beginning,"Current records:"); + strcpy(end,""); + + for(int p=0; p<P; p++){ + sprintf(beginningp[p],"exponent %2.1f:",exptype_to_double(exponents[p])); + strcpy(endp[p],""); + } + + strcpy(newline,""); + } + else if(format == FORMAT_LATEX){ + strcpy(beginning,""); + strcpy(end,""); + + char h[1024]; + strcpy(h,"{cc"); + for(int n=0; n<N; n++) strcat(h,"c"); + strcat(h,"}"); + char f[1024]; + strcpy(f,"$k$ & $r$ & $f$ "); + for(int n=1; n<N; n++) strcat(f,"& "); + strcat(f,"\\\\\n\\hline"); + for(int p=0; p<P; p++){ + sprintf(beginningp[p],"$p=%1.0f$:\n\n\\begin{tabular}%s\n%s",exptype_to_double(exponents[p]),h,f); + strcpy(endp[p],"\\end{tabular}\n"); + } + strcpy(newline,"\\\\"); + } char s[STRING_SIZE]; - int l = 0; - for(int k=0; k<=K; k++) for(int p=0; p<num_exponents[k]; p++){ - format_result(s, indeces[k][p], k, exponents[k][p], ratios[k][p], format); - l += sprintf(text+l,"%s%s\n",s,newline); + int l = sprintf(text, "%s\n", beginning); + for(int p=0; p<P; p++){ + l += sprintf(text+l, "%s\n", beginningp[p]); + for(int k=0; k<=K; k++){ + format_result(s, indeces[k][p], k, exponents[p], ratios[k][p], format); + l += sprintf(text+l,"%s%s\n",s,newline); + } + if(format == FORMAT_LATEX){ + /*Replace last \\ and \n by \n */ + l -= 4; + l += sprintf(text+l,"\n"); + } + l += sprintf(text+l, "%s\n", endp[p]); } - /*Remove last \\ and \n*/ - if(format == FORMAT_LATEX) text[l-4] = '\0'; + l += sprintf(text+l, "%s\n", end); } -void print_records(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){ +void print_records(EXPTYPE exponents[P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){ char s[STRING_SIZE]; - printf("Current records:\n"); - format_results(s, num_exponents, exponents, ratios, indeces, FORMAT_TEXT); + format_results(s, exponents, ratios, indeces, FORMAT_TEXT); printf("%s\n",s); } -void print_latex_records_to_file(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], char* filename){ - char h[1024]; - strcpy(h,"{ccc"); - for(int n=0; n<N; n++) strcat(h,"c"); - strcat(h,"}"); - - char f[1024]; - strcpy(f,"$k$ & $p$ & $r$ & $f$ "); - for(int n=1; n<N; n++) strcat(f,"& "); - strcat(f,"\\\\\n\\hline"); - +void print_latex_records_to_file(EXPTYPE exponents[P], VALUETYPE ratios[K+1][P], int indeces[K+1][P], char* filename){ char s[STRING_SIZE]; - format_results(s, num_exponents, exponents, ratios, indeces, FORMAT_LATEX); + format_results(s, exponents, ratios, indeces, FORMAT_LATEX); FILE *fptr; fptr = fopen(filename, "w"); - fprintf(fptr, "\\begin{tabular}%s\n%s\n%s\n\\end{tabular}",h,f,s); + fprintf(fptr, "%s\n",s); fclose(fptr); } -typedef struct { int num_exponents[K+1]; EXPTYPE exponents[K+1][P]; VALUETYPE (*records_ratio)[K+1][P]; int (*records_index)[K+1][P]; int num_thread; int* domain_current; int* cont; } Args; +typedef struct { EXPTYPE exponents[P]; VALUETYPE (*records_ratio)[K+1][P]; int (*records_index)[K+1][P]; int num_thread; int* domain_current; int* cont; } Args; /*Goes through all functions indexed by those numbers which equal the thread number module NUM_THREADS.*/ void* compute_chunk(void* arguments){ @@ -316,7 +345,7 @@ void* compute_chunk(void* arguments){ VALUETYPE f[N]; int d = 0; while(d >= 0){ - d = compute(i, args -> num_exponents, args -> exponents, args -> records_ratio, args -> records_index); + d = compute(i, args -> exponents, args -> records_ratio, args -> records_index); if(d > *domain_current){ *domain_current = d; printf("Start considering length: %d\n",d); @@ -329,25 +358,21 @@ void* compute_chunk(void* arguments){ int main() { int num_exponents[K+1]; - EXPTYPE exponents[K+1][P]; - for(int k=0; k<=K; k++){ - num_exponents[k] = 1; - exponents[k][0] = int_to_exptype(1); - //exponents[k][1] = int_to_exptype(2); - } + EXPTYPE exponents[P]; + exponents[0] = int_to_exptype(1); + exponents[1] = int_to_exptype(2); pthread_t threads[NUM_THREADS]; Args args[NUM_THREADS]; VALUETYPE records_ratio[K+1][P]; int records_index[K+1][P]; - for(int k=0; k<=K; k++) for(int p=0; p<num_exponents[k]; p++) records_ratio[k][p] = int_to_valuetype(0); + for(int k=0; k<=K; k++) for(int p=0; p<P; p++) records_ratio[k][p] = int_to_valuetype(0); int domain_current = 0; int result_code; int cont = 0; for (int i = 0; i < NUM_THREADS; i++) { printf("In main: Creating thread %d.\n", i); - memcpy(args[i].num_exponents,num_exponents,sizeof num_exponents); memcpy(args[i].exponents,exponents,sizeof exponents); args[i].records_ratio = &records_ratio; args[i].records_index = &records_index; @@ -363,13 +388,13 @@ int main() { do { getLine(prmpt, buff, sz); if( 0 == strcmp(buff,"q") || 0 == strcmp(buff,"quit") || 0 == strcmp(buff,"exit") ){ - print_records(num_exponents,exponents,records_ratio,records_index); + print_records(exponents,records_ratio,records_index); exit(EXIT_SUCCESS); } - else if( 0 == strcmp(buff,"r")) print_records(num_exponents,exponents,records_ratio,records_index); + else if( 0 == strcmp(buff,"r")) print_records(exponents,records_ratio,records_index); else if( 0 == strcmp(buff,"t")){ getLine("Enter file name:\n", buff, sz); - print_latex_records_to_file(num_exponents,exponents,records_ratio,records_index,buff); + print_latex_records_to_file(exponents,records_ratio,records_index,buff); } } while(cont < NUM_THREADS); @@ -379,7 +404,7 @@ int main() { printf("In main: Thread %d has ended.\n", i); } - print_records(num_exponents,exponents,records_ratio,records_index); + print_records(exponents,records_ratio,records_index); return 0; } |
