comparison src/ov-base-int.cc @ 4903:bfe64e459ce3

[project @ 2004-06-14 19:20:26 by jwe]
author jwe
date Mon, 14 Jun 2004 19:20:26 +0000
parents
children f69e95587ba3
comparison
equal deleted inserted replaced
4902:bd043a433918 4903:bfe64e459ce3
1 /*
2
3 Copyright (C) 2004 John W. Eaton
4
5 This file is part of Octave.
6
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21 */
22
23 #if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
24 #pragma implementation
25 #endif
26
27 #ifdef HAVE_CONFIG_H
28 #include <config.h>
29 #endif
30
31 #include <climits>
32
33 #include <iostream>
34 #include <vector>
35
36 #include "lo-ieee.h"
37 #include "lo-utils.h"
38 #include "mx-base.h"
39 #include "quit.h"
40
41 #include "defun.h"
42 #include "gripes.h"
43 #include "oct-obj.h"
44 #include "oct-lvalue.h"
45 #include "ops.h"
46 #include "ov-base.h"
47 #include "ov-base-mat.h"
48 #include "ov-base-mat.cc"
49 #include "ov-base-scalar.h"
50 #include "ov-base-scalar.cc"
51 #include "ov-base-int.h"
52 #include "ov-int-traits.h"
53 #include "pr-output.h"
54 #include "variables.h"
55
56 #include "byte-swap.h"
57 #include "ls-oct-ascii.h"
58 #include "ls-utils.h"
59 #include "ls-hdf5.h"
60
61 template <class T>
62 octave_value *
63 octave_base_int_matrix<T>::try_narrowing_conversion (void)
64 {
65 octave_value *retval = 0;
66
67 if (matrix.nelem () == 1)
68 retval = new typename octave_value_int_traits<T>::scalar_type (matrix (0));
69
70 return retval;
71 }
72
73 template <class T>
74 bool
75 octave_base_int_matrix<T>::save_ascii (std::ostream& os, bool& infnan_warned,
76 bool /* strip_nan_and_inf */)
77 {
78 infnan_warned = false;
79
80 dim_vector d = dims ();
81
82 os << "# ndims: " << d.length () << "\n";
83
84 for (int i = 0; i < d.length (); i++)
85 os << " " << d (i);
86
87 os << "\n" << matrix;
88
89 return true;
90 }
91
92 template <class T>
93 bool
94 octave_base_int_matrix<T>::load_ascii (std::istream& is)
95 {
96 int mdims = 0;
97 bool success = true;
98
99 if (extract_keyword (is, "ndims", mdims, true))
100 {
101 if (mdims >= 0)
102 {
103 dim_vector dv;
104 dv.resize (mdims);
105
106 for (int i = 0; i < mdims; i++)
107 is >> dv(i);
108
109 T tmp(dv);
110
111 is >> tmp;
112
113 if (!is)
114 {
115 error ("load: failed to load matrix constant");
116 success = false;
117 }
118
119 matrix = tmp;
120 }
121 else
122 {
123 error ("load: failed to extract number of rows and columns");
124 success = false;
125 }
126 }
127 else
128 error ("load: failed to extract number of dimensions");
129
130 return success;
131 }
132
133 template <class T>
134 bool
135 octave_base_int_matrix<T>::save_binary (std::ostream& os, bool& save_as_floats)
136 {
137 #if 0
138
139 dim_vector d = dims ();
140 if (d.length() < 1)
141 return false;
142
143 // Use negative value for ndims to differentiate with old format!!
144 FOUR_BYTE_INT tmp = - d.length();
145 os.write (X_CAST (char *, &tmp), 4);
146 for (int i=0; i < d.length (); i++)
147 {
148 tmp = d(i);
149 os.write (X_CAST (char *, &tmp), 4);
150 }
151
152 NDArray m = array_value ();
153 save_type st = LS_DOUBLE;
154 if (save_as_floats)
155 {
156 if (m.too_large_for_float ())
157 {
158 warning ("save: some values too large to save as floats --");
159 warning ("save: saving as doubles instead");
160 }
161 else
162 st = LS_FLOAT;
163 }
164 else if (d.numel () > 8192) // XXX FIXME XXX -- make this configurable.
165 {
166 double max_val, min_val;
167 if (m.all_integers (max_val, min_val))
168 st = get_save_type (max_val, min_val);
169 }
170
171 const double *mtmp = m.data ();
172 write_doubles (os, mtmp, st, d.numel ());
173
174 #endif
175
176 return true;
177 }
178
179 template <class T>
180 bool
181 octave_base_int_matrix<T>::load_binary (std::istream& is, bool swap,
182 oct_mach_info::float_format fmt)
183 {
184 #if 0
185
186 char tmp;
187 FOUR_BYTE_INT mdims;
188 if (! is.read (X_CAST (char *, &mdims), 4))
189 return false;
190 if (swap)
191 swap_4_bytes (X_CAST (char *, &mdims));
192 if (mdims < 0)
193 {
194 mdims = - mdims;
195 FOUR_BYTE_INT di;
196 dim_vector dv;
197 dv.resize (mdims);
198
199 for (int i = 0; i < mdims; i++)
200 {
201 if (! is.read (X_CAST (char *, &di), 4))
202 return false;
203 if (swap)
204 swap_4_bytes (X_CAST (char *, &di));
205 dv(i) = di;
206 }
207
208 if (! is.read (X_CAST (char *, &tmp), 1))
209 return false;
210
211 NDArray m(dv);
212 double *re = m.fortran_vec ();
213 read_doubles (is, re, X_CAST (save_type, tmp), dv.numel (), swap, fmt);
214 if (error_state || ! is)
215 return false;
216 matrix = m;
217 }
218 else
219 {
220 FOUR_BYTE_INT nr, nc;
221 nr = mdims;
222 if (! is.read (X_CAST (char *, &nc), 4))
223 return false;
224 if (swap)
225 swap_4_bytes (X_CAST (char *, &nc));
226 if (! is.read (X_CAST (char *, &tmp), 1))
227 return false;
228 Matrix m (nr, nc);
229 double *re = m.fortran_vec ();
230 int len = nr * nc;
231 read_doubles (is, re, X_CAST (save_type, tmp), len, swap, fmt);
232 if (error_state || ! is)
233 return false;
234 matrix = m;
235 }
236
237 #endif
238
239 return true;
240 }
241
242 #if defined (HAVE_HDF5)
243
244 template <class T>
245 bool
246 octave_base_int_matrix<T>::save_hdf5 (hid_t loc_id, const char *name,
247 bool save_as_floats)
248 {
249 bool retval = true;
250
251 #if 0
252
253 dim_vector dv = dims ();
254 int empty = save_hdf5_empty (loc_id, name, dv);
255 if (empty)
256 return (empty > 0);
257
258 int rank = dv.length ();
259 hid_t space_hid = -1, data_hid = -1;
260 NDArray m = array_value ();
261
262 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
263
264 // Octave uses column-major, while HDF5 uses row-major ordering
265 for (int i = 0; i < rank; i++)
266 hdims[i] = dv (rank-i-1);
267
268 space_hid = H5Screate_simple (rank, hdims, 0);
269
270 if (space_hid < 0) return false;
271
272 hid_t save_type_hid = H5T_NATIVE_DOUBLE;
273
274 if (save_as_floats)
275 {
276 if (m.too_large_for_float ())
277 {
278 warning ("save: some values too large to save as floats --");
279 warning ("save: saving as doubles instead");
280 }
281 else
282 save_type_hid = H5T_NATIVE_FLOAT;
283 }
284 #if HAVE_HDF5_INT2FLOAT_CONVERSIONS
285 // hdf5 currently doesn't support float/integer conversions
286 else
287 {
288 double max_val, min_val;
289
290 if (m.all_integers (max_val, min_val))
291 save_type_hid
292 = save_type_to_hdf5 (get_save_type (max_val, min_val));
293 }
294 #endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */
295
296 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid,
297 H5P_DEFAULT);
298 if (data_hid < 0)
299 {
300 H5Sclose (space_hid);
301 return false;
302 }
303
304 double *mtmp = m.fortran_vec ();
305 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
306 H5P_DEFAULT, mtmp) >= 0;
307
308 H5Dclose (data_hid);
309 H5Sclose (space_hid);
310
311 #endif
312
313 return retval;
314 }
315
316 template <class T>
317 bool
318 octave_base_int_matrix<T>::load_hdf5 (hid_t loc_id, const char *name,
319 bool /* have_h5giterate_bug */)
320 {
321 bool retval = false;
322
323 #if 0
324
325 dim_vector dv;
326 int empty = load_hdf5_empty (loc_id, name, dv);
327 if (empty > 0)
328 matrix.resize(dv);
329 if (empty)
330 return (empty > 0);
331
332 hid_t data_hid = H5Dopen (loc_id, name);
333 hid_t space_id = H5Dget_space (data_hid);
334
335 hsize_t rank = H5Sget_simple_extent_ndims (space_id);
336
337 if (rank < 1)
338 {
339 H5Sclose (space_id);
340 H5Dclose (data_hid);
341 return false;
342 }
343
344 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
345 OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank);
346
347 H5Sget_simple_extent_dims (space_id, hdims, maxdims);
348
349 // Octave uses column-major, while HDF5 uses row-major ordering
350 if (rank == 1)
351 {
352 dv.resize (2);
353 dv(0) = 1;
354 dv(1) = hdims[0];
355 }
356 else
357 {
358 dv.resize (rank);
359 for (hsize_t i = 0, j = rank - 1; i < rank; i++, j--)
360 dv(j) = hdims[i];
361 }
362
363 NDArray m (dv);
364 double *re = m.fortran_vec ();
365 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
366 H5P_DEFAULT, re) >= 0)
367 {
368 retval = true;
369 matrix = m;
370 }
371
372 H5Sclose (space_id);
373 H5Dclose (data_hid);
374
375 #endif
376
377 return retval;
378 }
379
380 #endif
381
382 template <class T>
383 void
384 octave_base_int_matrix<T>::print_raw (std::ostream& os,
385 bool pr_as_read_syntax) const
386 {
387 octave_print_internal (os, matrix, pr_as_read_syntax,
388 current_print_indent_level ());
389 }
390
391 template <class T>
392 bool
393 octave_base_int_scalar<T>::save_ascii (std::ostream& os, bool& infnan_warned,
394 bool strip_nan_and_inf)
395 {
396 #if 0
397
398 double d = double_value ();
399
400 if (strip_nan_and_inf)
401 {
402 if (xisnan (d))
403 {
404 error ("only value to plot is NaN");
405 return false;
406 }
407 else
408 {
409 d = xisinf (d) ? (d > 0 ? OCT_RBV : -OCT_RBV) : d;
410 octave_write_double (os, d);
411 os << "\n";
412 }
413 }
414 else
415 {
416 if (! infnan_warned && (xisnan (d) || xisinf (d)))
417 {
418 warning ("save: Inf or NaN values may not be reloadable");
419 infnan_warned = true;
420 }
421
422 octave_write_double (os, d);
423 os << "\n";
424 }
425
426 #endif
427
428 return true;
429 }
430
431 template <class T>
432 bool
433 octave_base_int_scalar<T>::load_ascii (std::istream& is)
434 {
435 #if 0
436
437 scalar = octave_read_double (is);
438 if (!is)
439 {
440 error ("load: failed to load scalar constant");
441 return false;
442 }
443
444 #endif
445
446 return true;
447 }
448
449 template <class T>
450 bool
451 octave_base_int_scalar<T>::save_binary (std::ostream& os,
452 bool& /* save_as_floats */)
453 {
454 #if 0
455
456 char tmp = (char) LS_DOUBLE;
457 os.write (X_CAST (char *, &tmp), 1);
458 double dtmp = double_value ();
459 os.write (X_CAST (char *, &dtmp), 8);
460
461 #endif
462
463 return true;
464 }
465
466 template <class T>
467 bool
468 octave_base_int_scalar<T>::load_binary (std::istream& is, bool swap,
469 oct_mach_info::float_format fmt)
470 {
471 #if 0
472
473 char tmp;
474 if (! is.read (X_CAST (char *, &tmp), 1))
475 return false;
476
477 double dtmp;
478 read_doubles (is, &dtmp, X_CAST (save_type, tmp), 1, swap, fmt);
479 if (error_state || ! is)
480 return false;
481
482 scalar = dtmp;
483
484 #endif
485
486 return true;
487 }
488
489 #if defined (HAVE_HDF5)
490 template <class T>
491 bool
492 octave_base_int_scalar<T>::save_hdf5 (hid_t loc_id, const char *name,
493 bool /* save_as_floats */)
494 {
495 bool retval = true;
496
497 #if 0
498
499 hsize_t dimens[3];
500 hid_t space_hid = -1, data_hid = -1;
501
502 space_hid = H5Screate_simple (0, dimens, 0);
503 if (space_hid < 0) return false;
504
505 data_hid = H5Dcreate (loc_id, name, H5T_NATIVE_DOUBLE, space_hid,
506 H5P_DEFAULT);
507 if (data_hid < 0)
508 {
509 H5Sclose (space_hid);
510 return false;
511 }
512
513 double tmp = double_value ();
514 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
515 H5P_DEFAULT, &tmp) >= 0;
516
517 H5Dclose (data_hid);
518 H5Sclose (space_hid);
519
520 #endif
521
522 return retval;
523 }
524
525 template <class T>
526 bool
527 octave_base_int_scalar<T>::load_hdf5 (hid_t loc_id, const char *name,
528 bool /* have_h5giterate_bug */)
529 {
530 #if 0
531
532 hid_t data_hid = H5Dopen (loc_id, name);
533 hid_t space_id = H5Dget_space (data_hid);
534
535 hsize_t rank = H5Sget_simple_extent_ndims (space_id);
536
537 if (rank != 0)
538 {
539 H5Dclose (data_hid);
540 return false;
541 }
542
543 double dtmp;
544 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
545 H5P_DEFAULT, &dtmp) < 0)
546 {
547 H5Dclose (data_hid);
548 return false;
549 }
550
551 scalar = dtmp;
552
553 H5Dclose (data_hid);
554 #endif
555
556 return true;
557 }
558 #endif
559
560 /*
561 ;;; Local Variables: ***
562 ;;; mode: C++ ***
563 ;;; End: ***
564 */