1+ package org .hdf5javalib .examples .h5ex_tutr ;
2+
3+ import org .hdf5javalib .dataclass .HdfData ;
4+ import org .hdf5javalib .datasource .TypedDataSource ;
5+ import org .hdf5javalib .datatype .FixedPointDatatype ;
6+ import org .hdf5javalib .examples .ResourceLoader ;
7+ import org .hdf5javalib .hdfjava .HdfDataset ;
8+ import org .hdf5javalib .hdfjava .HdfFileReader ;
9+
10+ import java .nio .channels .SeekableByteChannel ;
11+ import java .util .Arrays ;
12+ import java .util .function .IntBinaryOperator ;
13+
14+ import static org .junit .jupiter .api .Assertions .assertArrayEquals ;
15+
16+ import org .junit .jupiter .api .Test ;
17+
18+ public class H5exTutrReadTest {
19+
20+ private int [][] toIntMatrix (HdfData [][] data ) {
21+ int [][] res = new int [data .length ][data [0 ].length ];
22+ for (int i = 0 ; i < data .length ; i ++) {
23+ for (int j = 0 ; j < data [i ].length ; j ++) {
24+ res [i ][j ] = data [i ][j ].getInstance (Long .class ).intValue ();
25+ }
26+ }
27+ return res ;
28+ }
29+
30+ private double [][] toDoubleMatrix (HdfData [][] data ) {
31+ double [][] res = new double [data .length ][data [0 ].length ];
32+ for (int i = 0 ; i < data .length ; i ++) {
33+ for (int j = 0 ; j < data [i ].length ; j ++) {
34+ res [i ][j ] = data [i ][j ].getInstance (Double .class );
35+ }
36+ }
37+ return res ;
38+ }
39+
40+ private int [] toIntArray (HdfData [] data ) {
41+ int [] res = new int [data .length ];
42+ for (int i = 0 ; i < data .length ; i ++) {
43+ res [i ] = data [i ].getInstance (Long .class ).intValue ();
44+ }
45+ return res ;
46+ }
47+
48+ // private double[] toMixedArray(HdfData[] data) {
49+ // double[] res = new double[data.length];
50+ // for (int i = 0; i < data.length; i++) {
51+ // HdfData d = data[i];
52+ // if (d instanceof FixedPointDatatype) {
53+ // res[i] = d.getInstance(Long.class).doubleValue();
54+ // } else if (d.getDatatype() instanceof org.hdf5javalib.hdfjava.datatype.FloatingPointDatatype) {
55+ // res[i] = d.getInstance(Double.class);
56+ // }
57+ // }
58+ // return res;
59+ // }
60+
61+ private String [] toStringArray (HdfData [] data ) {
62+ String [] res = new String [data .length ];
63+ for (int i = 0 ; i < data .length ; i ++) {
64+ res [i ] = data [i ].getInstance (String .class );
65+ }
66+ return res ;
67+ }
68+
69+ private int [][] generateExpectedIntMatrix (int rows , int cols , IntBinaryOperator op ) {
70+ int [][] exp = new int [rows ][cols ];
71+ for (int i = 0 ; i < rows ; i ++) {
72+ for (int j = 0 ; j < cols ; j ++) {
73+ exp [i ][j ] = op .applyAsInt (i , j );
74+ }
75+ }
76+ return exp ;
77+ }
78+
79+ @ Test
80+ void testCmprss () throws Exception {
81+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/cmprss.h5" )) {
82+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
83+ HdfDataset dataSet = reader .getDataset ("/Compressed_Data" ).orElseThrow ();
84+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
85+ HdfData [][] data = dataSource .readMatrix ();
86+ int [][] expected = generateExpectedIntMatrix (100 , 20 , (i , j ) -> i + j );
87+ assertArrayEquals (expected , toIntMatrix (data ));
88+ }
89+ }
90+
91+ @ Test
92+ void testDset () throws Exception {
93+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/dset.h5" )) {
94+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
95+ HdfDataset dataSet = reader .getDataset ("/dset" ).orElseThrow ();
96+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
97+ HdfData [][] data = dataSource .readMatrix ();
98+ int [][] expected = generateExpectedIntMatrix (4 , 6 , (i , j ) -> i * 6 + j + 1 );
99+ assertArrayEquals (expected , toIntMatrix (data ));
100+ }
101+ }
102+
103+ @ Test
104+ void testExtend () throws Exception {
105+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/extend.h5" )) {
106+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
107+ HdfDataset dataSet = reader .getDataset ("/ExtendibleArray" ).orElseThrow ();
108+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
109+ HdfData [][] data = dataSource .readMatrix ();
110+ int [][] expected = new int [10 ][3 ];
111+ for (int i = 0 ; i < 3 ; i ++) {
112+ Arrays .fill (expected [i ], 1 );
113+ }
114+ for (int i = 3 ; i < 10 ; i ++) {
115+ expected [i ][0 ] = 2 ;
116+ expected [i ][1 ] = 3 ;
117+ expected [i ][2 ] = 4 ;
118+ }
119+ assertArrayEquals (expected , toIntMatrix (data ));
120+ }
121+ }
122+
123+ @ Test
124+ void testGroups () throws Exception {
125+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/groups.h5" )) {
126+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
127+ HdfDataset dataSet = reader .getDataset ("/MyGroup/Group_A/dset2" ).orElseThrow ();
128+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
129+ HdfData [][] data = dataSource .readMatrix ();
130+ int [][] expected = generateExpectedIntMatrix (2 , 10 , (i , j ) -> j + 1 );
131+ assertArrayEquals (expected , toIntMatrix (data ));
132+
133+ dataSet = reader .getDataset ("/MyGroup/dset1" ).orElseThrow ();
134+ dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
135+ data = dataSource .readMatrix ();
136+ expected = generateExpectedIntMatrix (3 , 3 , (i , j ) -> j + 1 );
137+ assertArrayEquals (expected , toIntMatrix (data ));
138+ }
139+ }
140+
141+ @ Test
142+ void testMount2 () throws Exception {
143+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/mount2.h5" )) {
144+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
145+ HdfDataset dataSet = reader .getDataset ("/D" ).orElseThrow ();
146+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
147+ HdfData [][] data = dataSource .readMatrix ();
148+ int [][] expected = generateExpectedIntMatrix (4 , 5 , (i , j ) -> i + j );
149+ assertArrayEquals (expected , toIntMatrix (data ));
150+ }
151+ }
152+
153+ @ Test
154+ void testRefere () throws Exception {
155+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/refere.h5" )) {
156+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
157+ HdfDataset dataSet = reader .getDataset ("/B" ).orElseThrow ();
158+ // TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
159+ // HdfData[][] data = dataSource.readMatrix();
160+ // int[][] intData = toIntMatrix(data);
161+ // int[][] expected = {
162+ // {1, 1, 2, 3, 3, 4, 5, 5, 6},
163+ // {1, 2, 2, 3, 4, 4, 5, 6, 6}
164+ // };
165+ // assertArrayEquals(expected, intData);
166+
167+ dataSet = reader .getDataset ("/R" ).orElseThrow ();
168+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
169+ HdfData [] data1 = dataSource .readVector ();
170+ String [] actual = toStringArray (data1 );
171+ assertArrayEquals (new String []{"/A" , "/B" }, actual );
172+ }
173+ }
174+
175+ @ Test
176+ void testReferDeprec () throws Exception {
177+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/refer_deprec.h5" )) {
178+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
179+ HdfDataset dataSet = reader .getDataset ("/dataset1" ).orElseThrow ();
180+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
181+ HdfData [] data = dataSource .readVector ();
182+ int [] expected = {0 , 1 , 2 , 3 };
183+ assertArrayEquals (expected , toIntArray (data ));
184+
185+ dataSet = reader .getDataset ("/references" ).orElseThrow ();
186+ dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
187+ data = dataSource .readVector ();
188+ String [] actual = toStringArray (data );
189+ assertArrayEquals (new String []{"/dataset1" }, actual );
190+ }
191+ }
192+
193+ @ Test
194+ void testReferExtern1 () throws Exception {
195+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/refer_extern1.h5" )) {
196+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
197+ HdfDataset dataSet = reader .getDataset ("/dataset1" ).orElseThrow ();
198+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
199+ HdfData [] data = dataSource .readVector ();
200+ int [] expected = {0 , 1 , 2 , 3 };
201+ assertArrayEquals (expected , toIntArray (data ));
202+ }
203+ }
204+
205+ @ Test
206+ void testRefReg () throws Exception {
207+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/REF_REG.h5" )) {
208+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
209+ HdfDataset dataSet = reader .getDataset ("/MATRIX" ).orElseThrow ();
210+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
211+ HdfData [][] data = dataSource .readMatrix ();
212+ int [][] expected = {
213+ {1 , 1 , 2 , 3 , 3 , 4 , 5 , 5 , 6 },
214+ {1 , 2 , 2 , 3 , 4 , 4 , 5 , 6 , 6 }
215+ };
216+ assertArrayEquals (expected , toIntMatrix (data ));
217+
218+ // For /REGION_REFERENCES, assuming the library returns specific structures
219+ // Skipping detailed assertion for region references as the exact structure is unknown
220+ // Can add if more information is available
221+ }
222+ }
223+
224+ @ Test
225+ void testSDS () throws Exception {
226+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/SDS.h5" )) {
227+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
228+ HdfDataset dataSet = reader .getDataset ("/IntArray" ).orElseThrow ();
229+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
230+ HdfData [][] data = dataSource .readMatrix ();
231+ int [][] expected = generateExpectedIntMatrix (5 , 6 , (i , j ) -> i + j );
232+ assertArrayEquals (expected , toIntMatrix (data ));
233+ }
234+ }
235+
236+ // @Test
237+ // void testSDScompound() throws Exception {
238+ // try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/SDScompound.h5")) {
239+ // HdfFileReader reader = new HdfFileReader(channel).readFile();
240+ // HdfDataset dataSet = reader.getDataset("/ArrayOfStructures").orElseThrow();
241+ // TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
242+ // HdfData[] data = dataSource.readVector();
243+ // double[] expected = {0, 1.0, 0.0, 1, 0.5, 1.0, 2, 1.0/3, 4.0, 3, 1.0/4, 9.0, 4, 1.0/5, 16.0, 5, 1.0/6, 25.0, 6, 1.0/7, 36.0, 7, 1.0/8, 49.0, 8, 1.0/9, 64.0, 9, 1.0/10, 81.0};
244+ // assertArrayEquals(expected, toMixedArray(data), 1e-5);
245+ // }
246+ // }
247+
248+ @ Test
249+ void testSDSextendible () throws Exception {
250+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/SDSextendible.h5" )) {
251+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
252+ HdfDataset dataSet = reader .getDataset ("/ExtendibleArray" ).orElseThrow ();
253+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
254+ HdfData [][] data = dataSource .readMatrix ();
255+ int [][] expected = new int [10 ][5 ];
256+ for (int i = 0 ; i < 2 ; i ++) {
257+ expected [i ] = new int []{1 , 1 , 1 , 3 , 3 };
258+ }
259+ expected [2 ] = new int []{1 , 1 , 1 , 0 , 0 };
260+ for (int i = 3 ; i < 10 ; i ++) {
261+ expected [i ] = new int []{2 , 0 , 0 , 0 , 0 };
262+ }
263+ assertArrayEquals (expected , toIntMatrix (data ));
264+ }
265+ }
266+
267+ @ Test
268+ void testSelect () throws Exception {
269+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/Select.h5" )) {
270+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
271+ HdfDataset dataSet = reader .getDataset ("/Matrix in file" ).orElseThrow ();
272+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
273+ HdfData [][] data = dataSource .readMatrix ();
274+ int [][] expected = {
275+ {53 , 1 , 2 , 0 , 3 , 4 , 0 , 5 , 6 , 0 , 7 , 8 },
276+ {0 , 9 , 10 , 0 , 11 , 12 , 0 , 13 , 14 , 0 , 15 , 16 },
277+ {0 , 17 , 18 , 0 , 19 , 20 , 0 , 21 , 22 , 0 , 23 , 24 },
278+ {0 , 0 , 0 , 59 , 0 , 61 , 0 , 0 , 0 , 0 , 0 , 0 },
279+ {0 , 25 , 26 , 0 , 27 , 28 , 0 , 29 , 30 , 0 , 31 , 32 },
280+ {0 , 33 , 34 , 0 , 35 , 36 , 67 , 37 , 38 , 0 , 39 , 40 },
281+ {0 , 41 , 42 , 0 , 43 , 44 , 0 , 45 , 46 , 0 , 47 , 48 },
282+ {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
283+ };
284+ assertArrayEquals (expected , toIntMatrix (data ));
285+ }
286+ }
287+
288+ @ Test
289+ void testSubset () throws Exception {
290+ try (SeekableByteChannel channel = ResourceLoader .loadResourceAsChannel ("h5ex_tutr/subset.h5" )) {
291+ HdfFileReader reader = new HdfFileReader (channel ).readFile ();
292+ HdfDataset dataSet = reader .getDataset ("/IntArray" ).orElseThrow ();
293+ TypedDataSource <HdfData > dataSource = new TypedDataSource <>(channel , reader , dataSet , HdfData .class );
294+ HdfData [][] data = dataSource .readMatrix ();
295+ int [][] expected = {
296+ {1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 },
297+ {1 , 1 , 5 , 5 , 5 , 5 , 2 , 2 , 2 , 2 },
298+ {1 , 1 , 5 , 5 , 5 , 5 , 2 , 2 , 2 , 2 },
299+ {1 , 1 , 5 , 5 , 5 , 5 , 2 , 2 , 2 , 2 },
300+ {1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 },
301+ {1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 },
302+ {1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 },
303+ {1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 }
304+ };
305+ assertArrayEquals (expected , toIntMatrix (data ));
306+ }
307+ }
308+ }
0 commit comments