37 #ifndef VIGRA_RANDOM_FOREST_IMPEX_HDF5_HXX
38 #define VIGRA_RANDOM_FOREST_IMPEX_HDF5_HXX
41 #include "random_forest.hxx"
42 #include "hdf5impex.hxx"
62 template<
class Container>
67 #if (H5_VERS_MAJOR == 1 && H5_VERS_MINOR <= 6)
69 H5Gget_num_objs(grp_id, &size);
74 status = H5Gget_info (grp_id , &ginfo);
76 std::runtime_error(
"find_groups_hdf5():"
77 "problem while getting group info");
80 for(hsize_t ii = 0; ii < size; ++ii)
82 #if (H5_VERS_MAJOR == 1 && H5_VERS_MINOR <= 6)
84 H5Gget_objname_by_idx(grp_id,
87 std::ptrdiff_t buffer_size =
88 H5Lget_name_by_idx(grp_id,
".",
91 ii, 0, 0, H5P_DEFAULT)+1;
94 #if (H5_VERS_MAJOR == 1 && H5_VERS_MINOR <= 6)
96 H5Gget_objname_by_idx(grp_id,
98 (size_t)buffer_size );
101 H5Lget_name_by_idx(grp_id,
".",
108 cont.insert(cont.end(), std::string(buffer.
data()));
122 template<
class Container>
124 std::string groupname,
129 pFile = std::fopen ( filename.c_str(),
"r" );
136 HDF5Handle file_id(H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT),
137 &H5Fclose,
"Unable to open HDF5 file");
145 grp_id =
HDF5Handle(H5Gopen(file_id, groupname.c_str(), H5P_DEFAULT),
146 &H5Gclose,
"Unable to open group");
153 VIGRA_EXPORT
int get_number_of_digits(
int in);
155 VIGRA_EXPORT std::string make_padded_number(
int number,
int max_number);
159 template<
class U,
class T>
162 std::string
const & name,
165 hsize_t size = arr.
size();
166 vigra_postcondition(H5LTmake_dataset (
id,
173 "write_array_2_hdf5():"
174 "unable to write dataset");
178 template<
class U,
class T>
179 void write_hdf5_2_array(hid_t &
id,
181 std::string
const & name,
190 vigra_postcondition(H5LTget_dataset_info(
id,
195 "write_hdf5_2_array(): "
196 "Unable to locate dataset");
197 arr.resize((
typename ArrayVector<U>::size_type)size);
198 vigra_postcondition(H5LTread_dataset (
id,
202 "write_array_2_hdf5():"
203 "unable to read dataset");
232 enum type { INT8 = 1, INT16 = 2, INT32 =3, INT64=4,
233 UINT8 = 5, UINT16 = 6, UINT32= 7, UINT64= 8,
234 FLOAT = 9, DOUBLE = 10, OTHER = 3294};
239 #define create_type_of(TYPE, ENUM) \
240 inline MyT::type type_of(TYPE)\
244 create_type_of(
Int8, INT8)
245 create_type_of(
Int16, INT16)
246 create_type_of(
Int32, INT32)
247 create_type_of(
Int64, INT64)
248 create_type_of(
UInt8, UINT8)
249 create_type_of(
UInt16, UINT16)
250 create_type_of(
UInt32, UINT32)
251 create_type_of(
UInt64, UINT64)
252 create_type_of(
float, FLOAT)
253 create_type_of(
double, DOUBLE)
254 #undef create_type_of
256 VIGRA_EXPORT MyT::type type_of_hid_t(hid_t group_id, std::string name);
258 VIGRA_EXPORT
void options_import_HDF5(hid_t & group_id,
259 RandomForestOptions & opt,
262 VIGRA_EXPORT
void options_export_HDF5(hid_t & group_id,
263 RandomForestOptions
const & opt,
267 void problemspec_import_HDF5(hid_t & group_id,
268 ProblemSpec<T> & param,
271 hid_t param_id = H5Gopen (group_id,
275 vigra_postcondition(param_id >= 0,
276 "problemspec_import_HDF5():"
277 " Unable to open external parameters");
280 std::set<std::string> ext_set;
282 std::map<std::string, ArrayVector <double> > ext_map;
283 std::set<std::string>::iterator iter;
284 if(ext_set.find(std::string(
"labels")) == ext_set.end())
285 std::runtime_error(
"labels are missing");
286 for(iter = ext_set.begin(); iter != ext_set.end(); ++ iter)
288 if(*iter != std::string(
"labels"))
290 ext_map[*iter] = ArrayVector<double>();
291 write_hdf5_2_array(param_id, ext_map[*iter],
292 *iter, H5T_NATIVE_DOUBLE);
295 param.make_from_map(ext_map);
297 switch(type_of_hid_t(param_id,
"labels" ))
299 #define SOME_CASE(type_, enum_) \
302 ArrayVector<type_> tmp;\
303 write_hdf5_2_array(param_id, tmp, "labels", H5T_NATIVE_##enum_);\
304 param.classes_(tmp.begin(), tmp.end());\
307 SOME_CASE(UInt8, UINT8);
308 SOME_CASE(UInt16, UINT16);
309 SOME_CASE(UInt32, UINT32);
310 SOME_CASE(UInt64, UINT64);
311 SOME_CASE(
Int8, INT8);
312 SOME_CASE(Int16, INT16);
313 SOME_CASE(Int32, INT32);
314 SOME_CASE(Int64, INT64);
315 SOME_CASE(
double, DOUBLE);
316 SOME_CASE(
float, FLOAT);
318 std::runtime_error(
"exportRF_HDF5(): unknown class type");
325 void problemspec_export_HDF5(hid_t & group_id,
326 ProblemSpec<T>
const & param,
329 hid_t param_id = H5Gcreate(group_id, name.c_str(),
333 vigra_postcondition(param_id >= 0,
334 "problemspec_export_HDF5():"
335 " Unable to create external parameters");
338 std::map<std::string, ArrayVector<double> > serialized_param;
339 param.make_map(serialized_param);
340 std::map<std::string, ArrayVector<double> >::iterator iter;
341 for(iter = serialized_param.begin(); iter != serialized_param.end(); ++iter)
345 switch(type_of(param.classes[0]))
347 #define SOME_CASE(type) \
349 write_array_2_hdf5(param_id, param.classes, "labels", H5T_NATIVE_##type);\
362 std::runtime_error(
"exportRF_HDF5(): unknown class type");
368 VIGRA_EXPORT
void dt_import_HDF5(hid_t & group_id,
369 detail::DecisionTree & tree,
373 VIGRA_EXPORT
void dt_export_HDF5(hid_t & group_id,
374 detail::DecisionTree
const & tree,
380 bool rf_export_HDF5(RandomForest<T>
const &rf,
381 std::string filename,
382 std::string pathname =
"",
383 bool overwriteflag =
false)
385 using detail::make_padded_number;
386 using detail::options_export_HDF5;
387 using detail::problemspec_export_HDF5;
388 using detail::dt_export_HDF5;
392 FILE* pFile = std::fopen ( filename.c_str(),
"r" );
396 file_id = H5Fopen(filename.c_str(), H5F_ACC_RDWR,
402 file_id = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC,
406 vigra_postcondition(file_id >= 0,
407 "rf_export_HDF5(): Unable to open file.");
414 hid_t group_id = pathname==
"" ?
416 : H5Gcreate(file_id, pathname.c_str(),
421 vigra_postcondition(group_id >= 0,
422 "rf_export_HDF5(): Unable to create group");
425 options_export_HDF5(group_id, rf.options(),
"_options");
427 problemspec_export_HDF5(group_id, rf.ext_param(),
"_ext_param");
430 int tree_count = rf.options_.tree_count_;
431 for(
int ii = 0; ii < tree_count; ++ii)
433 std::string treename =
"Tree_" +
434 make_padded_number(ii, tree_count -1);
435 dt_export_HDF5(group_id, rf.tree(ii), treename);
448 bool rf_import_HDF5(RandomForest<T> &rf,
449 std::string filename,
450 std::string pathname =
"")
453 using detail::options_import_HDF5;
454 using detail::problemspec_import_HDF5;
455 using detail::dt_export_HDF5;
457 FILE* pFile = std::fopen ( filename.c_str(),
"r" );
462 hid_t file_id = H5Fopen (filename.c_str(),
466 vigra_postcondition(file_id >= 0,
467 "rf_import_HDF5(): Unable to open file.");
468 hid_t group_id = pathname==
"" ?
474 vigra_postcondition(group_id >= 0,
475 "rf_export_HDF5(): Unable to create group");
478 options_import_HDF5(group_id, rf.options_,
"_options");
480 problemspec_import_HDF5(group_id, rf.ext_param_,
"_ext_param");
484 std::set<std::string> tree_set;
485 std::set<std::string>::iterator iter;
488 for(iter = tree_set.begin(); iter != tree_set.end(); ++iter)
490 if((*iter)[0] !=
'_')
492 rf.trees_.push_back(detail::DecisionTree(rf.ext_param_));
493 dt_import_HDF5(group_id, rf.trees_.back(), *iter);
510 #endif // VIGRA_RANDOM_FOREST_HDF5_IMPEX_HXX