SHOGUN v0.9.3
HDF5File.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation