*** ov-cell.cc~ 2004-02-20 22:16:54.000000000 +0100 --- ov-cell.cc 2004-03-03 16:33:58.000000000 +0100 *************** *** 690,730 **** bool octave_cell::save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { ! hsize_t dimens[3]; hid_t space_hid = -1, data_hid = -1, size_hid = -1; data_hid = H5Gcreate (loc_id, name, 0); if (data_hid < 0) return false; ! // Have to save rows/columns since can't have a dataset of groups.... ! space_hid = H5Screate_simple (0, dimens, (hsize_t*) 0); if (space_hid < 0) { H5Gclose (data_hid); return false; } ! size_hid = H5Dcreate (data_hid, "rows", H5T_NATIVE_INT, space_hid, ! H5P_DEFAULT); ! if (size_hid < 0) ! { ! H5Sclose (space_hid); ! H5Gclose (data_hid); ! return false; ! } ! int rc = rows(); ! if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, ! H5P_DEFAULT, (void*) &rc) < 0) ! { ! H5Dclose (size_hid); ! H5Sclose (space_hid); ! H5Gclose (data_hid); ! return false; ! } ! H5Dclose (size_hid); ! size_hid = H5Dcreate (data_hid, "columns", H5T_NATIVE_INT, space_hid, H5P_DEFAULT); if (size_hid < 0) { --- 690,718 ---- bool octave_cell::save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { ! dim_vector dv = dims (); ! hsize_t rank = dv.length(); hid_t space_hid = -1, data_hid = -1, size_hid = -1; data_hid = H5Gcreate (loc_id, name, 0); if (data_hid < 0) return false; ! // Have to save cell array shape, since can't have a ! // dataset of groups.... ! space_hid = H5Screate_simple (1, &rank, (hsize_t*) 0); if (space_hid < 0) { H5Gclose (data_hid); return false; } ! OCTAVE_LOCAL_BUFFER (int, hdims, rank); ! // Octave uses column-major, while HDF5 uses row-major ordering ! for (int i = 0; i < (int)rank; i++) ! hdims[i] = dv (rank-i-1); ! size_hid = H5Dcreate (data_hid, "dims", H5T_NATIVE_INT, space_hid, H5P_DEFAULT); if (size_hid < 0) { *************** *** 733,741 **** return false; } - rc = columns(); if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, ! H5P_DEFAULT, (void*) &rc) < 0) { H5Dclose (size_hid); H5Sclose (space_hid); --- 721,728 ---- return false; } if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, ! H5P_DEFAULT, (void*) hdims) < 0) { H5Dclose (size_hid); H5Sclose (space_hid); *************** *** 748,766 **** // recursively add each element of the cell to this group Cell tmp = cell_value (); ! for (int j = 0; j < tmp.cols (); j++) { ! for (int i = 0; i < tmp.rows (); i++) ! { ! char s[20]; ! sprintf (s, "_%d", (i + j * tmp.rows ())); ! if (! add_hdf5_data(data_hid, tmp.elem (i, j), s, "", false, ! save_as_floats)) ! { ! H5Gclose (data_hid); ! return false; ! } } } --- 735,750 ---- // recursively add each element of the cell to this group Cell tmp = cell_value (); ! for (int i = 0; i < dv.numel (); i++) { ! char s[20]; ! sprintf (s, "_%d", i); ! if (! add_hdf5_data(data_hid, tmp.elem (i), s, "", false, ! save_as_floats)) ! { ! H5Gclose (data_hid); ! return false; } } *************** *** 778,816 **** if (group_id < 0) return false; ! hid_t data_hid = H5Dopen (group_id, "rows"); hid_t space_hid = H5Dget_space (data_hid); hsize_t rank = H5Sget_simple_extent_ndims (space_hid); ! if (rank != 0) ! { ! H5Dclose(data_hid); ! H5Gclose(group_id); ! return false; ! } ! ! int nr; ! if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, ! H5P_DEFAULT, (void *) &nr) < 0) ! { ! H5Dclose(data_hid); ! H5Gclose(group_id); ! return false; ! } ! H5Dclose (data_hid); ! ! data_hid = H5Dopen (group_id, "columns"); ! space_hid = H5Dget_space (data_hid); ! rank = H5Sget_simple_extent_ndims (space_hid); ! if (rank != 0) { H5Dclose(data_hid); H5Gclose(group_id); return false; } ! int nc; if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, ! H5P_DEFAULT, (void *) &nc) < 0) { H5Dclose(data_hid); H5Gclose(group_id); --- 762,788 ---- if (group_id < 0) return false; ! hid_t data_hid = H5Dopen (group_id, "dims"); hid_t space_hid = H5Dget_space (data_hid); hsize_t rank = H5Sget_simple_extent_ndims (space_hid); ! if (rank != 1) { H5Dclose(data_hid); H5Gclose(group_id); return false; } ! OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); ! OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); ! H5Sget_simple_extent_dims (space_hid, hdims, maxdims); ! ! // Octave uses column-major, while HDF5 uses row-major ordering ! dim_vector dv; ! dv.resize (hdims[0]); ! OCTAVE_LOCAL_BUFFER (int, tmp, hdims[0]); ! if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, ! H5P_DEFAULT, (void *) tmp) < 0) { H5Dclose(data_hid); H5Gclose(group_id); *************** *** 819,862 **** H5Dclose (data_hid); H5Gclose (group_id); hdf5_callback_data dsub; herr_t retval2 = -1; ! Cell m (nr, nc); int current_item = 0; if (have_h5giterate_bug) ! current_item = 2; // Skip row/columns items in group #ifdef HAVE_H5GGET_NUM_OBJS hsize_t num_obj = 0; H5Gget_num_objs (loc_id, &num_obj); #endif ! for (int j = 0; j < nc; j++) { - for (int i = 0; i < nr; i++) - { #ifdef HAVE_H5GGET_NUM_OBJS ! if (current_item >= static_cast (num_obj)) ! retval2 = -1; ! else #endif ! retval2 = H5Giterate (loc_id, name, ¤t_item, ! hdf5_read_next_data, &dsub); ! ! if (retval2 <= 0) ! break; ! octave_value ov = dsub.tc; ! m.elem (i, j) = ov; ! if (have_h5giterate_bug) ! current_item++; // H5Giterate returned the last index processed - } - if (retval2 <= 0) - break; } if (retval2 >= 0) --- 791,832 ---- H5Dclose (data_hid); H5Gclose (group_id); + for (int i = 0, j = hdims[0] - 1; i < (int)hdims[0]; i++, j--) + dv(j) = tmp[i]; + hdf5_callback_data dsub; herr_t retval2 = -1; ! Cell m (dv); int current_item = 0; if (have_h5giterate_bug) ! current_item = 1; // Skip dims items in group #ifdef HAVE_H5GGET_NUM_OBJS hsize_t num_obj = 0; H5Gget_num_objs (loc_id, &num_obj); #endif ! for (int i = 0; i < dv.numel (); i++) { #ifdef HAVE_H5GGET_NUM_OBJS ! if (current_item >= static_cast (num_obj)) ! retval2 = -1; ! else #endif ! retval2 = H5Giterate (loc_id, name, ¤t_item, ! hdf5_read_next_data, &dsub); ! ! if (retval2 <= 0) ! break; ! octave_value ov = dsub.tc; ! m.elem (i) = ov; ! if (have_h5giterate_bug) ! current_item++; // H5Giterate returned the last index processed } if (retval2 >= 0) *** ChangeLog.orig 2004-02-20 22:16:54.000000000 +0100 --- ChangeLog 2004-03-03 16:48:26.000000000 +0100 *************** *** 1,3 **** --- 1,7 ---- + 2004-03-03 David Bateman + + * ov-cell.cc (save_hdf5, load_hdf5): Allow Nd arrays in HDF5 files + 2004-02-20 John W. Eaton * version.h (OCTAVE_VERSION): Now 2.1.55.