summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--charf.c129
1 files changed, 79 insertions, 50 deletions
diff --git a/charf.c b/charf.c
index 7f4f2af..bb8720f 100644
--- a/charf.c
+++ b/charf.c
@@ -33,10 +33,13 @@
#endif
/*maximum length of the support of f*/
-static const int N=24;
+#define N 24
/*maximal order of derivative*/
-static const int K=24;
+#define K 24
+
+/*maximal number of exponents*/
+#define P 1
/*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){
@@ -159,23 +162,28 @@ int generate_function(VALUETYPE* f, int i){
//return generate_triangle(f,i);
}
-void format_result(char* s, EXPTYPE p, int D, int index, int k, VALUETYPE r){
+void format_result(char* s, int index, int k, EXPTYPE p, VALUETYPE r){
VALUETYPE f[N];
int d = generate_function(f,index);
sprintf(s,"f: ");
int l = 3;
- for(int i=0; i<D; i++) l += sprintf(s+l,"%2.0f ",to_double(f[i]));
- for(int i=D; i<N; i++) l += sprintf(s+l," ");
+ for(int i=0; i<d; i++) l += sprintf(s+l,"%2.0f ",to_double(f[i]));
+ for(int i=d; i<N; i++) l += sprintf(s+l," ");
char rts[128];
root_to_string(rts,r,p);
- l += sprintf(s+l,"%dth der.: %s\n",k,rts);
+ l += sprintf(s+l,"%dth der.: %s",k,rts);
}
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) ;
}
-bool compute(EXPTYPE p, int D, VALUETYPE* f, int index, VALUETYPE* records_ratio, int* records_index){
+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]){
+ VALUETYPE f[N];
+ int D = generate_function(f,index);
+ /*Immediately abort if index is out of bounds.*/
+ if(D <= 0) return D;
+
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);
@@ -199,93 +207,112 @@ bool compute(EXPTYPE p, int D, VALUETYPE* f, int index, VALUETYPE* records_ratio
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<D; i++) printf("%+0.1f ",df[k][i]);
- printf("\n");
- printf("Mf %d: ",k);
- for(int i=0; i<D; i++) printf("%+0.1f ",dMf[k][i]);
- printf("\n");
- }
- */
+ for(int p=0; p<num_exponents[k]; p++){
+ /*Print derivatives*/
+ /*
+ for(int k=0; k<=K; k++){
+ printf("f %d: ",k);
+ for(int i=0; i<D; i++) printf("%+0.1f ",df[k][i]);
+ printf("\n");
+ printf("Mf %d: ",k);
+ for(int i=0; i<D; i++) printf("%+0.1f ",dMf[k][i]);
+ printf("\n");
+ }
+ */
- /*Compute L^p norm of derivatives*/
- VALUETYPE intdfp = integratep(df[k%2],p,D);
- VALUETYPE intdMfp = integratep(dMf[k%2],p,D);
+ /*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);
- //printf("%d: %f / %f = %f\n",k,intdMfp[k],intdfp[k],intdMfp[k]/intdfp[k]);
+ //printf("%d: %f / %f = %f\n",k,intdMfp[k],intdfp[k],intdMfp[k]/intdfp[k]);
- /*Compute ||Mf^{(k)}||_p/||f^{(k)}||_p.*/
+ /*Compute ||Mf^{(k)}||_p/||f^{(k)}||_p.*/
- VALUETYPE r = ratio(intdMfp, intdfp);
+ VALUETYPE r = ratio(intdMfp, intdfp);
- if(
- //over_threshold_charf(to_double(r),k) &&
- is_greater_possibly(r,records_ratio[k])){
- /*extra check for printing only because in error mode for some reason floats randomly seem to increase by tiny amounts*/
- if(is_greater_certainly(r,records_ratio[k])){
- records_index[k] = index;
- char s[1024];
- format_result(s, p, D, index, k, r);
- printf("%s",s);
+ if(
+ //over_threshold_charf(to_double(r),k) &&
+ is_greater_possibly(r,(*records_ratio)[k][p])){
+ /*extra check for printing only because in error mode for some reason floats randomly seem to increase by tiny amounts*/
+ 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);
+ printf("%s\n",s);
+ }
+ (*records_ratio)[k][p] = maximum((*records_ratio)[k][p],r);
}
- records_ratio[k] = maximum(records_ratio[k],r);
}
}
+ return D;
+}
+
+void print_records(int num_exponents[K+1], EXPTYPE exponents[K+1][P], VALUETYPE ratios[K+1][P], int indeces[K+1][P]){
+ char s[1024];
+ printf("Current records:\n");
+ 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]);
+ printf("%s\n",s);
+ }
}
-typedef struct { VALUETYPE* records_ratio; int* records_index; int num_thread; int* domain_current; } Args;
+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; } Args;
/*Goes through all functions indexed by those numbers which equal the thread number module NUM_THREADS.*/
void* compute_chunk(void* arguments){
Args* args = arguments;
int i = args -> 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);
+ int d = 0;
while(d >= 0){
+ d = compute(i, args -> num_exponents, args -> exponents, args -> records_ratio, args -> records_index);
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() {
+ 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);
+ }
+
pthread_t threads[NUM_THREADS];
Args args[NUM_THREADS];
- VALUETYPE records_ratio[K+1];
- int records_index[K+1];
+ 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);
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;
+ 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;
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 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);
+ if( 0 == strcmp(buff,"q") || 0 == strcmp(buff,"quit") || 0 == strcmp(buff,"exit") ){
+ print_records(num_exponents,exponents,records_ratio,records_index);
+ exit(EXIT_SUCCESS);
+ }
+ else if( 0 == strcmp(buff,"r")) print_records(num_exponents,exponents,records_ratio,records_index);
} while(cont);
// wait for each thread to complete
@@ -294,5 +321,7 @@ int main() {
printf("In main: Thread %d has ended.\n", i);
}
+ print_records(num_exponents,exponents,records_ratio,records_index);
+
return 0;
}