Mercurial > hg > octave-nkf
diff src/ov-bool-mat.cc @ 4687:e95c86d48732
[project @ 2004-01-06 21:53:34 by jwe]
author | jwe |
---|---|
date | Tue, 06 Jan 2004 21:53:34 +0000 |
parents | 7849788ca4bd |
children | 14dc2267c343 |
line wrap: on
line diff
--- a/src/ov-bool-mat.cc +++ b/src/ov-bool-mat.cc @@ -44,6 +44,11 @@ #include "ov-re-mat.h" #include "pr-output.h" +#include "byte-swap.h" +#include "ls-oct-ascii.h" +#include "ls-hdf5.h" +#include "ls-utils.h" + template class octave_base_matrix<boolNDArray>; DEFINE_OCTAVE_ALLOCATOR (octave_bool_matrix); @@ -148,6 +153,289 @@ current_print_indent_level ()); } +bool +octave_bool_matrix::save_ascii (std::ostream& os, bool& /* infnan_warned */, + bool /* strip_nan_and_inf */) +{ + dim_vector d = dims (); + if (d.length () > 2) + { + NDArray tmp = array_value (); + os << "# ndims: " << d.length () << "\n"; + + for (int i=0; i < d.length (); i++) + os << " " << d (i); + + os << "\n" << tmp; + } + else + { + // Keep this case, rather than use generic code above for backward + // compatiability. Makes load_ascii much more complex!! + os << "# rows: " << rows () << "\n" + << "# columns: " << columns () << "\n"; + + Matrix tmp = matrix_value (); + + os << tmp; + } + + return true; +} + +bool +octave_bool_matrix::load_ascii (std::istream& is) +{ + int mdims = 0; + bool success = true; + std::streampos pos = is.tellg (); + + if (extract_keyword (is, "ndims", mdims, true)) + { + if (mdims >= 0) + { + dim_vector dv; + dv.resize (mdims); + + for (int i = 0; i < mdims; i++) + is >> dv(i); + + NDArray tmp(dv); + is >> tmp; + + if (!is) + { + error ("load: failed to load matrix constant"); + success = false; + } + + boolNDArray btmp (dv); + for (int i = 0; i < btmp.nelem (); i++) + btmp.elem (i) = (tmp.elem (i) != 0.); + + matrix = btmp; + } + else + { + error ("load: failed to extract number of rows and columns"); + success = false; + } + } + else + { + int nr = 0; + int nc = 0; + + // re-read the same line again + is.clear (); + is.seekg (pos); + + if (extract_keyword (is, "rows", nr) && nr >= 0 + && extract_keyword (is, "columns", nc) && nc >= 0) + { + if (nr > 0 && nc > 0) + { + Matrix tmp (nr, nc); + is >> tmp; + if (!is) + { + error ("load: failed to load matrix constant"); + success = false; + } + + boolMatrix btmp (nr,nc); + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + btmp.elem (i,j) = (tmp.elem (i, j) != 0.); + + matrix = btmp; + } + else if (nr == 0 || nc == 0) + matrix = boolMatrix (nr, nc); + else + panic_impossible (); + } + else + { + error ("load: failed to extract number of rows and columns"); + success = false; + } + } + + return success; +} + +bool +octave_bool_matrix::save_binary (std::ostream& os, bool& /* save_as_floats */) +{ + + dim_vector d = dims (); + if (d.length() < 1) + return false; + + // Use negative value for ndims to differentiate with old format!! + FOUR_BYTE_INT tmp = - d.length(); + os.write (X_CAST (char *, &tmp), 4); + for (int i=0; i < d.length (); i++) + { + tmp = d(i); + os.write (X_CAST (char *, &tmp), 4); + } + + boolNDArray m = bool_array_value (); + bool *mtmp = m.fortran_vec (); + int nel = m.nelem (); + OCTAVE_LOCAL_BUFFER (char, htmp, nel); + + for (int i = 0; i < nel; i++) + htmp[i] = (mtmp[i] ? 1 : 0); + + os.write (htmp, nel); + + return true; +} + +bool +octave_bool_matrix::load_binary (std::istream& is, bool swap, + oct_mach_info::float_format /* fmt */) +{ + FOUR_BYTE_INT mdims; + if (! is.read (X_CAST (char *, &mdims), 4)) + return false; + if (swap) + swap_4_bytes (X_CAST (char *, &mdims)); + if (mdims >= 0) + return false; + + // mdims is negative for consistency with other matrices, where it is + // negative to allow the positive value to be used for rows/cols for + // backward compatibility + mdims = - mdims; + FOUR_BYTE_INT di; + dim_vector dv; + dv.resize (mdims); + + for (int i = 0; i < mdims; i++) + { + if (! is.read (X_CAST (char *, &di), 4)) + return false; + if (swap) + swap_4_bytes (X_CAST (char *, &di)); + dv(i) = di; + } + + int nel = dv.numel (); + OCTAVE_LOCAL_BUFFER (char, htmp, nel); + if (! is.read (htmp, nel)) + return false; + boolNDArray m(dv); + bool *mtmp = m.fortran_vec (); + for (int i = 0; i < nel; i++) + mtmp[i] = (htmp[i] ? 1 : 0); + matrix = m; + + return true; +} + +#if defined (HAVE_HDF5) +bool +octave_bool_matrix::save_hdf5 (hid_t loc_id, const char *name, + bool /* save_as_floats */) +{ + dim_vector d = dims (); + hsize_t hdims[d.length () > 2 ? d.length () : 3]; + hid_t space_hid = -1, data_hid = -1; + int rank = ( (d (0) == 1) && (d.length () == 2) ? 1 : d.length ()); + bool retval = true; + + boolNDArray m = bool_array_value (); + + // Octave uses column-major, while HDF5 uses row-major ordering + for (int i = 0, j = d.length() - 1; i < d.length (); i++, j--) + hdims[i] = d (j); + + space_hid = H5Screate_simple (rank, hdims, (hsize_t*) 0); + if (space_hid < 0) return false; + + data_hid = H5Dcreate (loc_id, name, H5T_NATIVE_HBOOL, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + return false; + } + + int nel = m.nelem (); + bool *mtmp = m.fortran_vec (); + hbool_t htmp[nel]; + + for (int i = 0; i < nel; i++) + htmp[i] = mtmp[i]; + + retval = H5Dwrite (data_hid, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void*) htmp) >= 0; + + H5Dclose (data_hid); + H5Sclose (space_hid); + return retval; +} + +bool +octave_bool_matrix::load_hdf5 (hid_t loc_id, const char *name, + bool /* have_h5giterate_bug */) +{ + bool retval = false; + hid_t data_hid = H5Dopen (loc_id, name); + hid_t space_id = H5Dget_space (data_hid); + + hsize_t rank = H5Sget_simple_extent_ndims (space_id); + + if (rank < 1) + { + H5Dclose (data_hid); + return false; + } + + OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); + OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); + + H5Sget_simple_extent_dims (space_id, hdims, maxdims); + + dim_vector dv; + + // Octave uses column-major, while HDF5 uses row-major ordering + if (rank == 1) + { + dv.resize (2); + dv(0) = 1; + dv(1) = hdims[0]; + } + else + { + dv.resize (rank); + for (int i = 0, j = rank - 1; i < (int)rank; i++, j--) + dv(j) = hdims[i]; + } + + int nel = dv.numel (); + hbool_t htmp[nel]; + if (H5Dread (data_hid, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) htmp) >= 0) + { + retval = true; + + boolNDArray btmp (dv); + for (int i = 0; i < nel; i++) + btmp.elem (i) = htmp[i]; + + matrix = btmp; + } + + H5Dclose (data_hid); + return retval; +} +#endif + /* ;;; Local Variables: *** ;;; mode: C++ ***