#include #include #include //for multithreading #include #include #include //getLine #include "misc.h" #define DOUBLEMODE 0 #define DOUBLEERRORMODE 1 #define RATIOMODE 2 #ifndef MODE #define MODE DOUBLEMODE #endif #define NUM_THREADS 6 #if MODE == DOUBLEERRORMODE #include "double-error.h" #define VALUETYPE double_error #define EXPTYPE double_error #elif MODE == RATIOMODE #include "ratio.h" #define VALUETYPE rational #define EXPTYPE unsigned int #else #include "double.h" #define VALUETYPE double #define EXPTYPE double #endif /*maximum length of the support of f*/ static const int N=24; /*maximal order of derivative*/ static const int K=24; /*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){ VALUETYPE df0[D]; /*Set zeroth derivative to be f.*/ for(int i=0; i= powd){ s += powd; d++; } else { int t = i-s+1; /*Set f to the values encoded in bit string t which is a value between 1 and powd = (1<> n) & 1); return d; } } return -1; } int generate_triangle(VALUETYPE* f, int i){ int j = i+1; if(j <= N/2){ for(int n=0; n < N; n++) f[n] = int_to_valuetype(0); for(int n=0; n < j; n++) f[n] = int_to_valuetype(j-n); for(int n=1; n < j; n++) f[N-n] = int_to_valuetype(j-n); return N; } else return -1; } /*Writes into f the values of the function indexed by i. Returns the size of the support of f, or -1 if there is no function with that index.*/ int generate_function(VALUETYPE* f, int i){ return generate_each_charf(f,i); //return generate_triangle(f,i); } void format_result(char* s, EXPTYPE p, int D, int index, int k, VALUETYPE r){ VALUETYPE f[N]; int d = generate_function(f,index); sprintf(s,"f: "); int l = 3; for(int i=0; i=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) ; } bool compute(EXPTYPE p, int D, VALUETYPE* f, int index, VALUETYPE* records_ratio, int* records_index){ VALUETYPE Mf[N]; /*This is the only O(D^2) operation in here so makes a lot of sense to only compute once and avoid repeating it.*/ compute_maximalfunction(f,Mf,D); /*Allocate memory for derivatives.*/ VALUETYPE df[2][N]; VALUETYPE dMf[2][N]; for(int i=0; i<=1; i++){ for(int n=0; n=1){ /*Compute kth derivative of f and Mf from (k-1)th derivative*/ differentiate(df[(k+1)%2],df[k%2],D,1); differentiate(dMf[(k+1)%2],dMf[k%2],D,1); } /*Print derivatives*/ /* for(int k=0; k<=K; k++){ printf("f %d: ",k); for(int i=0; i num_thread; VALUETYPE* records_ratio = args -> records_ratio; int* records_index = args -> records_index; int* domain_current = args -> domain_current; /*exponent p of the L^p norm to consider*/ EXPTYPE p = int_to_exptype(1); VALUETYPE f[N]; int d = generate_function(f,i); while(d >= 0){ if(d > *domain_current){ *domain_current = d; printf("Start considering length: %d\n",d); } compute(p,d,f,i,records_ratio,records_index); i += NUM_THREADS; d = generate_function(f,i); } } int main() { pthread_t threads[NUM_THREADS]; Args args[NUM_THREADS]; VALUETYPE records_ratio[K+1]; int records_index[K+1]; int domain_current = 0; for(int k=0; k<=K; k++) records_ratio[k] = int_to_valuetype(0); int result_code; for (int i = 0; i < NUM_THREADS; i++) { printf("In main: Creating thread %d.\n", i); args[i].records_ratio = records_ratio; args[i].records_index = records_index; args[i].num_thread = i; args[i].domain_current = &domain_current; result_code = pthread_create(&threads[i], NULL, compute_chunk, args+i); } size_t sz = 1024; char prmpt[] = "To exit enter q,quit or exit.\nTo print current records to terminal enter r.\nTo print current records to a file enter p.\nTo do so with tex formatting enter t.\n"; char buff[sz]; bool cont = true; do { getLine(prmpt, buff, sz); if( 0 == strcmp(buff,"q") || 0 == strcmp(buff,"quit") || 0 == strcmp(buff,"exit") ) exit(EXIT_SUCCESS); } while(cont); // wait for each thread to complete for (int i = 0; i < NUM_THREADS; i++) { result_code = pthread_join(threads[i], NULL); printf("In main: Thread %d has ended.\n", i); } return 0; }