comparison src/ov-cell.cc @ 4814:495e9df75836

[project @ 2004-03-03 23:46:38 by jwe]
author jwe
date Wed, 03 Mar 2004 23:46:38 +0000
parents 62f2fb593455
children 2eb844b27953
comparison
equal deleted inserted replaced
4813:fba5c6e96e0f 4814:495e9df75836
688 688
689 #if defined (HAVE_HDF5) 689 #if defined (HAVE_HDF5)
690 bool 690 bool
691 octave_cell::save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) 691 octave_cell::save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats)
692 { 692 {
693 hsize_t dimens[3]; 693 dim_vector dv = dims ();
694 hsize_t rank = dv.length();
694 hid_t space_hid = -1, data_hid = -1, size_hid = -1; 695 hid_t space_hid = -1, data_hid = -1, size_hid = -1;
695 696
696 data_hid = H5Gcreate (loc_id, name, 0); 697 data_hid = H5Gcreate (loc_id, name, 0);
697 if (data_hid < 0) return false; 698 if (data_hid < 0) return false;
698 699
699 // Have to save rows/columns since can't have a dataset of groups.... 700 // Have to save cell array shape, since can't have a
700 space_hid = H5Screate_simple (0, dimens, (hsize_t*) 0); 701 // dataset of groups....
702 space_hid = H5Screate_simple (1, &rank, (hsize_t*) 0);
701 if (space_hid < 0) 703 if (space_hid < 0)
702 { 704 {
703 H5Gclose (data_hid); 705 H5Gclose (data_hid);
704 return false; 706 return false;
705 } 707 }
706 708
707 size_hid = H5Dcreate (data_hid, "rows", H5T_NATIVE_INT, space_hid, 709 OCTAVE_LOCAL_BUFFER (int, hdims, rank);
710
711 // Octave uses column-major, while HDF5 uses row-major ordering
712 for (int i = 0; i < (int)rank; i++)
713 hdims[i] = dv (rank-i-1);
714
715 size_hid = H5Dcreate (data_hid, "dims", H5T_NATIVE_INT, space_hid,
708 H5P_DEFAULT); 716 H5P_DEFAULT);
709 if (size_hid < 0) 717 if (size_hid < 0)
710 { 718 {
711 H5Sclose (space_hid); 719 H5Sclose (space_hid);
712 H5Gclose (data_hid); 720 H5Gclose (data_hid);
713 return false; 721 return false;
714 } 722 }
715 723
716 int rc = rows();
717 if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 724 if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
718 H5P_DEFAULT, (void*) &rc) < 0) 725 H5P_DEFAULT, (void*) hdims) < 0)
719 { 726 {
720 H5Dclose (size_hid); 727 H5Dclose (size_hid);
721 H5Sclose (space_hid); 728 H5Sclose (space_hid);
722 H5Gclose (data_hid); 729 H5Gclose (data_hid);
723 return false; 730 return false;
724 } 731 }
725 H5Dclose (size_hid); 732 H5Dclose (size_hid);
726
727 size_hid = H5Dcreate (data_hid, "columns", H5T_NATIVE_INT, space_hid,
728 H5P_DEFAULT);
729 if (size_hid < 0)
730 {
731 H5Sclose (space_hid);
732 H5Gclose (data_hid);
733 return false;
734 }
735
736 rc = columns();
737 if (! H5Dwrite (size_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
738 H5P_DEFAULT, (void*) &rc) < 0)
739 {
740 H5Dclose (size_hid);
741 H5Sclose (space_hid);
742 H5Gclose (data_hid);
743 return false;
744 }
745 H5Dclose (size_hid);
746 H5Sclose (space_hid); 733 H5Sclose (space_hid);
747 734
748 // recursively add each element of the cell to this group 735 // recursively add each element of the cell to this group
749 Cell tmp = cell_value (); 736 Cell tmp = cell_value ();
750 737
751 for (int j = 0; j < tmp.cols (); j++) 738 for (int i = 0; i < dv.numel (); i++)
752 { 739 {
753 for (int i = 0; i < tmp.rows (); i++) 740 char s[20];
754 { 741 sprintf (s, "_%d", i);
755 char s[20]; 742
756 sprintf (s, "_%d", (i + j * tmp.rows ())); 743 if (! add_hdf5_data(data_hid, tmp.elem (i), s, "", false,
757 744 save_as_floats))
758 if (! add_hdf5_data(data_hid, tmp.elem (i, j), s, "", false, 745 {
759 save_as_floats)) 746 H5Gclose (data_hid);
760 { 747 return false;
761 H5Gclose (data_hid);
762 return false;
763 }
764 } 748 }
765 } 749 }
766 750
767 H5Gclose (data_hid); 751 H5Gclose (data_hid);
768 return true; 752 return true;
776 hid_t group_id = H5Gopen (loc_id, name); 760 hid_t group_id = H5Gopen (loc_id, name);
777 761
778 if (group_id < 0) 762 if (group_id < 0)
779 return false; 763 return false;
780 764
781 hid_t data_hid = H5Dopen (group_id, "rows"); 765 hid_t data_hid = H5Dopen (group_id, "dims");
782 hid_t space_hid = H5Dget_space (data_hid); 766 hid_t space_hid = H5Dget_space (data_hid);
783 hsize_t rank = H5Sget_simple_extent_ndims (space_hid); 767 hsize_t rank = H5Sget_simple_extent_ndims (space_hid);
784 if (rank != 0) 768 if (rank != 1)
785 { 769 {
786 H5Dclose(data_hid); 770 H5Dclose(data_hid);
787 H5Gclose(group_id); 771 H5Gclose(group_id);
788 return false; 772 return false;
789 } 773 }
790 774
791 int nr; 775 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
776 OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank);
777 H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
778
779 // Octave uses column-major, while HDF5 uses row-major ordering
780 dim_vector dv;
781 dv.resize (hdims[0]);
782 OCTAVE_LOCAL_BUFFER (int, tmp, hdims[0]);
783
792 if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 784 if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
793 H5P_DEFAULT, (void *) &nr) < 0) 785 H5P_DEFAULT, (void *) tmp) < 0)
794 { 786 {
795 H5Dclose(data_hid); 787 H5Dclose(data_hid);
796 H5Gclose(group_id); 788 H5Gclose(group_id);
797 return false; 789 return false;
798 } 790 }
799 H5Dclose (data_hid); 791 H5Dclose (data_hid);
800
801 data_hid = H5Dopen (group_id, "columns");
802 space_hid = H5Dget_space (data_hid);
803 rank = H5Sget_simple_extent_ndims (space_hid);
804 if (rank != 0)
805 {
806 H5Dclose(data_hid);
807 H5Gclose(group_id);
808 return false;
809 }
810
811 int nc;
812 if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
813 H5P_DEFAULT, (void *) &nc) < 0)
814 {
815 H5Dclose(data_hid);
816 H5Gclose(group_id);
817 return false;
818 }
819 H5Dclose (data_hid);
820 H5Gclose (group_id); 792 H5Gclose (group_id);
821 793
794 for (int i = 0, j = hdims[0] - 1; i < (int)hdims[0]; i++, j--)
795 dv(j) = tmp[i];
796
822 hdf5_callback_data dsub; 797 hdf5_callback_data dsub;
823 798
824 herr_t retval2 = -1; 799 herr_t retval2 = -1;
825 Cell m (nr, nc); 800 Cell m (dv);
826 int current_item = 0; 801 int current_item = 0;
827 if (have_h5giterate_bug) 802 if (have_h5giterate_bug)
828 current_item = 2; // Skip row/columns items in group 803 current_item = 1; // Skip dims items in group
829 804
830 #ifdef HAVE_H5GGET_NUM_OBJS 805 #ifdef HAVE_H5GGET_NUM_OBJS
831 hsize_t num_obj = 0; 806 hsize_t num_obj = 0;
832 H5Gget_num_objs (loc_id, &num_obj); 807 H5Gget_num_objs (loc_id, &num_obj);
833 #endif 808 #endif
834 809
835 for (int j = 0; j < nc; j++) 810 for (int i = 0; i < dv.numel (); i++)
836 { 811 {
837 for (int i = 0; i < nr; i++)
838 {
839 812
840 #ifdef HAVE_H5GGET_NUM_OBJS 813 #ifdef HAVE_H5GGET_NUM_OBJS
841 if (current_item >= static_cast<int> (num_obj)) 814 if (current_item >= static_cast<int> (num_obj))
842 retval2 = -1; 815 retval2 = -1;
843 else 816 else
844 #endif 817 #endif
845 retval2 = H5Giterate (loc_id, name, &current_item, 818 retval2 = H5Giterate (loc_id, name, &current_item,
846 hdf5_read_next_data, &dsub); 819 hdf5_read_next_data, &dsub);
847 820
848 if (retval2 <= 0)
849 break;
850
851 octave_value ov = dsub.tc;
852 m.elem (i, j) = ov;
853
854 if (have_h5giterate_bug)
855 current_item++; // H5Giterate returned the last index processed
856
857 }
858 if (retval2 <= 0) 821 if (retval2 <= 0)
859 break; 822 break;
823
824 octave_value ov = dsub.tc;
825 m.elem (i) = ov;
826
827 if (have_h5giterate_bug)
828 current_item++; // H5Giterate returned the last index processed
829
860 } 830 }
861 831
862 if (retval2 >= 0) 832 if (retval2 >= 0)
863 { 833 {
864 matrix = m; 834 matrix = m;