/*writes properties of the current run related to implementation and command line choices*/ herr_t /*hdf5 error*/ append_meta_properties(hdf5block_t *h5block,/*hdf5 file ids*/ double *seed,/*random number seed*/ size_t *BurnInSampleSize, /*tuning iterations*/ char *h5file, /*name of hdf5 file containing the experimental data and prior set-up*/ char *lib_base)/*basename of the library file @code .so@ file*/{ herr_t status; int omp_n,omp_np,i; status&=H5LTset_attribute_double(h5block->file_id, "LogParameters", "seed", seed, 1); status&=H5LTset_attribute_ulong(h5block->file_id, "LogParameters", "BurnIn", BurnInSampleSize, 1); status&=H5LTset_attribute_string(h5block->file_id, "LogParameters", "DataFrom", h5file); status&=H5LTmake_dataset_string(h5block->file_id,"Model",lib_base); // here we make a short test to see what the automatic choice of the // number of threads turns out to be. #pragma omp parallel private(omp_n,omp_np) reduction(+:i) { i=1; omp_n=omp_get_num_threads(); omp_np=omp_get_num_procs(); } if (i!=omp_n){ fprintf(stderr,"[append_meta_properties] warning: finding out number of threads possibly failed reduction of (n×1: %i) != get_num_threads():%i.\n",i,omp_n); } else { h5block->size[0]=1; h5block->size[1]=1; status&=H5LTmake_dataset_int(h5block->file_id,"OMP_NUM_THREADS",1,h5block->size,&omp_n); status&=H5LTmake_dataset_int(h5block->file_id,"OMP_NUM_PROCS",1,h5block->size,&omp_np); } return status; }
static herr_t make_attributes( hid_t loc_id, const char* obj_name ) { int rank_out; hsize_t *dims_out = 0; H5T_class_t type_class; size_t type_size; int i; char attr_str_in[] = {"My attribute"}; char attr_str_out[20]; char attr_char_in[5] = {1,2,3,4,5}; char attr_char_out[5]; short attr_short_in[5] = {1,2,3,4,5}; short attr_short_out[5]; int attr_int_in[5] = {1,2,3,4,5}; int attr_int_out[5]; long attr_long_in[5] = {1,2,3,4,5}; long attr_long_out[5]; float attr_float_in[5] = {1,2,3,4,5}; float attr_float_out[5]; double attr_double_in[5] = {1,2,3,4,5}; double attr_double_out[5]; unsigned char attr_uchar_in[5] = {1,2,3,4,5}; unsigned char attr_uchar_out[5]; unsigned short attr_ushort_in[5] = {1,2,3,4,5}; unsigned short attr_ushort_out[5]; unsigned int attr_uint_in[5] = {1,2,3,4,5}; unsigned int attr_uint_out[5]; unsigned long attr_ulong_in[5] = {1,2,3,4,5}; unsigned long attr_ulong_out[5]; /*------------------------------------------------------------------------- * H5LTset_attribute_string test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_string"); /* Set the attribute */ if ( H5LTset_attribute_string( loc_id, obj_name, ATTR1_NAME, attr_str_in ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_string test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_string"); /* Get the attribute */ if ( H5LTget_attribute_string( loc_id, obj_name, ATTR1_NAME, attr_str_out ) < 0 ) return -1; if ( strcmp( attr_str_in, attr_str_out ) != 0 ) { return -1; } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_char test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_char"); /* Set the attribute */ if ( H5LTset_attribute_char( loc_id, obj_name, ATTR2_NAME, attr_char_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_char test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_char"); /* Get the attribute */ if ( H5LTget_attribute_char( loc_id, obj_name, ATTR2_NAME, attr_char_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_char_in[i] != attr_char_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR2_NAME, H5T_NATIVE_CHAR, attr_char_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_char_in[i] != attr_char_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_short test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_short"); /* Set the attribute */ if ( H5LTset_attribute_short( loc_id, obj_name, ATTR3_NAME, attr_short_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_short test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_short"); /* Get the attribute */ if ( H5LTget_attribute_short( loc_id, obj_name, ATTR3_NAME, attr_short_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_short_in[i] != attr_short_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR3_NAME, H5T_NATIVE_SHORT, attr_short_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_short_in[i] != attr_short_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_int test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_int"); /* Set the attribute */ if ( H5LTset_attribute_int( loc_id, obj_name, ATTR4_NAME, attr_int_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_int test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_int"); /* Get the attribute */ if ( H5LTget_attribute_int( loc_id, obj_name, ATTR4_NAME, attr_int_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_int_in[i] != attr_int_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR4_NAME, H5T_NATIVE_INT, attr_int_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_int_in[i] != attr_int_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_long test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_long"); /* Set the attribute */ if ( H5LTset_attribute_long( loc_id, obj_name, ATTR5_NAME, attr_long_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_long test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_long"); /* Get the attribute */ if ( H5LTget_attribute_long( loc_id, obj_name, ATTR5_NAME, attr_long_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_long_in[i] != attr_long_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR5_NAME, H5T_NATIVE_LONG, attr_long_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_long_in[i] != attr_long_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_uchar test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_uchar"); /* Set the attribute */ if ( H5LTset_attribute_uchar( loc_id, obj_name, ATTR6_NAME, attr_uchar_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_uchar test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_uchar"); /* Get the attribute */ if ( H5LTget_attribute_uchar( loc_id, obj_name, ATTR6_NAME, attr_uchar_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_uchar_in[i] != attr_uchar_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR6_NAME, H5T_NATIVE_UCHAR, attr_uchar_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_uchar_in[i] != attr_uchar_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_ushort test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_ushort"); /* Set the attribute */ if ( H5LTset_attribute_ushort( loc_id, obj_name, ATTR7_NAME, attr_ushort_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_ushort test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_ushort"); /* Get the attribute */ if ( H5LTget_attribute_ushort( loc_id, obj_name, ATTR7_NAME, attr_ushort_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_ushort_in[i] != attr_ushort_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR7_NAME, H5T_NATIVE_USHORT, attr_ushort_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_ushort_in[i] != attr_ushort_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_int test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_uint"); /* Set the attribute */ if ( H5LTset_attribute_uint( loc_id, obj_name, ATTR8_NAME, attr_uint_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_int test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_uint"); /* Get the attribute */ if ( H5LTget_attribute_uint( loc_id, obj_name, ATTR8_NAME, attr_uint_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_uint_in[i] != attr_uint_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR8_NAME, H5T_NATIVE_UINT, attr_uint_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_uint_in[i] != attr_uint_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_ulong test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_ulong"); /* Set the attribute */ if ( H5LTset_attribute_ulong( loc_id, obj_name, ATTR9_NAME, attr_ulong_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_long test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_ulong"); /* Get the attribute */ if ( H5LTget_attribute_ulong( loc_id, obj_name, ATTR9_NAME, attr_ulong_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_ulong_in[i] != attr_ulong_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR9_NAME, H5T_NATIVE_ULONG, attr_ulong_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_ulong_in[i] != attr_ulong_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_float test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_float"); /* Set the attribute */ if ( H5LTset_attribute_float( loc_id, obj_name, ATTR10_NAME, attr_float_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_float test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_float"); /* Get the attribute */ if ( H5LTget_attribute_float( loc_id, obj_name, ATTR10_NAME, attr_float_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_float_in[i] != attr_float_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR10_NAME, H5T_NATIVE_FLOAT, attr_float_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_float_in[i] != attr_float_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTset_attribute_double test *------------------------------------------------------------------------- */ TESTING("H5LTset_attribute_double"); /* Set the attribute */ if ( H5LTset_attribute_double( loc_id, obj_name, ATTR11_NAME, attr_double_in, (size_t)5 ) < 0 ) return -1; PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_double test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_double"); /* Get the attribute */ if ( H5LTget_attribute_double( loc_id, obj_name, ATTR11_NAME, attr_double_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_double_in[i] != attr_double_out[i] ) { return -1; } } /* Get the attribute */ if ( H5LTget_attribute( loc_id, obj_name, ATTR11_NAME, H5T_NATIVE_DOUBLE, attr_double_out ) < 0 ) return -1; for (i = 0; i < 5; i++) { if ( attr_double_in[i] != attr_double_out[i] ) { return -1; } } PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_ndims test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_ndims"); if ( H5LTget_attribute_ndims( loc_id, obj_name, ATTR2_NAME, &rank_out ) < 0 ) return -1; if ( rank_out != 1 ) { return -1; } PASSED(); /*------------------------------------------------------------------------- * H5LTget_attribute_info test *------------------------------------------------------------------------- */ TESTING("H5LTget_attribute_info"); dims_out = (hsize_t*) malloc( sizeof(hsize_t) * rank_out ); if ( H5LTget_attribute_info( loc_id, obj_name, ATTR2_NAME, dims_out, &type_class, &type_size) < 0 ) return -1; for (i = 0; i < rank_out; i++) { if ( dims_out[i] != 5 ) { return -1; } } if ( type_class != H5T_INTEGER ) { return -1; } if ( dims_out ) free( dims_out ); PASSED(); return 0; }
/*main mcmc loop, records sampled values, performs no tuning of the step size.*/ int /*always returns success*/ mcmc_foreach(int rank, /*MPI rank*/ int R, /*MPI Comm size*/ size_t SampleSize, /*number of iterations of MCMC*/ ode_model_parameters *omp, /*ODE problem cpecification and pre-allocated space*/ mcmc_kernel *kernel, /* MCMC kernel sturct, holds MCMC-algorithm's parameters*/ hdf5block_t *h5block, /*defines the hdf5 file to write into, holds ids and sizes*/ void *buffer, /* for MPI communication, similar to kernel*/ main_options *option)/*options from defaults, files and command line*/{ clock_t ct=clock(); gsl_matrix *log_para_chunk; gsl_vector *log_post_chunk; int D=get_number_of_MCMC_variables(omp); log_para_chunk=gsl_matrix_alloc(CHUNK,D); log_post_chunk=gsl_vector_alloc(CHUNK); gsl_vector_view current; gsl_vector_view x_state; int swaps = 0; // swap success counter int acc=no; // acceptance flag int acc_c=0; // acceptance counter double acc_rate=0.0; size_t it; int master=no; int DEST; double beta=mcmc_get_beta(kernel); herr_t status; int resume_EC; int last_chunk=no, not_written_yet=yes; for (it = 0; it < SampleSize; it++) { mcmc_sample(kernel, &acc); last_chunk=SampleSize-it<CHUNK; if (acc && last_chunk && not_written_yet){ resume_EC=write_resume_state(option->resume_file, rank, R, kernel); if (resume_EC==EXIT_SUCCESS){ not_written_yet=no; } } acc_c += acc; master=(it%2==rank%2); if (master){ DEST=(rank+1)%R; // this process is the master process for swap decisions } else { DEST=(R+rank-1)%R; // this process has to accept swap decisions from DEST } //their_beta=BETA(DEST,R); // the other proc's if (R>1){ mcmc_exchange_information(kernel,DEST,buffer); swaps+=mcmc_swap_chains(kernel,master,rank,DEST,buffer); } /* save sampled point for writing */ current=gsl_matrix_row(log_para_chunk,it%CHUNK); x_state=gsl_vector_view_array(kernel->x,D); gsl_vector_memcpy(&(current.vector),&(x_state.vector)); gsl_vector_set(log_post_chunk,it%CHUNK,kernel->fx[0]); /* print sample log and statistics every 100 samples */ if ( ((it + 1) % CHUNK) == 0 ) { acc_rate = ((double) acc_c) / ((double) CHUNK); fprintf(stdout, "# [rank % 2i/% 2i; β=%5f; %3li%% done] (it %5li)\tacc. rate: %3.2f;\t%3i %% swap success\t",rank,R,beta,(100*it)/SampleSize,it,acc_rate,swaps); mcmc_print_stats(kernel, stdout); acc_c = 0; // print chunk to hdf5 file status=h5write_current_chunk(h5block,log_para_chunk,log_post_chunk); h5block->offset[0]=it+1; swaps=0; } } assert(status==0); // write remaining data to the output hdf5 file int Rest=SampleSize % CHUNK; printf("[main] last iteration done %i points remain to write.\n",Rest); if (Rest > 0){ h5block->chunk_size[0]=Rest; h5block->chunk_size[1]=D; h5block->para_chunk_id=H5Screate_simple(2, h5block->chunk_size, NULL); h5block->chunk_size[0]=Rest; h5block->chunk_size[1]=1; h5block->post_chunk_id=H5Screate_simple(2, h5block->chunk_size, NULL); printf("[main] writing the remaining %i sampled parametrisations to file.\n",Rest); h5block->block[0]=Rest; h5block->block[1]=D; display_chunk_properties(h5block); status = H5Sselect_hyperslab(h5block->para_dataspace_id, H5S_SELECT_SET, h5block->offset, h5block->stride, h5block->count, h5block->block); H5Dwrite(h5block->parameter_set_id, H5T_NATIVE_DOUBLE, h5block->para_chunk_id, h5block->para_dataspace_id, H5P_DEFAULT, log_para_chunk->data); h5block->block[1]=1; printf("[main] writing their %i log-posterior values to file.\n",Rest); display_chunk_properties(h5block); status &= H5Sselect_hyperslab(h5block->post_dataspace_id, H5S_SELECT_SET, h5block->offset, h5block->stride, h5block->count, h5block->block); H5Dwrite(h5block->posterior_set_id, H5T_NATIVE_DOUBLE, h5block->post_chunk_id, h5block->post_dataspace_id, H5P_DEFAULT, log_post_chunk->data); assert(status>=0); } // annotate written sample with all necessary information //printf("[main] writing some annotation about the sampled points as hdf5 attributes.\n"); status&=H5LTset_attribute_int(h5block->file_id, "LogParameters", "MPI_RANK", &rank, 1); status&=H5LTset_attribute_ulong(h5block->file_id, "LogParameters", "SampleSize", &SampleSize, 1); status&=H5LTset_attribute_double(h5block->file_id, "LogParameters", "InverseTemperature_Beta", &beta, 1); ct=clock()-ct; double sampling_time=((double) ct)/((double) CLOCKS_PER_SEC); int ts=round(sampling_time); int hms[3]; // hours, minutes, seconds hms[0]=ts/3600; hms[1]=(ts%3600)/60; hms[2]=(ts%60); printf("# computation time spend sampling: %i:%i:%i\n",hms[0],hms[1],hms[2]); h5block->size[0]=1; status&=H5LTmake_dataset_double (h5block->file_id, "SamplingTime_s", 1, h5block->size, &sampling_time); h5block->size[0]=3; status&=H5LTmake_dataset_int(h5block->file_id, "SamplingTime_hms", 1, h5block->size, hms); if(status){ printf("[rank %i] statistics written to file.\n",rank); } return EXIT_SUCCESS; }