SHOGUN  v2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SerializableFile.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 1999-2010 Soeren Sonnenburg
8  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
9  * Copyright (C) 2010 Berlin Institute of Technology
10  */
11 
13 
14 using namespace shogun;
15 
17  :CSGObject()
18 {
19  init(NULL, 0, "(file)");
20 }
21 
22 CSerializableFile::CSerializableFile(FILE* fstream, char rw)
23  :CSGObject()
24 {
25  init(fstream, rw, "(file)");
26 }
27 
28 CSerializableFile::CSerializableFile(const char* fname, char rw)
29  :CSGObject()
30 {
31  char mode[3] = {rw, 'b', '\0'};
32 
33  init(NULL, rw, fname);
34 
35  if (m_filename == NULL || *m_filename == '\0') {
36  SG_WARNING("Filename not given for opening file!\n");
37  close(); return;
38  }
39 
40  if (rw != 'r' && rw != 'w') {
41  SG_WARNING("Unknown mode '%c'!\n", mode[0]);
42  close(); return;
43  }
44 
45  m_fstream = fopen(m_filename, mode);
46  if (!is_opened()) {
47  SG_WARNING("Error opening file '%s'\n", m_filename);
48  close(); return;
49  }
50 }
51 
53 {
54  close();
56  delete m_reader;
57  m_task = 0;
58 }
59 
60 void
61 CSerializableFile::init(FILE* fstream, char task, const char* filename)
62 {
63  m_fstream = fstream;
64  m_task = task;
65  m_filename = strdup(filename);
66  m_reader = NULL;
67 }
68 
69 void
71 {
72  if (is_opened()) { fclose(m_fstream); m_fstream = NULL; }
73 }
74 
75 bool
77 {
78  return m_fstream != NULL;
79 }
80 
81 bool
82 CSerializableFile::is_task_warn(char rw, const char* name,
83  const char* prefix)
84 {
85  if (m_task == 'r' && m_reader == NULL) {
86  string_t dest_version;
87  strncpy(dest_version, "(unkown)", STRING_LEN);
88  m_reader = new_reader(dest_version, STRING_LEN);
89  if (m_reader == NULL) {
90  SG_WARNING("`%s' has file-version `%s', which is not "
91  "supported!\n", m_filename, dest_version);
92  close(); return false;
93  }
94  }
95 
96  if (rw == 'w' && (m_task != 'w' || !is_opened())) {
97  SG_WARNING("`%s' not opened (for writing) during writing "
98  "`%s%s'!\n", m_filename, prefix, name);
99  return false;
100  }
101  if (rw == 'r' && (m_task != 'r' || !is_opened())) {
102  SG_WARNING("`%s' not opened (for reading) during reading "
103  "`%s%s'!\n", m_filename, prefix, name);
104  return false;
105  }
106 
107  return true;
108 }
109 
110 bool
111 CSerializableFile::false_warn(const char* prefix, const char* name)
112 {
113  if (m_task == 'w')
114  SG_WARNING("Could not write `%s%s' to `%s'!\n", prefix,
115  name, m_filename);
116  if (m_task == 'r')
117  SG_WARNING("Could not read `%s%s' from `%s'!\n", prefix,
118  name, m_filename);
119  if (m_task != 'w' && m_task != 'r')
120  SG_WARNING("Could not read/write `%s%s' from `%s'!\n",
121  prefix, name, m_filename);
122 
123  return false;
124 }
125 
126 bool
127 CSerializableFile::write_scalar(
128  const TSGDataType* type, const char* name, const char* prefix,
129  const void* param)
130 {
131  if (!is_task_warn('w', name, prefix)) return false;
132 
133  if (!write_scalar_wrapped(type, param))
134  return false_warn(prefix, name);
135 
136  return true;
137 }
138 
139 bool
140 CSerializableFile::read_scalar(
141  const TSGDataType* type, const char* name, const char* prefix,
142  void* param)
143 {
144  if (!is_task_warn('r', name, prefix)) return false;
145 
146  if (!m_reader->read_scalar_wrapped(type, param))
147  return false_warn(prefix, name);
148 
149  return true;
150 }
151 
152 bool
153 CSerializableFile::write_cont_begin(
154  const TSGDataType* type, const char* name, const char* prefix,
155  index_t len_real_y, index_t len_real_x)
156 {
157  if (!is_task_warn('w', name, prefix)) return false;
158 
159  if (!write_cont_begin_wrapped(type, len_real_y, len_real_x))
160  return false_warn(prefix, name);
161 
162  return true;
163 }
164 
165 bool
166 CSerializableFile::read_cont_begin(
167  const TSGDataType* type, const char* name, const char* prefix,
168  index_t* len_read_y, index_t* len_read_x)
169 {
170  if (!is_task_warn('r', name, prefix)) return false;
171 
172  if (!m_reader->read_cont_begin_wrapped(type, len_read_y,
173  len_read_x))
174  return false_warn(prefix, name);
175 
176  return true;
177 }
178 
179 bool
180 CSerializableFile::write_cont_end(
181  const TSGDataType* type, const char* name, const char* prefix,
182  index_t len_real_y, index_t len_real_x)
183 {
184  if (!is_task_warn('w', name, prefix)) return false;
185 
186  if (!write_cont_end_wrapped(type, len_real_y, len_real_x))
187  return false_warn(prefix, name);
188 
189  return true;
190 }
191 
192 bool
193 CSerializableFile::read_cont_end(
194  const TSGDataType* type, const char* name, const char* prefix,
195  index_t len_read_y, index_t len_read_x)
196 {
197  if (!is_task_warn('r', name, prefix)) return false;
198 
199  if (!m_reader->read_cont_end_wrapped(type, len_read_y, len_read_x))
200  return false_warn(prefix, name);
201 
202  return true;
203 }
204 
205 bool
206 CSerializableFile::write_string_begin(
207  const TSGDataType* type, const char* name, const char* prefix,
208  index_t length)
209 {
210  if (!is_task_warn('w', name, prefix)) return false;
211 
212  if (!write_string_begin_wrapped(type, length))
213  return false_warn(prefix, name);
214 
215  return true;
216 }
217 
218 bool
219 CSerializableFile::read_string_begin(
220  const TSGDataType* type, const char* name, const char* prefix,
221  index_t* length)
222 {
223  if (!is_task_warn('r', name, prefix)) return false;
224 
225  if (!m_reader->read_string_begin_wrapped(type, length))
226  return false_warn(prefix, name);
227 
228  return true;
229 }
230 
231 bool
232 CSerializableFile::write_string_end(
233  const TSGDataType* type, const char* name, const char* prefix,
234  index_t length)
235 {
236  if (!is_task_warn('w', name, prefix)) return false;
237 
238  if (!write_string_end_wrapped(type, length))
239  return false_warn(prefix, name);
240 
241  return true;
242 }
243 
244 bool
245 CSerializableFile::read_string_end(
246  const TSGDataType* type, const char* name, const char* prefix,
247  index_t length)
248 {
249  if (!is_task_warn('r', name, prefix)) return false;
250 
251  if (!m_reader->read_string_end_wrapped(type, length))
252  return false_warn(prefix, name);
253 
254  return true;
255 }
256 
257 bool
258 CSerializableFile::write_stringentry_begin(
259  const TSGDataType* type, const char* name, const char* prefix,
260  index_t y)
261 {
262  if (!is_task_warn('w', name, prefix)) return false;
263 
264  if (!write_stringentry_begin_wrapped(type, y))
265  return false_warn(prefix, name);
266 
267  return true;
268 }
269 
270 bool
271 CSerializableFile::read_stringentry_begin(
272  const TSGDataType* type, const char* name, const char* prefix,
273  index_t y)
274 {
275  if (!is_task_warn('r', name, prefix)) return false;
276 
277  if (!m_reader->read_stringentry_begin_wrapped(type, y))
278  return false_warn(prefix, name);
279 
280  return true;
281 }
282 
283 bool
284 CSerializableFile::write_stringentry_end(
285  const TSGDataType* type, const char* name, const char* prefix,
286  index_t y)
287 {
288  if (!is_task_warn('w', name, prefix)) return false;
289 
290  if (!write_stringentry_end_wrapped(type, y))
291  return false_warn(prefix, name);
292 
293  return true;
294 }
295 
296 bool
297 CSerializableFile::read_stringentry_end(
298  const TSGDataType* type, const char* name, const char* prefix,
299  index_t y)
300 {
301  if (!is_task_warn('r', name, prefix)) return false;
302 
303  if (!m_reader->read_stringentry_end_wrapped(type, y))
304  return false_warn(prefix, name);
305 
306  return true;
307 }
308 
309 bool
310 CSerializableFile::write_sparse_begin(
311  const TSGDataType* type, const char* name, const char* prefix,
312  index_t length)
313 {
314  if (!is_task_warn('w', name, prefix)) return false;
315 
316  if (!write_sparse_begin_wrapped(type, length))
317  return false_warn(prefix, name);
318 
319  return true;
320 }
321 
322 bool
323 CSerializableFile::read_sparse_begin(
324  const TSGDataType* type, const char* name, const char* prefix,
325  index_t* length)
326 {
327  if (!is_task_warn('r', name, prefix)) return false;
328 
329  if (!m_reader->read_sparse_begin_wrapped(type, length))
330  return false_warn(prefix, name);
331 
332  return true;
333 }
334 
335 bool
336 CSerializableFile::write_sparse_end(
337  const TSGDataType* type, const char* name, const char* prefix,
338  index_t length)
339 {
340  if (!is_task_warn('w', name, prefix)) return false;
341 
342  if (!write_sparse_end_wrapped(type, length))
343  return false_warn(prefix, name);
344 
345  return true;
346 }
347 
348 bool
349 CSerializableFile::read_sparse_end(
350  const TSGDataType* type, const char* name, const char* prefix,
351  index_t length)
352 {
353  if (!is_task_warn('r', name, prefix)) return false;
354 
355  if (!m_reader->read_sparse_end_wrapped(type, length))
356  return false_warn(prefix, name);
357 
358  return true;
359 }
360 
361 bool
362 CSerializableFile::write_sparseentry_begin(
363  const TSGDataType* type, const char* name, const char* prefix,
364  const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
365  index_t y)
366 {
367  if (!is_task_warn('w', name, prefix)) return false;
368 
369  if (!write_sparseentry_begin_wrapped(type, first_entry,
370  feat_index, y))
371  return false_warn(prefix, name);
372 
373  return true;
374 }
375 
376 bool
377 CSerializableFile::read_sparseentry_begin(
378  const TSGDataType* type, const char* name, const char* prefix,
379  SGSparseVectorEntry<char>* first_entry, index_t* feat_index, index_t y)
380 {
381  if (!is_task_warn('r', name, prefix)) return false;
382 
383  if (!m_reader->read_sparseentry_begin_wrapped(type, first_entry,
384  feat_index, y))
385  return false_warn(prefix, name);
386 
387  return true;
388 }
389 
390 bool
391 CSerializableFile::write_sparseentry_end(
392  const TSGDataType* type, const char* name, const char* prefix,
393  const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
394  index_t y)
395 {
396  if (!is_task_warn('w', name, prefix)) return false;
397 
398  if (!write_sparseentry_end_wrapped(type, first_entry, feat_index,
399  y))
400  return false_warn(prefix, name);
401 
402  return true;
403 }
404 
405 bool
406 CSerializableFile::read_sparseentry_end(
407  const TSGDataType* type, const char* name, const char* prefix,
408  SGSparseVectorEntry<char>* first_entry, index_t* feat_index,
409  index_t y)
410 {
411  if (!is_task_warn('r', name, prefix)) return false;
412 
413  if (!m_reader->read_sparseentry_end_wrapped(type, first_entry,
414  feat_index, y))
415  return false_warn(prefix, name);
416 
417  return true;
418 }
419 
420 bool
421 CSerializableFile::write_item_begin(
422  const TSGDataType* type, const char* name, const char* prefix,
423  index_t y, index_t x)
424 {
425  if (!is_task_warn('w', name, prefix)) return false;
426 
427  if (!write_item_begin_wrapped(type, y, x))
428  return false_warn(prefix, name);
429 
430  return true;
431 }
432 
433 bool
434 CSerializableFile::read_item_begin(
435  const TSGDataType* type, const char* name, const char* prefix,
436  index_t y, index_t x)
437 {
438  if (!is_task_warn('r', name, prefix)) return false;
439 
440  if (!m_reader->read_item_begin_wrapped(type, y, x))
441  return false_warn(prefix, name);
442 
443  return true;
444 }
445 
446 bool
447 CSerializableFile::write_item_end(
448  const TSGDataType* type, const char* name, const char* prefix,
449  index_t y, index_t x)
450 {
451  if (!is_task_warn('w', name, prefix)) return false;
452 
453  if (!write_item_end_wrapped(type, y, x))
454  return false_warn(prefix, name);
455 
456  return true;
457 }
458 
459 bool
460 CSerializableFile::read_item_end(
461  const TSGDataType* type, const char* name, const char* prefix,
462  index_t y, index_t x)
463 {
464  if (!is_task_warn('r', name, prefix)) return false;
465 
466  if (!m_reader->read_item_end_wrapped(type, y, x))
467  return false_warn(prefix, name);
468 
469  return true;
470 }
471 
472 bool
473 CSerializableFile::write_sgserializable_begin(
474  const TSGDataType* type, const char* name, const char* prefix,
475  const char* sgserializable_name, EPrimitiveType generic)
476 {
477  if (!is_task_warn('w', name, prefix)) return false;
478 
479  if (!write_sgserializable_begin_wrapped(type, sgserializable_name,
480  generic))
481  return false_warn(prefix, name);
482 
483  return true;
484 }
485 
486 bool
487 CSerializableFile::read_sgserializable_begin(
488  const TSGDataType* type, const char* name, const char* prefix,
489  char* sgserializable_name, EPrimitiveType* generic)
490 {
491  if (!is_task_warn('r', name, prefix)) return false;
492 
493  if (!m_reader->read_sgserializable_begin_wrapped(
494  type, sgserializable_name, generic))
495  return false_warn(prefix, name);
496 
497  return true;
498 }
499 
500 bool
501 CSerializableFile::write_sgserializable_end(
502  const TSGDataType* type, const char* name, const char* prefix,
503  const char* sgserializable_name, EPrimitiveType generic)
504 {
505  if (!is_task_warn('w', name, prefix)) return false;
506 
507  if (!write_sgserializable_end_wrapped(type, sgserializable_name,
508  generic))
509  return false_warn(prefix, name);
510 
511  return true;
512 }
513 
514 bool
515 CSerializableFile::read_sgserializable_end(
516  const TSGDataType* type, const char* name, const char* prefix,
517  const char* sgserializable_name, EPrimitiveType generic)
518 {
519  if (!is_task_warn('r', name, prefix)) return false;
520 
521  if (!m_reader->read_sgserializable_end_wrapped(
522  type, sgserializable_name, generic))
523  return false_warn(prefix, name);
524 
525  return true;
526 }
527 
528 bool
529 CSerializableFile::write_type_begin(
530  const TSGDataType* type, const char* name, const char* prefix)
531 {
532  if (!is_task_warn('w', name, prefix)) return false;
533 
534  if (!write_type_begin_wrapped(type, name, prefix))
535  return false_warn(prefix, name);
536 
537  return true;
538 }
539 
540 bool
541 CSerializableFile::read_type_begin(
542  const TSGDataType* type, const char* name, const char* prefix)
543 {
544  if (!is_task_warn('r', name, prefix)) return false;
545 
546  if (!m_reader->read_type_begin_wrapped(type, name, prefix))
547  return false_warn(prefix, name);
548 
549  return true;
550 }
551 
552 bool
553 CSerializableFile::write_type_end(
554  const TSGDataType* type, const char* name, const char* prefix)
555 {
556  if (!is_task_warn('w', name, prefix)) return false;
557 
558  if (!write_type_end_wrapped(type, name, prefix))
559  return false_warn(prefix, name);
560 
561  return true;
562 }
563 
564 bool
565 CSerializableFile::read_type_end(
566  const TSGDataType* type, const char* name, const char* prefix)
567 {
568  if (!is_task_warn('r', name, prefix)) return false;
569 
570  if (!m_reader->read_type_end_wrapped(type, name, prefix))
571  return false_warn(prefix, name);
572 
573  return true;
574 }

SHOGUN Machine Learning Toolbox - Documentation