|
SHOGUN v0.9.3
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 2010 Soeren Sonnenburg 00008 * Copyright (C) 2010 Berlin Institute of Technology 00009 */ 00010 00011 #include <shogun/lib/config.h> 00012 00013 #ifdef HAVE_HDF5 00014 #include <stdio.h> 00015 #include <stdlib.h> 00016 #include <string.h> 00017 #include <hdf5.h> 00018 00019 #include "lib/HDF5File.h" 00020 00021 #include "features/StringFeatures.h" 00022 #include "features/SparseFeatures.h" 00023 00024 using namespace shogun; 00025 00026 CHDF5File::CHDF5File(char* fname, char rw, const char* name) : CFile() 00027 { 00028 get_boolean_type(); 00029 H5Eset_auto(NULL, NULL); 00030 00031 if (name) 00032 set_variable_name(name); 00033 00034 switch (rw) 00035 { 00036 case 'r': 00037 h5file = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT); 00038 break; 00039 case 'w': 00040 h5file = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); 00041 break; 00042 case 'a': 00043 h5file = H5Fopen(fname, H5F_ACC_RDWR, H5P_DEFAULT); 00044 if (h5file <0) 00045 h5file = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); 00046 break; 00047 default: 00048 SG_ERROR("unknown mode '%c'\n", rw); 00049 }; 00050 00051 if (h5file<0) 00052 SG_ERROR("Could not open file '%s'\n", fname); 00053 } 00054 00055 CHDF5File::~CHDF5File() 00056 { 00057 H5Fclose(h5file); 00058 } 00059 00060 #define GET_VECTOR(fname, sg_type, datatype) \ 00061 void CHDF5File::fname(sg_type*& vec, int32_t& len) \ 00062 { \ 00063 if (!h5file) \ 00064 SG_ERROR("File invalid.\n"); \ 00065 \ 00066 int32_t* dims; \ 00067 int32_t ndims; \ 00068 int64_t nelements; \ 00069 hid_t dataset = H5Dopen(h5file, variable_name); \ 00070 if (dataset<0) \ 00071 SG_ERROR("Error opening data set\n"); \ 00072 hid_t dtype = H5Dget_type(dataset); \ 00073 H5T_class_t t_class=H5Tget_class(dtype); \ 00074 hid_t h5_type=get_compatible_type(t_class, datatype); \ 00075 if (h5_type==-1) \ 00076 { \ 00077 H5Dclose(dataset); \ 00078 SG_INFO("No compatible datatype found\n"); \ 00079 } \ 00080 get_dims(dataset, dims, ndims, nelements); \ 00081 if (ndims!=1 || dims[0]!=nelements) \ 00082 SG_ERROR("Error not a 1-dimensional vector\n"); \ 00083 vec=new sg_type[nelements]; \ 00084 len=nelements; \ 00085 herr_t status = H5Dread(dataset, h5_type, H5S_ALL, \ 00086 H5S_ALL, H5P_DEFAULT, vec); \ 00087 H5Dclose(dataset); \ 00088 H5Tclose(dtype); \ 00089 delete[] dims; \ 00090 if (status<0) \ 00091 { \ 00092 delete[] vec; \ 00093 SG_ERROR("Error reading dataset\n"); \ 00094 } \ 00095 } 00096 00097 GET_VECTOR(get_bool_vector, bool, DT_VECTOR_BOOL) 00098 GET_VECTOR(get_byte_vector, uint8_t, DT_VECTOR_BYTE) 00099 GET_VECTOR(get_char_vector, char, DT_VECTOR_CHAR) 00100 GET_VECTOR(get_int_vector, int32_t, DT_VECTOR_INT) 00101 GET_VECTOR(get_shortreal_vector, float32_t, DT_VECTOR_SHORTREAL) 00102 GET_VECTOR(get_real_vector, float64_t, DT_VECTOR_REAL) 00103 GET_VECTOR(get_short_vector, int16_t, DT_VECTOR_SHORT) 00104 GET_VECTOR(get_word_vector, uint16_t, DT_VECTOR_WORD) 00105 #undef GET_VECTOR 00106 00107 #define GET_MATRIX(fname, sg_type, datatype) \ 00108 void CHDF5File::fname(sg_type*& matrix, int32_t& num_feat, int32_t& num_vec) \ 00109 { \ 00110 if (!h5file) \ 00111 SG_ERROR("File invalid.\n"); \ 00112 \ 00113 int32_t* dims; \ 00114 int32_t ndims; \ 00115 int64_t nelements; \ 00116 hid_t dataset = H5Dopen(h5file, variable_name); \ 00117 if (dataset<0) \ 00118 SG_ERROR("Error opening data set\n"); \ 00119 hid_t dtype = H5Dget_type(dataset); \ 00120 H5T_class_t t_class=H5Tget_class(dtype); \ 00121 hid_t h5_type=get_compatible_type(t_class, datatype); \ 00122 if (h5_type==-1) \ 00123 { \ 00124 H5Dclose(dataset); \ 00125 SG_INFO("No compatible datatype found\n"); \ 00126 } \ 00127 get_dims(dataset, dims, ndims, nelements); \ 00128 if (ndims!=2) \ 00129 SG_ERROR("Error not a 2-dimensional matrix\n"); \ 00130 matrix=new sg_type[nelements]; \ 00131 num_feat=dims[0]; \ 00132 num_vec=dims[1]; \ 00133 herr_t status = H5Dread(dataset, h5_type, H5S_ALL, \ 00134 H5S_ALL, H5P_DEFAULT, matrix); \ 00135 H5Dclose(dataset); \ 00136 H5Tclose(dtype); \ 00137 delete[] dims; \ 00138 if (status<0) \ 00139 { \ 00140 delete[] matrix; \ 00141 SG_ERROR("Error reading dataset\n"); \ 00142 } \ 00143 } 00144 00145 GET_MATRIX(get_bool_matrix, bool, DT_DENSE_BOOL) 00146 GET_MATRIX(get_char_matrix, char, DT_DENSE_CHAR) 00147 GET_MATRIX(get_byte_matrix, uint8_t, DT_DENSE_BYTE) 00148 GET_MATRIX(get_int_matrix, int32_t, DT_DENSE_INT) 00149 GET_MATRIX(get_uint_matrix, uint32_t, DT_DENSE_UINT) 00150 GET_MATRIX(get_long_matrix, int64_t, DT_DENSE_LONG) 00151 GET_MATRIX(get_ulong_matrix, uint64_t, DT_DENSE_ULONG) 00152 GET_MATRIX(get_short_matrix, int16_t, DT_DENSE_SHORT) 00153 GET_MATRIX(get_word_matrix, uint16_t, DT_DENSE_WORD) 00154 GET_MATRIX(get_shortreal_matrix, float32_t, DT_DENSE_SHORTREAL) 00155 GET_MATRIX(get_real_matrix, float64_t, DT_DENSE_REAL) 00156 GET_MATRIX(get_longreal_matrix, floatmax_t, DT_DENSE_LONGREAL) 00157 #undef GET_MATRIX 00158 00159 void CHDF5File::get_byte_ndarray(uint8_t*& array, int32_t*& dims, int32_t& num_dims) 00160 { 00161 } 00162 00163 void CHDF5File::get_char_ndarray(char*& array, int32_t*& dims, int32_t& num_dims) 00164 { 00165 } 00166 00167 void CHDF5File::get_int_ndarray(int32_t*& array, int32_t*& dims, int32_t& num_dims) 00168 { 00169 } 00170 00171 void CHDF5File::get_shortreal_ndarray(float32_t*& array, int32_t*& dims, int32_t& num_dims) 00172 { 00173 } 00174 00175 void CHDF5File::get_real_ndarray(float64_t*& array, int32_t*& dims, int32_t& num_dims) 00176 { 00177 } 00178 00179 void CHDF5File::get_short_ndarray(int16_t*& array, int32_t*& dims, int32_t& num_dims) 00180 { 00181 } 00182 00183 void CHDF5File::get_word_ndarray(uint16_t*& array, int32_t*& dims, int32_t& num_dims) 00184 { 00185 } 00186 00187 #define GET_SPARSEMATRIX(fname, sg_type, datatype) \ 00188 void CHDF5File::fname(TSparse<sg_type>*& matrix, int32_t& num_feat, int32_t& num_vec) \ 00189 { \ 00190 if (!(file)) \ 00191 SG_ERROR("File invalid.\n"); \ 00192 } 00193 GET_SPARSEMATRIX(get_bool_sparsematrix, bool, DT_SPARSE_BOOL) 00194 GET_SPARSEMATRIX(get_char_sparsematrix, char, DT_SPARSE_CHAR) 00195 GET_SPARSEMATRIX(get_byte_sparsematrix, uint8_t, DT_SPARSE_BYTE) 00196 GET_SPARSEMATRIX(get_int_sparsematrix, int32_t, DT_SPARSE_INT) 00197 GET_SPARSEMATRIX(get_uint_sparsematrix, uint32_t, DT_SPARSE_UINT) 00198 GET_SPARSEMATRIX(get_long_sparsematrix, int64_t, DT_SPARSE_LONG) 00199 GET_SPARSEMATRIX(get_ulong_sparsematrix, uint64_t, DT_SPARSE_ULONG) 00200 GET_SPARSEMATRIX(get_short_sparsematrix, int16_t, DT_SPARSE_SHORT) 00201 GET_SPARSEMATRIX(get_word_sparsematrix, uint16_t, DT_SPARSE_WORD) 00202 GET_SPARSEMATRIX(get_shortreal_sparsematrix, float32_t, DT_SPARSE_SHORTREAL) 00203 GET_SPARSEMATRIX(get_real_sparsematrix, float64_t, DT_SPARSE_REAL) 00204 GET_SPARSEMATRIX(get_longreal_sparsematrix, floatmax_t, DT_SPARSE_LONGREAL) 00205 #undef GET_SPARSEMATRIX 00206 00207 00208 #define GET_STRING_LIST(fname, sg_type, datatype) \ 00209 void CHDF5File::fname(T_STRING<sg_type>*& strings, int32_t& num_str, int32_t& max_string_len) \ 00210 { \ 00211 } 00212 00213 GET_STRING_LIST(get_bool_string_list, bool, DT_STRING_BOOL) 00214 GET_STRING_LIST(get_char_string_list, char, DT_STRING_CHAR) 00215 GET_STRING_LIST(get_byte_string_list, uint8_t, DT_STRING_BYTE) 00216 GET_STRING_LIST(get_int_string_list, int32_t, DT_STRING_INT) 00217 GET_STRING_LIST(get_uint_string_list, uint32_t, DT_STRING_UINT) 00218 GET_STRING_LIST(get_long_string_list, int64_t, DT_STRING_LONG) 00219 GET_STRING_LIST(get_ulong_string_list, uint64_t, DT_STRING_ULONG) 00220 GET_STRING_LIST(get_short_string_list, int16_t, DT_STRING_SHORT) 00221 GET_STRING_LIST(get_word_string_list, uint16_t, DT_STRING_WORD) 00222 GET_STRING_LIST(get_shortreal_string_list, float32_t, DT_STRING_SHORTREAL) 00223 GET_STRING_LIST(get_real_string_list, float64_t, DT_STRING_REAL) 00224 GET_STRING_LIST(get_longreal_string_list, floatmax_t, DT_STRING_LONGREAL) 00225 #undef GET_STRING_LIST 00226 00229 #define SET_VECTOR(fname, sg_type, dtype, h5type) \ 00230 void CHDF5File::fname(const sg_type* vec, int32_t len) \ 00231 { \ 00232 if (h5file<0 || !vec) \ 00233 SG_ERROR("File or vector invalid.\n"); \ 00234 \ 00235 create_group_hierarchy(); \ 00236 \ 00237 hsize_t dims=(hsize_t) len; \ 00238 hid_t dataspace, dataset, status; \ 00239 dataspace=H5Screate_simple(1, &dims, NULL); \ 00240 if (dataspace<0) \ 00241 SG_ERROR("Could not create hdf5 dataspace\n"); \ 00242 dataset=H5Dcreate(h5file, variable_name, h5type, dataspace, H5P_DEFAULT); \ 00243 if (dataset<0) \ 00244 { \ 00245 SG_ERROR("Could not create hdf5 dataset - does" \ 00246 " dataset '%s' already exist?\n", variable_name); \ 00247 } \ 00248 status=H5Dwrite(dataset, h5type, H5S_ALL, H5S_ALL, H5P_DEFAULT, vec); \ 00249 if (status<0) \ 00250 SG_ERROR("Failed to write hdf5 dataset\n"); \ 00251 H5Dclose(dataset); \ 00252 H5Sclose(dataspace); \ 00253 } 00254 SET_VECTOR(set_bool_vector, bool, DT_VECTOR_BOOL, boolean_type) 00255 SET_VECTOR(set_byte_vector, uint8_t, DT_VECTOR_BYTE, H5T_NATIVE_UINT8) 00256 SET_VECTOR(set_char_vector, char, DT_VECTOR_CHAR, H5T_NATIVE_CHAR) 00257 SET_VECTOR(set_int_vector, int32_t, DT_VECTOR_INT, H5T_NATIVE_INT32) 00258 SET_VECTOR(set_shortreal_vector, float32_t, DT_VECTOR_SHORTREAL, H5T_NATIVE_FLOAT) 00259 SET_VECTOR(set_real_vector, float64_t, DT_VECTOR_REAL, H5T_NATIVE_DOUBLE) 00260 SET_VECTOR(set_short_vector, int16_t, DT_VECTOR_SHORT, H5T_NATIVE_INT16) 00261 SET_VECTOR(set_word_vector, uint16_t, DT_VECTOR_WORD, H5T_NATIVE_UINT16) 00262 #undef SET_VECTOR 00263 00264 #define SET_MATRIX(fname, sg_type, dtype, h5type) \ 00265 void CHDF5File::fname(const sg_type* matrix, int32_t num_feat, int32_t num_vec) \ 00266 { \ 00267 if (h5file<0 || !matrix) \ 00268 SG_ERROR("File or matrix invalid.\n"); \ 00269 \ 00270 create_group_hierarchy(); \ 00271 \ 00272 hsize_t dims[2]={(hsize_t) num_feat, (hsize_t) num_vec}; \ 00273 hid_t dataspace, dataset, status; \ 00274 dataspace=H5Screate_simple(2, dims, NULL); \ 00275 if (dataspace<0) \ 00276 SG_ERROR("Could not create hdf5 dataspace\n"); \ 00277 dataset=H5Dcreate(h5file, variable_name, h5type, dataspace, H5P_DEFAULT); \ 00278 if (dataset<0) \ 00279 { \ 00280 SG_ERROR("Could not create hdf5 dataset - does" \ 00281 " dataset '%s' already exist?\n", variable_name); \ 00282 } \ 00283 status=H5Dwrite(dataset, h5type, H5S_ALL, H5S_ALL, H5P_DEFAULT, matrix); \ 00284 if (status<0) \ 00285 SG_ERROR("Failed to write hdf5 dataset\n"); \ 00286 H5Dclose(dataset); \ 00287 H5Sclose(dataspace); \ 00288 } 00289 SET_MATRIX(set_bool_matrix, bool, DT_DENSE_BOOL, boolean_type) 00290 SET_MATRIX(set_char_matrix, char, DT_DENSE_CHAR, H5T_NATIVE_CHAR) 00291 SET_MATRIX(set_byte_matrix, uint8_t, DT_DENSE_BYTE, H5T_NATIVE_UINT8) 00292 SET_MATRIX(set_int_matrix, int32_t, DT_DENSE_INT, H5T_NATIVE_INT32) 00293 SET_MATRIX(set_uint_matrix, uint32_t, DT_DENSE_UINT, H5T_NATIVE_UINT32) 00294 SET_MATRIX(set_long_matrix, int64_t, DT_DENSE_LONG, H5T_NATIVE_INT64) 00295 SET_MATRIX(set_ulong_matrix, uint64_t, DT_DENSE_ULONG, H5T_NATIVE_UINT64) 00296 SET_MATRIX(set_short_matrix, int16_t, DT_DENSE_SHORT, H5T_NATIVE_INT16) 00297 SET_MATRIX(set_word_matrix, uint16_t, DT_DENSE_WORD, H5T_NATIVE_UINT16) 00298 SET_MATRIX(set_shortreal_matrix, float32_t, DT_DENSE_SHORTREAL, H5T_NATIVE_FLOAT) 00299 SET_MATRIX(set_real_matrix, float64_t, DT_DENSE_REAL, H5T_NATIVE_DOUBLE) 00300 SET_MATRIX(set_longreal_matrix, floatmax_t, DT_DENSE_LONGREAL, H5T_NATIVE_LDOUBLE) 00301 #undef SET_MATRIX 00302 00303 #define SET_SPARSEMATRIX(fname, sg_type, dtype) \ 00304 void CHDF5File::fname(const TSparse<sg_type>* matrix, \ 00305 int32_t num_feat, int32_t num_vec) \ 00306 { \ 00307 if (!(file && matrix)) \ 00308 SG_ERROR("File or matrix invalid.\n"); \ 00309 \ 00310 } 00311 SET_SPARSEMATRIX(set_bool_sparsematrix, bool, DT_SPARSE_BOOL) 00312 SET_SPARSEMATRIX(set_char_sparsematrix, char, DT_SPARSE_CHAR) 00313 SET_SPARSEMATRIX(set_byte_sparsematrix, uint8_t, DT_SPARSE_BYTE) 00314 SET_SPARSEMATRIX(set_int_sparsematrix, int32_t, DT_SPARSE_INT) 00315 SET_SPARSEMATRIX(set_uint_sparsematrix, uint32_t, DT_SPARSE_UINT) 00316 SET_SPARSEMATRIX(set_long_sparsematrix, int64_t, DT_SPARSE_LONG) 00317 SET_SPARSEMATRIX(set_ulong_sparsematrix, uint64_t, DT_SPARSE_ULONG) 00318 SET_SPARSEMATRIX(set_short_sparsematrix, int16_t, DT_SPARSE_SHORT) 00319 SET_SPARSEMATRIX(set_word_sparsematrix, uint16_t, DT_SPARSE_WORD) 00320 SET_SPARSEMATRIX(set_shortreal_sparsematrix, float32_t, DT_SPARSE_SHORTREAL) 00321 SET_SPARSEMATRIX(set_real_sparsematrix, float64_t, DT_SPARSE_REAL) 00322 SET_SPARSEMATRIX(set_longreal_sparsematrix, floatmax_t, DT_SPARSE_LONGREAL) 00323 #undef SET_SPARSEMATRIX 00324 00325 #define SET_STRING_LIST(fname, sg_type, dtype) \ 00326 void CHDF5File::fname(const T_STRING<sg_type>* strings, int32_t num_str) \ 00327 { \ 00328 if (!(file && strings)) \ 00329 SG_ERROR("File or strings invalid.\n"); \ 00330 \ 00331 } 00332 SET_STRING_LIST(set_bool_string_list, bool, DT_STRING_BOOL) 00333 SET_STRING_LIST(set_char_string_list, char, DT_STRING_CHAR) 00334 SET_STRING_LIST(set_byte_string_list, uint8_t, DT_STRING_BYTE) 00335 SET_STRING_LIST(set_int_string_list, int32_t, DT_STRING_INT) 00336 SET_STRING_LIST(set_uint_string_list, uint32_t, DT_STRING_UINT) 00337 SET_STRING_LIST(set_long_string_list, int64_t, DT_STRING_LONG) 00338 SET_STRING_LIST(set_ulong_string_list, uint64_t, DT_STRING_ULONG) 00339 SET_STRING_LIST(set_short_string_list, int16_t, DT_STRING_SHORT) 00340 SET_STRING_LIST(set_word_string_list, uint16_t, DT_STRING_WORD) 00341 SET_STRING_LIST(set_shortreal_string_list, float32_t, DT_STRING_SHORTREAL) 00342 SET_STRING_LIST(set_real_string_list, float64_t, DT_STRING_REAL) 00343 SET_STRING_LIST(set_longreal_string_list, floatmax_t, DT_STRING_LONGREAL) 00344 #undef SET_STRING_LIST 00345 00346 void CHDF5File::get_boolean_type() 00347 { 00348 boolean_type=H5T_NATIVE_UCHAR; 00349 switch (sizeof(bool)) 00350 { 00351 case 1: 00352 boolean_type = H5T_NATIVE_UCHAR; 00353 break; 00354 case 2: 00355 boolean_type = H5T_NATIVE_UINT16; 00356 break; 00357 case 4: 00358 boolean_type = H5T_NATIVE_UINT32; 00359 break; 00360 case 8: 00361 boolean_type = H5T_NATIVE_UINT64; 00362 break; 00363 default: 00364 SG_ERROR("Boolean type not supported on this platform\n"); 00365 } 00366 } 00367 00368 hid_t CHDF5File::get_compatible_type(H5T_class_t t_class, SGDataType datatype) 00369 { 00370 switch (t_class) 00371 { 00372 case H5T_FLOAT: 00373 case H5T_INTEGER: 00374 switch (datatype) 00375 { 00376 case DT_VECTOR_SHORTREAL: 00377 case DT_NDARRAY_SHORTREAL: 00378 case DT_DENSE_SHORTREAL: 00379 return H5T_NATIVE_FLOAT; 00380 case DT_VECTOR_REAL: 00381 case DT_NDARRAY_REAL: 00382 case DT_DENSE_REAL: 00383 return H5T_NATIVE_DOUBLE; 00384 case DT_VECTOR_LONGREAL: 00385 case DT_NDARRAY_LONGREAL: 00386 case DT_DENSE_LONGREAL: 00387 return H5T_NATIVE_LDOUBLE; 00388 case DT_VECTOR_BOOL: 00389 case DT_DENSE_BOOL: 00390 case DT_NDARRAY_BOOL: 00391 return boolean_type; 00392 case DT_VECTOR_BYTE: 00393 case DT_DENSE_BYTE: 00394 case DT_NDARRAY_BYTE: 00395 return H5T_NATIVE_UINT8; 00396 case DT_VECTOR_CHAR: 00397 case DT_DENSE_CHAR: 00398 case DT_NDARRAY_CHAR: 00399 return H5T_NATIVE_CHAR; 00400 case DT_VECTOR_INT: 00401 case DT_DENSE_INT: 00402 case DT_NDARRAY_INT: 00403 return H5T_NATIVE_INT32; 00404 case DT_VECTOR_UINT: 00405 case DT_DENSE_UINT: 00406 case DT_NDARRAY_UINT: 00407 return H5T_NATIVE_UINT32; 00408 case DT_VECTOR_LONG: 00409 case DT_DENSE_LONG: 00410 case DT_NDARRAY_LONG: 00411 return H5T_NATIVE_INT64; 00412 case DT_VECTOR_ULONG: 00413 case DT_DENSE_ULONG: 00414 case DT_NDARRAY_ULONG: 00415 return H5T_NATIVE_UINT64; 00416 case DT_VECTOR_SHORT: 00417 case DT_DENSE_SHORT: 00418 case DT_NDARRAY_SHORT: 00419 return H5T_NATIVE_INT16; 00420 case DT_VECTOR_WORD: 00421 case DT_DENSE_WORD: 00422 case DT_NDARRAY_WORD: 00423 return H5T_NATIVE_UINT16; 00424 default: 00425 return -1; 00426 } 00427 case H5T_STRING: 00428 SG_ERROR("Strings not supported"); 00429 return -1; 00430 case H5T_VLEN: 00431 SG_ERROR("Variable length containers currently not supported"); 00432 return -1; 00433 case H5T_ARRAY: 00434 SG_ERROR("Array containers currently not supported"); 00435 return -1; 00436 default: 00437 SG_ERROR("Datatype mismatchn"); 00438 return -1; 00439 } 00440 } 00441 00442 void CHDF5File::get_dims(hid_t dataset, int32_t*& dims, int32_t& ndims, int64_t& total_elements) 00443 { 00444 hid_t dataspace = H5Dget_space(dataset); 00445 if (dataspace<0) 00446 SG_ERROR("Error obtaining hdf5 dataspace\n"); 00447 00448 ndims = H5Sget_simple_extent_ndims(dataspace); 00449 total_elements=H5Sget_simple_extent_npoints(dataspace); 00450 hsize_t* dims_out=new hsize_t[ndims]; 00451 dims=new int32_t[ndims]; 00452 H5Sget_simple_extent_dims(dataspace, dims_out, NULL); 00453 for (int32_t i=0; i<ndims; i++) 00454 dims[i]=dims_out[i]; 00455 delete[] dims_out; 00456 H5Sclose(dataspace); 00457 } 00458 00459 void CHDF5File::create_group_hierarchy() 00460 { 00461 char* vname=strdup(variable_name); 00462 int32_t vlen=strlen(vname); 00463 for (int32_t i=0; i<vlen; i++) 00464 { 00465 if (i!=0 && vname[i]=='/') 00466 { 00467 vname[i]='\0'; 00468 hid_t g = H5Gopen(h5file, vname); 00469 if (g<0) 00470 { 00471 g=H5Gcreate(h5file, vname, 0); 00472 if (g<0) 00473 SG_ERROR("Error creating group '%s'\n", vname); 00474 vname[i]='/'; 00475 } 00476 H5Gclose(g); 00477 } 00478 } 00479 free(vname); 00480 } 00481 #endif // HDF5