comparison src/ov-base-int.cc @ 4917:f69e95587ba3

[project @ 2004-07-27 14:03:03 by jwe]
author jwe
date Tue, 27 Jul 2004 14:03:03 +0000
parents bfe64e459ce3
children 43f4ebd2704c
comparison
equal deleted inserted replaced
4916:c45f14873b5e 4917:f69e95587ba3
70 return retval; 70 return retval;
71 } 71 }
72 72
73 template <class T> 73 template <class T>
74 bool 74 bool
75 octave_base_int_matrix<T>::save_ascii (std::ostream& os, bool& infnan_warned, 75 octave_base_int_matrix<T>::save_ascii (std::ostream& os, bool&, bool)
76 bool /* strip_nan_and_inf */) 76 {
77 {
78 infnan_warned = false;
79
80 dim_vector d = dims (); 77 dim_vector d = dims ();
81 78
82 os << "# ndims: " << d.length () << "\n"; 79 os << "# ndims: " << d.length () << "\n";
83 80
84 for (int i = 0; i < d.length (); i++) 81 for (int i = 0; i < d.length (); i++)
130 return success; 127 return success;
131 } 128 }
132 129
133 template <class T> 130 template <class T>
134 bool 131 bool
135 octave_base_int_matrix<T>::save_binary (std::ostream& os, bool& save_as_floats) 132 octave_base_int_matrix<T>::save_binary (std::ostream& os, bool&)
136 { 133 {
137 #if 0
138
139 dim_vector d = dims (); 134 dim_vector d = dims ();
140 if (d.length() < 1) 135 if (d.length() < 1)
141 return false; 136 return false;
142 137
143 // Use negative value for ndims to differentiate with old format!! 138 // Use negative value for ndims to differentiate with old format!!
147 { 142 {
148 tmp = d(i); 143 tmp = d(i);
149 os.write (X_CAST (char *, &tmp), 4); 144 os.write (X_CAST (char *, &tmp), 4);
150 } 145 }
151 146
152 NDArray m = array_value (); 147 os.write (X_CAST(char *, matrix.data()), byte_size());
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 148
176 return true; 149 return true;
177 } 150 }
178 151
179 template <class T> 152 template <class T>
180 bool 153 bool
181 octave_base_int_matrix<T>::load_binary (std::istream& is, bool swap, 154 octave_base_int_matrix<T>::load_binary (std::istream& is, bool swap,
182 oct_mach_info::float_format fmt) 155 oct_mach_info::float_format )
183 { 156 {
184 #if 0
185
186 char tmp;
187 FOUR_BYTE_INT mdims; 157 FOUR_BYTE_INT mdims;
188 if (! is.read (X_CAST (char *, &mdims), 4)) 158 if (! is.read (X_CAST (char *, &mdims), 4))
189 return false; 159 return false;
190 if (swap) 160 if (swap)
191 swap_4_bytes (X_CAST (char *, &mdims)); 161 swap_4_bytes (X_CAST (char *, &mdims));
192 if (mdims < 0) 162 if (mdims >= 0)
193 { 163 return false;
194 mdims = - mdims; 164
195 FOUR_BYTE_INT di; 165 mdims = - mdims;
196 dim_vector dv; 166 FOUR_BYTE_INT di;
197 dv.resize (mdims); 167 dim_vector dv;
198 168 dv.resize (mdims);
199 for (int i = 0; i < mdims; i++) 169
200 { 170 for (int i = 0; i < mdims; i++)
201 if (! is.read (X_CAST (char *, &di), 4)) 171 {
202 return false; 172 if (! is.read (X_CAST (char *, &di), 4))
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; 173 return false;
224 if (swap) 174 if (swap)
225 swap_4_bytes (X_CAST (char *, &nc)); 175 swap_4_bytes (X_CAST (char *, &di));
226 if (! is.read (X_CAST (char *, &tmp), 1)) 176 dv(i) = di;
227 return false; 177 }
228 Matrix m (nr, nc); 178
229 double *re = m.fortran_vec (); 179 T m (dv);
230 int len = nr * nc; 180
231 read_doubles (is, re, X_CAST (save_type, tmp), len, swap, fmt); 181 if (! is.read (X_CAST (char *, m.data ()), m.byte_size ()))
232 if (error_state || ! is) 182 return false;
233 return false; 183
234 matrix = m; 184 if (swap)
235 } 185 {
236 186 int nel = dv.numel ();
237 #endif 187 int bytes = nel / m.byte_size();
238 188 for (int i = 0; i < nel; i++)
189 switch (bytes)
190 {
191 case 8:
192 swap_8_bytes (X_CAST (char *, &m(i)));
193 break;
194 case 4:
195 swap_4_bytes (X_CAST (char *, &m(i)));
196 break;
197 case 2:
198 swap_2_bytes (X_CAST (char *, &m(i)));
199 break;
200 case 1:
201 default:
202 break;
203 }
204 }
205
206 matrix = m;
239 return true; 207 return true;
240 } 208 }
241 209
242 #if defined (HAVE_HDF5) 210 #if defined (HAVE_HDF5)
243 211
244 template <class T> 212 template <class T>
245 bool 213 bool
246 octave_base_int_matrix<T>::save_hdf5 (hid_t loc_id, const char *name, 214 octave_base_int_matrix<T>::save_hdf5 (hid_t loc_id, const char *name, bool)
247 bool save_as_floats) 215 {
248 { 216 hid_t save_type_hid = HDF5_SAVE_TYPE;
249 bool retval = true; 217 bool retval = true;
250
251 #if 0
252
253 dim_vector dv = dims (); 218 dim_vector dv = dims ();
254 int empty = save_hdf5_empty (loc_id, name, dv); 219 int empty = save_hdf5_empty (loc_id, name, dv);
255 if (empty) 220 if (empty)
256 return (empty > 0); 221 return (empty > 0);
257 222
258 int rank = dv.length (); 223 int rank = dv.length ();
259 hid_t space_hid = -1, data_hid = -1; 224 hid_t space_hid = -1, data_hid = -1;
260 NDArray m = array_value ();
261
262 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); 225 OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
263 226
264 // Octave uses column-major, while HDF5 uses row-major ordering 227 // Octave uses column-major, while HDF5 uses row-major ordering
265 for (int i = 0; i < rank; i++) 228 for (int i = 0; i < rank; i++)
266 hdims[i] = dv (rank-i-1); 229 hdims[i] = dv (rank-i-1);
267 230
268 space_hid = H5Screate_simple (rank, hdims, 0); 231 space_hid = H5Screate_simple (rank, hdims, 0);
269 232
270 if (space_hid < 0) return false; 233 if (space_hid < 0) return false;
271 234
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, 235 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid,
297 H5P_DEFAULT); 236 H5P_DEFAULT);
298 if (data_hid < 0) 237 if (data_hid < 0)
299 { 238 {
300 H5Sclose (space_hid); 239 H5Sclose (space_hid);
301 return false; 240 return false;
302 } 241 }
303 242
304 double *mtmp = m.fortran_vec (); 243 retval = H5Dwrite (data_hid, save_type_hid, H5S_ALL, H5S_ALL,
305 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, 244 H5P_DEFAULT, matrix.data()) >= 0;
306 H5P_DEFAULT, mtmp) >= 0;
307 245
308 H5Dclose (data_hid); 246 H5Dclose (data_hid);
309 H5Sclose (space_hid); 247 H5Sclose (space_hid);
310 248
311 #endif
312
313 return retval; 249 return retval;
314 } 250 }
315 251
316 template <class T> 252 template <class T>
317 bool 253 bool
318 octave_base_int_matrix<T>::load_hdf5 (hid_t loc_id, const char *name, 254 octave_base_int_matrix<T>::load_hdf5 (hid_t loc_id, const char *name,
319 bool /* have_h5giterate_bug */) 255 bool /* have_h5giterate_bug */)
320 { 256 {
257 hid_t save_type_hid = HDF5_SAVE_TYPE;
321 bool retval = false; 258 bool retval = false;
322
323 #if 0
324
325 dim_vector dv; 259 dim_vector dv;
326 int empty = load_hdf5_empty (loc_id, name, dv); 260 int empty = load_hdf5_empty (loc_id, name, dv);
327 if (empty > 0) 261 if (empty > 0)
328 matrix.resize(dv); 262 matrix.resize(dv);
329 if (empty) 263 if (empty)
358 dv.resize (rank); 292 dv.resize (rank);
359 for (hsize_t i = 0, j = rank - 1; i < rank; i++, j--) 293 for (hsize_t i = 0, j = rank - 1; i < rank; i++, j--)
360 dv(j) = hdims[i]; 294 dv(j) = hdims[i];
361 } 295 }
362 296
363 NDArray m (dv); 297 T m (dv);
364 double *re = m.fortran_vec (); 298 if (H5Dread (data_hid, save_type_hid, H5S_ALL, H5S_ALL,
365 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, 299 H5P_DEFAULT, m.fortran_vec()) >= 0)
366 H5P_DEFAULT, re) >= 0)
367 { 300 {
368 retval = true; 301 retval = true;
369 matrix = m; 302 matrix = m;
370 } 303 }
371 304
372 H5Sclose (space_id); 305 H5Sclose (space_id);
373 H5Dclose (data_hid); 306 H5Dclose (data_hid);
374
375 #endif
376 307
377 return retval; 308 return retval;
378 } 309 }
379 310
380 #endif 311 #endif
388 current_print_indent_level ()); 319 current_print_indent_level ());
389 } 320 }
390 321
391 template <class T> 322 template <class T>
392 bool 323 bool
393 octave_base_int_scalar<T>::save_ascii (std::ostream& os, bool& infnan_warned, 324 octave_base_int_scalar<T>::save_ascii (std::ostream& os, bool& , bool)
394 bool strip_nan_and_inf) 325 {
395 { 326 os << scalar << "\n";
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; 327 return true;
429 } 328 }
430 329
431 template <class T> 330 template <class T>
432 bool 331 bool
433 octave_base_int_scalar<T>::load_ascii (std::istream& is) 332 octave_base_int_scalar<T>::load_ascii (std::istream& is)
434 { 333 {
435 #if 0 334 is >> scalar;
436
437 scalar = octave_read_double (is);
438 if (!is) 335 if (!is)
439 { 336 {
440 error ("load: failed to load scalar constant"); 337 error ("load: failed to load scalar constant");
441 return false; 338 return false;
442 } 339 }
443
444 #endif
445
446 return true; 340 return true;
447 } 341 }
448 342
449 template <class T> 343 template <class T>
450 bool 344 bool
451 octave_base_int_scalar<T>::save_binary (std::ostream& os, 345 octave_base_int_scalar<T>::save_binary (std::ostream& os, bool&)
452 bool& /* save_as_floats */) 346 {
453 { 347 os.write (X_CAST(char *, &scalar), byte_size());
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; 348 return true;
464 } 349 }
465 350
466 template <class T> 351 template <class T>
467 bool 352 bool
468 octave_base_int_scalar<T>::load_binary (std::istream& is, bool swap, 353 octave_base_int_scalar<T>::load_binary (std::istream& is, bool swap,
469 oct_mach_info::float_format fmt) 354 oct_mach_info::float_format)
470 { 355 {
471 #if 0 356 T tmp;
472 357 if (! is.read (X_CAST (char *, &tmp), byte_size()))
473 char tmp;
474 if (! is.read (X_CAST (char *, &tmp), 1))
475 return false; 358 return false;
476 359
477 double dtmp; 360 if (swap)
478 read_doubles (is, &dtmp, X_CAST (save_type, tmp), 1, swap, fmt); 361 switch (byte_size())
479 if (error_state || ! is) 362 {
480 return false; 363 case 8:
481 364 swap_8_bytes (X_CAST (char *, &tmp));
482 scalar = dtmp; 365 break;
483 366 case 4:
484 #endif 367 swap_4_bytes (X_CAST (char *, &tmp));
485 368 break;
369 case 2:
370 swap_2_bytes (X_CAST (char *, &tmp));
371 break;
372 case 1:
373 default:
374 break;
375 }
376 scalar = tmp;
486 return true; 377 return true;
487 } 378 }
488 379
489 #if defined (HAVE_HDF5) 380 #if defined (HAVE_HDF5)
490 template <class T> 381 template <class T>
491 bool 382 bool
492 octave_base_int_scalar<T>::save_hdf5 (hid_t loc_id, const char *name, 383 octave_base_int_scalar<T>::save_hdf5 (hid_t loc_id, const char *name, bool)
493 bool /* save_as_floats */) 384 {
494 { 385 hid_t save_type_hid = HDF5_SAVE_TYPE;
495 bool retval = true; 386 bool retval = true;
496
497 #if 0
498
499 hsize_t dimens[3]; 387 hsize_t dimens[3];
500 hid_t space_hid = -1, data_hid = -1; 388 hid_t space_hid = -1, data_hid = -1;
501 389
502 space_hid = H5Screate_simple (0, dimens, 0); 390 space_hid = H5Screate_simple (0, dimens, 0);
503 if (space_hid < 0) return false; 391 if (space_hid < 0) return false;
504 392
505 data_hid = H5Dcreate (loc_id, name, H5T_NATIVE_DOUBLE, space_hid, 393 data_hid = H5Dcreate (loc_id, name, save_type_hid, space_hid,
506 H5P_DEFAULT); 394 H5P_DEFAULT);
507 if (data_hid < 0) 395 if (data_hid < 0)
508 { 396 {
509 H5Sclose (space_hid); 397 H5Sclose (space_hid);
510 return false; 398 return false;
511 } 399 }
512 400
513 double tmp = double_value (); 401 retval = H5Dwrite (data_hid, save_type_hid, H5S_ALL, H5S_ALL,
514 retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, 402 H5P_DEFAULT, &scalar) >= 0;
515 H5P_DEFAULT, &tmp) >= 0;
516 403
517 H5Dclose (data_hid); 404 H5Dclose (data_hid);
518 H5Sclose (space_hid); 405 H5Sclose (space_hid);
519 406
520 #endif
521
522 return retval; 407 return retval;
523 } 408 }
524 409
525 template <class T> 410 template <class T>
526 bool 411 bool
527 octave_base_int_scalar<T>::load_hdf5 (hid_t loc_id, const char *name, 412 octave_base_int_scalar<T>::load_hdf5 (hid_t loc_id, const char *name,
528 bool /* have_h5giterate_bug */) 413 bool /* have_h5giterate_bug */)
529 { 414 {
530 #if 0 415 hid_t save_type_hid = HDF5_SAVE_TYPE;
531
532 hid_t data_hid = H5Dopen (loc_id, name); 416 hid_t data_hid = H5Dopen (loc_id, name);
533 hid_t space_id = H5Dget_space (data_hid); 417 hid_t space_id = H5Dget_space (data_hid);
534 418
535 hsize_t rank = H5Sget_simple_extent_ndims (space_id); 419 hsize_t rank = H5Sget_simple_extent_ndims (space_id);
536 420
538 { 422 {
539 H5Dclose (data_hid); 423 H5Dclose (data_hid);
540 return false; 424 return false;
541 } 425 }
542 426
543 double dtmp; 427 T tmp;
544 if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, 428 if (H5Dread (data_hid, save_type_hid, H5S_ALL, H5S_ALL,
545 H5P_DEFAULT, &dtmp) < 0) 429 H5P_DEFAULT, &tmp) < 0)
546 { 430 {
547 H5Dclose (data_hid); 431 H5Dclose (data_hid);
548 return false; 432 return false;
549 } 433 }
550 434
551 scalar = dtmp; 435 scalar = tmp;
552 436
553 H5Dclose (data_hid); 437 H5Dclose (data_hid);
554 #endif
555 438
556 return true; 439 return true;
557 } 440 }
558 #endif 441 #endif
559 442