18 #define NOT_OPEN ((hid_t) -1)
20 #define STR_KEY_FILETYPE "filetype"
21 #define STR_FILETYPE_00 \
22 "_SHOGUN_SERIALIZABLE_HDF5_FILE_V_00_"
26 CSerializableHdf5File::type_item_t::type_item_t(
const char* name_)
29 dims[0] = dims[1] = 0;
30 dspace = dtype = dset = NOT_OPEN;
37 CSerializableHdf5File::type_item_t::~type_item_t()
39 if (dset >= 0) H5Dclose(dset);
40 if (dtype >= 0) H5Tclose(dtype);
41 if (dspace >= 0) H5Sclose(dspace);
42 if (vltype != NULL) SG_FREE(vltype);
47 CSerializableHdf5File::sizeof_sparsetype() {
48 return H5Tget_size(TYPE_INDEX) + H5Tget_size(H5T_STD_REF_OBJ);
51 CSerializableHdf5File::new_sparsetype()
53 hid_t result = H5Tcreate(H5T_COMPOUND, sizeof_sparsetype());
55 if (H5Tinsert(result, STR_SPARSE_FPTR, H5Tget_size(TYPE_INDEX),
62 CSerializableHdf5File::get_ref_sparstype(
void* sparse_buf) {
64 ((
char*) sparse_buf + H5Tget_size(TYPE_INDEX));
68 CSerializableHdf5File::new_sparseentrytype(EPrimitiveType ptype)
70 hid_t result = H5Tcreate(H5T_COMPOUND,
72 if (result < 0)
return NOT_OPEN;
74 if (H5Tinsert(result, STR_SPARSEENTRY_FINDEX,
77 if (H5Tinsert(result, STR_SPARSEENTRY_ENTRY,
TSGDataType
78 ::offset_sparseentry(ptype),
79 ptype2hdf5(ptype)) < 0)
return NOT_OPEN;
85 CSerializableHdf5File::ptype2hdf5(EPrimitiveType ptype)
89 switch (
sizeof (
bool)) {
90 case 1:
return H5T_NATIVE_UINT8;
91 case 2:
return H5T_NATIVE_UINT16;
92 case 4:
return H5T_NATIVE_UINT32;
93 case 8:
return H5T_NATIVE_UINT64;
97 case PT_CHAR:
return H5T_NATIVE_CHAR;
break;
98 case PT_INT8:
return H5T_NATIVE_INT8;
break;
99 case PT_UINT8:
return H5T_NATIVE_UINT8;
break;
100 case PT_INT16:
return H5T_NATIVE_INT16;
break;
101 case PT_UINT16:
return H5T_NATIVE_UINT16;
break;
102 case PT_INT32:
return H5T_NATIVE_INT32;
break;
103 case PT_UINT32:
return H5T_NATIVE_UINT32;
break;
104 case PT_INT64:
return H5T_NATIVE_INT64;
break;
105 case PT_UINT64:
return H5T_NATIVE_UINT64;
break;
106 case PT_FLOAT32:
return H5T_NATIVE_FLOAT;
break;
107 case PT_FLOAT64:
return H5T_NATIVE_DOUBLE;
break;
108 case PT_FLOATMAX:
return H5T_NATIVE_LDOUBLE;
break;
109 case PT_COMPLEX128:
return NOT_OPEN;
break;
110 case PT_SGOBJECT:
return NOT_OPEN;
break;
120 CSerializableHdf5File::new_stype2hdf5(EStructType stype,
121 EPrimitiveType ptype)
123 hid_t result = ptype2hdf5(ptype);
126 case ST_NONE: result = H5Tcopy(result);
break;
127 case ST_STRING: result = H5Tvlen_create(result);
break;
128 case ST_SPARSE: result = new_sparsetype();
break;
136 CSerializableHdf5File::index2string(
141 case CT_SCALAR:
return false;
142 case CT_VECTOR:
case CT_SGVECTOR: snprintf(dest, n,
"y%u", y);
break;
143 case CT_MATRIX:
case CT_SGMATRIX: snprintf(dest, n,
"y%u_x%u", y, x);
break;
144 default:
return false;
151 CSerializableHdf5File::isequal_stype2hdf5(EStructType stype,
152 EPrimitiveType ptype,
155 hid_t pbuf = ptype2hdf5(ptype), pbuf2 = NOT_OPEN;
157 bool to_close =
false;
162 to_close =
true; pbuf = H5Tvlen_create(pbuf);
break;
164 to_close =
true; pbuf = new_sparsetype();
165 pbuf2 = new_sparseentrytype(ptype);
break;
168 bool result = (H5Tequal(htype, pbuf) > 0)
169 || (pbuf2 >= 0 && H5Tequal(htype, pbuf2) > 0);
171 if (pbuf2 >= 0 && H5Tclose(pbuf2) < 0)
return false;
172 if (to_close && H5Tclose(pbuf) < 0)
return false;
177 CSerializableHdf5File::dspace_select(EContainerType ctype,
index_t y,
180 type_item_t* m = m_stack_type.back();
182 if (H5Sselect_none(m->dspace) < 0)
return false;
187 case CT_SCALAR:
return false;
188 case CT_MATRIX:
case CT_SGMATRIX: coord[1] = x;
189 case CT_VECTOR:
case CT_SGVECTOR: coord[0] = y;
break;
190 default:
return false;
192 if (H5Sselect_elements(m->dspace, H5S_SELECT_SET, 1, coord) < 0)
199 CSerializableHdf5File::attr_write_scalar(
200 hid_t datatype,
const char* name,
const void* val)
203 if ((dspace = H5Screate_simple(0, NULL, NULL)) < 0)
return false;
205 if ((dtype = H5Tcopy(datatype)) < 0)
return false;
207 if ((attr = H5Acreate2(
208 m_stack_h5stream.back(), name, dtype, dspace,
209 H5P_DEFAULT, H5P_DEFAULT)) < 0)
return false;
211 if (H5Awrite(attr, datatype, val) < 0)
return false;
213 if (H5Aclose(attr) < 0)
return false;
214 if (H5Tclose(dtype) < 0)
return false;
215 if (H5Sclose(dspace) < 0)
return false;
221 CSerializableHdf5File::attr_write_string(
222 const char* name,
const char* val)
225 if ((dtype = H5Tcopy(H5T_C_S1)) < 0)
return false;
226 if (H5Tset_size(dtype, strlen(val)+1) < 0)
return false;
228 if (!attr_write_scalar(dtype, name, val))
return false;
230 if (H5Tclose(dtype) < 0)
return false;
236 CSerializableHdf5File::attr_exists(
const char* name)
238 return H5Aexists(m_stack_h5stream.back(), name) > 0;
242 CSerializableHdf5File::attr_get_size(
const char* name)
244 if (!attr_exists(name))
return 0;
247 if ((attr = H5Aopen(m_stack_h5stream.back(), name, H5P_DEFAULT))
251 if ((dtype = H5Aget_type(attr)) < 0)
return 0;
253 size_t result = H5Tget_size(dtype);
255 if (H5Tclose(dtype) < 0)
return 0;
256 if (H5Aclose(attr) < 0)
return 0;
262 CSerializableHdf5File::attr_read_scalar(
263 hid_t datatype,
const char* name,
void* val)
265 if (!attr_exists(name))
return false;
268 if ((attr = H5Aopen(m_stack_h5stream.back(), name, H5P_DEFAULT))
272 if ((dspace = H5Aget_space(attr)) < 0)
return false;
273 if (H5Sget_simple_extent_type(dspace) != H5S_SCALAR)
return false;
276 if ((dtype = H5Aget_type(attr)) < 0)
return false;
277 if (H5Tequal(datatype, dtype) <= 0)
return false;
279 if (H5Aread(attr, datatype, val) < 0)
return false;
281 if (H5Tclose(dtype) < 0)
return false;
282 if (H5Sclose(dspace) < 0)
return false;
283 if (H5Aclose(attr) < 0)
return false;
289 CSerializableHdf5File::attr_read_string(
290 const char* name,
char* val,
size_t n)
292 size_t size = attr_get_size(name);
293 if (size == 0 || size > n)
return false;
296 if ((dtype = H5Tcopy(H5T_C_S1)) < 0)
return false;
297 if (H5Tset_size(dtype, size) < 0)
return false;
299 if (!attr_read_scalar(dtype, name, val))
return false;
301 if (H5Tclose(dtype) < 0)
return false;
307 CSerializableHdf5File::group_create(
const char* name,
313 snprintf(gname,
STRING_LEN,
"%s%s", prefix, name);
315 m_stack_h5stream.push_back(
316 ngroup = H5Gcreate2(m_stack_h5stream.back(), gname, H5P_DEFAULT,
317 H5P_DEFAULT, H5P_DEFAULT));
318 if (ngroup < 0)
return false;
324 CSerializableHdf5File::group_open(
const char* name,
330 snprintf(gname,
STRING_LEN,
"%s%s", prefix, name);
332 m_stack_h5stream.push_back(
333 group = H5Gopen2(m_stack_h5stream.back(), gname, H5P_DEFAULT));
334 if (group < 0)
return false;
340 CSerializableHdf5File::group_close()
342 if (H5Gclose(m_stack_h5stream.back()) < 0)
return false;
343 m_stack_h5stream.pop_back();
348 CSerializableHdf5File::CSerializableHdf5File()
351 CSerializableHdf5File::CSerializableHdf5File(
const char* fname,
char rw)
354 CSerializableFile::init(NULL, rw, fname);
358 CSerializableHdf5File::~CSerializableHdf5File()
360 while (m_stack_type.get_num_elements() > 0) {
361 delete m_stack_type.back(); m_stack_type.pop_back();
368 CSerializableHdf5File::new_reader(
char* dest_version,
size_t n)
370 if (!attr_read_string(STR_KEY_FILETYPE, dest_version, n))
373 if (strcmp(STR_FILETYPE_00, dest_version) == 0)
374 return new SerializableHdf5Reader00(
this);
380 CSerializableHdf5File::init(
const char* fname)
382 if (m_filename == NULL || *m_filename ==
'\0') {
383 SG_WARNING(
"Filename not given for opening file!\n")
387 hid_t h5stream = NOT_OPEN;
390 h5stream = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT,
394 h5stream = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);
397 SG_WARNING(
"Could not open file `%s', unknown mode!\n",
403 SG_WARNING(
"Could not open file `%s'!\n", m_filename)
407 m_stack_h5stream.push_back(h5stream);
410 if (!attr_write_string(STR_KEY_FILETYPE, STR_FILETYPE_00)) {
411 SG_WARNING(
"%s: Could not open file for writing during "
412 "writing filetype!\n", fname);
422 CSerializableHdf5File::close()
424 while (m_stack_h5stream.get_num_elements() > 1) {
425 if (m_stack_h5stream.back() >= 0)
426 H5Gclose(m_stack_h5stream.back());
427 m_stack_h5stream.pop_back();
430 if (m_stack_h5stream.get_num_elements() == 1) {
431 if (m_stack_h5stream.back() >= 0)
432 H5Fclose(m_stack_h5stream.back());
433 m_stack_h5stream.pop_back();
438 CSerializableHdf5File::is_opened()
440 return m_stack_h5stream.get_num_elements() > 0;
444 CSerializableHdf5File::write_scalar_wrapped(
447 type_item_t* m = m_stack_type.back();
451 if (m->y != 0 || m->x != 0)
return true;
455 m->vltype[m->x*m->dims[1] + m->y].p = (
void*) param;
458 < (
index_t) m->vltype[m->x*m->dims[1] + m->y].len-1)
459 || ((type->
m_ctype == CT_VECTOR || type->
m_ctype == CT_SGVECTOR) && m->y
462 && (m->x < (
index_t) m->dims[0]-1
463 || m->y < (
index_t) m->dims[1]-1)))
467 if (m->sub_y != 0)
return true;
469 default:
return false;
478 if (H5Dwrite(m->dset, mem_type_id, H5S_ALL, H5S_ALL,
479 H5P_DEFAULT, param) < 0)
return false;
482 if (H5Dwrite(m->dset, mem_type_id, H5S_ALL, H5S_ALL,
483 H5P_DEFAULT, m->vltype) < 0)
return false;
486 if (H5Dwrite(m->dset, m->dtype, H5S_ALL, H5S_ALL,
487 H5P_DEFAULT, m->sparse_ptr) < 0)
return false;
489 default:
return false;
492 if (H5Tclose(mem_type_id) < 0)
return false;
498 CSerializableHdf5File::write_cont_begin_wrapped(
501 hbool_t bool_buf =
true;
503 if (type->
m_ptype != PT_SGOBJECT)
return true;
505 if (!attr_write_scalar(H5T_NATIVE_HBOOL, STR_IS_CONT, &bool_buf))
510 if (!attr_write_string(STR_CTYPE_NAME, ctype_buf))
return false;
516 SG_ERROR(
"write_cont_begin_wrapped(): Implementation error "
517 "during writing Hdf5File!");
519 case CT_MATRIX:
case CT_SGMATRIX:
520 if (!attr_write_scalar(TYPE_INDEX, STR_LENGTH_X, &len_real_x))
523 case CT_VECTOR:
case CT_SGVECTOR:
524 if (!attr_write_scalar(TYPE_INDEX, STR_LENGTH_Y, &len_real_y))
527 default:
return false;
534 CSerializableHdf5File::write_cont_end_wrapped(
541 CSerializableHdf5File::write_string_begin_wrapped(
544 type_item_t* m = m_stack_type.back();
546 m->vltype[m->x*m->dims[1] + m->y].len = length;
552 CSerializableHdf5File::write_string_end_wrapped(
559 CSerializableHdf5File::write_stringentry_begin_wrapped(
562 type_item_t* m = m_stack_type.back();
570 CSerializableHdf5File::write_stringentry_end_wrapped(
577 CSerializableHdf5File::write_sparse_begin_wrapped(
580 type_item_t* m_prev = m_stack_type.back();
582 if(!dspace_select(type->
m_ctype, m_prev->y, m_prev->x))
585 type_item_t* m =
new type_item_t(m_stack_type.back()->name);
586 m_stack_type.push_back(m);
590 if (m_prev->y == 0 && m_prev->x == 0) {
591 hbool_t bool_buf =
true;
592 if (!group_create(m->name, STR_GROUP_PREFIX))
return false;
594 if (!attr_write_scalar(H5T_NATIVE_HBOOL, STR_IS_SPARSE,
595 &bool_buf))
return false;
597 if (!group_open(m->name, STR_GROUP_PREFIX))
return false;
598 if (!attr_exists(STR_IS_SPARSE))
return false;
601 m->rank = 1; m->dims[0] = length;
602 if (m->dims[0] == 0) m->dspace = H5Screate(H5S_NULL);
604 if (m->dspace < 0 && (m->dspace = H5Screate_simple(
605 m->rank, m->dims, NULL)) < 0)
607 if ((m->dtype = new_sparseentrytype(type->
m_ptype)) < 0)
613 if ((m->dset = H5Dcreate2(
614 m_stack_h5stream.back(), name, m->dtype, m->dspace,
615 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
620 char* buf = SG_MALLOC(
char, sizeof_sparsetype());
623 if ((mem_type_id = new_sparsetype()) < 0)
return false;
626 if ((mem_space_id = H5Screate_simple(0, NULL, NULL)) < 0)
629 hobj_ref_t* sparse_ref = get_ref_sparstype(buf);
630 if (H5Rcreate(sparse_ref, m_stack_h5stream.back(), name,
631 H5R_OBJECT, -1) < 0)
return false;
633 if (H5Dwrite(m_prev->dset, mem_type_id, mem_space_id,
634 m_prev->dspace, H5P_DEFAULT, buf) < 0)
return false;
636 if (H5Sclose(mem_space_id) < 0)
return false;
637 if (H5Tclose(mem_type_id) < 0)
return false;
645 CSerializableHdf5File::write_sparse_end_wrapped(
648 if (!group_close())
return false;
649 delete m_stack_type.back(); m_stack_type.pop_back();
655 CSerializableHdf5File::write_sparseentry_begin_wrapped(
659 type_item_t* m = m_stack_type.back();
668 CSerializableHdf5File::write_sparseentry_end_wrapped(
676 CSerializableHdf5File::write_item_begin_wrapped(
679 type_item_t* m = m_stack_type.back();
682 if (type->
m_ptype != PT_SGOBJECT)
return true;
687 if (!group_create(name,
""))
return false;
693 CSerializableHdf5File::write_item_end_wrapped(
696 if (type->
m_ptype == PT_SGOBJECT)
697 if (!group_close())
return false;
703 CSerializableHdf5File::write_sgserializable_begin_wrapped(
704 const TSGDataType* type,
const char* sgserializable_name,
705 EPrimitiveType
generic)
707 hbool_t bool_buf =
true;
709 if (!attr_write_scalar(H5T_NATIVE_HBOOL, STR_IS_SGSERIALIZABLE,
710 &bool_buf))
return false;
712 if (*sgserializable_name ==
'\0') {
713 if (!attr_write_scalar(H5T_NATIVE_HBOOL, STR_IS_NULL,
719 if (!attr_write_string(STR_INSTANCE_NAME, sgserializable_name))
725 if (!attr_write_string(STR_GENERIC_NAME, buf))
return false;
732 CSerializableHdf5File::write_sgserializable_end_wrapped(
733 const TSGDataType* type,
const char* sgserializable_name,
734 EPrimitiveType
generic)
740 CSerializableHdf5File::write_type_begin_wrapped(
741 const TSGDataType* type,
const char* name,
const char* prefix)
743 type_item_t* m =
new type_item_t(name); m_stack_type.push_back(m);
745 if (type->
m_ptype == PT_SGOBJECT) {
746 if (!group_create(name,
""))
return false;
755 if (type->
m_stype == ST_STRING) m->vltype = SG_MALLOC(hvl_t, 1);
757 case CT_VECTOR:
case CT_SGVECTOR:
759 if (m->dims[0] == 0) m->dspace = H5Screate(H5S_NULL);
760 if (type->
m_stype == ST_STRING)
761 m->vltype = SG_MALLOC(hvl_t, m->dims[0]);
763 case CT_MATRIX:
case CT_SGMATRIX:
766 if (m->dims[0] *m->dims[1] == 0)
767 m->dspace = H5Screate(H5S_NULL);
768 if (type->
m_stype == ST_STRING)
769 m->vltype = SG_MALLOC(hvl_t, m->dims[0] *m->dims[1]);
771 default:
return false;
774 if (m->dspace < 0 && (m->dspace = H5Screate_simple(
775 m->rank, m->dims, NULL)) < 0)
777 if ((m->dtype = new_stype2hdf5(type->
m_stype, type->
m_ptype)) < 0)
780 if ((m->dset = H5Dcreate2(
781 m_stack_h5stream.back(), name, m->dtype, m->dspace,
782 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
789 CSerializableHdf5File::write_type_end_wrapped(
790 const TSGDataType* type,
const char* name,
const char* prefix)
792 if (type->
m_ptype == PT_SGOBJECT)
793 if (!group_close())
return false;
795 delete m_stack_type.back(); m_stack_type.pop_back();
#define SG_NOTIMPLEMENTED
#define SG_SNOTIMPLEMENTED
static void ptype_to_string(char *dest, EPrimitiveType ptype, size_t n)
Datatypes that shogun supports.
void to_string(char *dest, size_t n) const
all of classes and functions are contained in the shogun namespace
template class SGSparseVectorEntry
char string_t[STRING_LEN]
void init(FILE *fstream, char task, const char *filename)
static size_t sizeof_sparseentry(EPrimitiveType ptype)