Mercurial > hg > segmenter-vamp-plugin
comparison armadillo-2.4.4/include/armadillo_bits/debug.hpp @ 0:8b6102e2a9b0
Armadillo Library
author | maxzanoni76 <max.zanoni@eecs.qmul.ac.uk> |
---|---|
date | Wed, 11 Apr 2012 09:27:06 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:8b6102e2a9b0 |
---|---|
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) | |
2 // Copyright (C) 2008-2011 Conrad Sanderson | |
3 // Copyright (C) 2011 Stanislav Funiak | |
4 // | |
5 // This file is part of the Armadillo C++ library. | |
6 // It is provided without any warranty of fitness | |
7 // for any purpose. You can redistribute this file | |
8 // and/or modify it under the terms of the GNU | |
9 // Lesser General Public License (LGPL) as published | |
10 // by the Free Software Foundation, either version 3 | |
11 // of the License or (at your option) any later version. | |
12 // (see http://www.opensource.org/licenses for more info) | |
13 | |
14 | |
15 //! \addtogroup debug | |
16 //! @{ | |
17 | |
18 | |
19 | |
20 template<typename T> | |
21 inline | |
22 std::ostream& | |
23 arma_stream_err1(std::ostream* user_stream) | |
24 { | |
25 static std::ostream* stream_err1 = &(ARMA_DEFAULT_OSTREAM); | |
26 | |
27 if(user_stream != NULL) | |
28 { | |
29 stream_err1 = user_stream; | |
30 } | |
31 | |
32 return *stream_err1; | |
33 } | |
34 | |
35 | |
36 | |
37 template<typename T> | |
38 inline | |
39 std::ostream& | |
40 arma_stream_err2(std::ostream* user_stream) | |
41 { | |
42 static std::ostream* stream_err2 = &(ARMA_DEFAULT_OSTREAM); | |
43 | |
44 if(user_stream != NULL) | |
45 { | |
46 stream_err2 = user_stream; | |
47 } | |
48 | |
49 return *stream_err2; | |
50 } | |
51 | |
52 | |
53 | |
54 inline | |
55 void | |
56 set_stream_err1(std::ostream& user_stream) | |
57 { | |
58 arma_stream_err1<char>(&user_stream); | |
59 } | |
60 | |
61 | |
62 | |
63 inline | |
64 void | |
65 set_stream_err2(std::ostream& user_stream) | |
66 { | |
67 arma_stream_err2<char>(&user_stream); | |
68 } | |
69 | |
70 | |
71 | |
72 inline | |
73 std::ostream& | |
74 get_stream_err1() | |
75 { | |
76 return arma_stream_err1<char>(NULL); | |
77 } | |
78 | |
79 | |
80 | |
81 inline | |
82 std::ostream& | |
83 get_stream_err2() | |
84 { | |
85 return arma_stream_err2<char>(NULL); | |
86 } | |
87 | |
88 | |
89 | |
90 // | |
91 // arma_stop | |
92 | |
93 //! print a message to get_stream_err1() and/or throw a logic_error exception | |
94 template<typename T1> | |
95 inline | |
96 void | |
97 arma_cold | |
98 arma_stop(const T1& x) | |
99 { | |
100 #if defined(ARMA_PRINT_LOGIC_ERRORS) | |
101 { | |
102 std::ostream& out = get_stream_err1(); | |
103 | |
104 out.flush(); | |
105 | |
106 out << '\n'; | |
107 out << "error: " << x << '\n'; | |
108 out << '\n'; | |
109 out.flush(); | |
110 } | |
111 #else | |
112 { | |
113 arma_ignore(x); | |
114 } | |
115 #endif | |
116 | |
117 throw std::logic_error(""); | |
118 } | |
119 | |
120 | |
121 | |
122 template<typename T1> | |
123 inline | |
124 void | |
125 arma_cold | |
126 arma_stop_bad_alloc(const T1& x) | |
127 { | |
128 std::ostream& out = get_stream_err1(); | |
129 | |
130 out.flush(); | |
131 | |
132 out << '\n'; | |
133 out << "error: " << x << '\n'; | |
134 out << '\n'; | |
135 out.flush(); | |
136 | |
137 throw std::bad_alloc(); | |
138 } | |
139 | |
140 | |
141 | |
142 // | |
143 // arma_bad | |
144 | |
145 //! print a message to get_stream_err2() and/or throw a run-time error exception | |
146 template<typename T1> | |
147 inline | |
148 void | |
149 arma_cold | |
150 arma_bad(const T1& x, const bool hurl = true) | |
151 { | |
152 #if defined(ARMA_PRINT_RUNTIME_ERRORS) | |
153 { | |
154 std::ostream& out = get_stream_err2(); | |
155 | |
156 out.flush(); | |
157 | |
158 out << '\n'; | |
159 out << "error: " << x << '\n'; | |
160 out << '\n'; | |
161 out.flush(); | |
162 } | |
163 #else | |
164 { | |
165 arma_ignore(x); | |
166 } | |
167 #endif | |
168 | |
169 if(hurl == true) | |
170 { | |
171 throw std::runtime_error(""); | |
172 } | |
173 } | |
174 | |
175 | |
176 | |
177 // | |
178 // arma_print | |
179 | |
180 | |
181 inline | |
182 void | |
183 arma_cold | |
184 arma_print() | |
185 { | |
186 get_stream_err1() << std::endl; | |
187 } | |
188 | |
189 | |
190 template<typename T1> | |
191 inline | |
192 void | |
193 arma_cold | |
194 arma_print(const T1& x) | |
195 { | |
196 get_stream_err1() << x << std::endl; | |
197 } | |
198 | |
199 | |
200 | |
201 template<typename T1, typename T2> | |
202 inline | |
203 void | |
204 arma_cold | |
205 arma_print(const T1& x, const T2& y) | |
206 { | |
207 get_stream_err1() << x << y << std::endl; | |
208 } | |
209 | |
210 | |
211 | |
212 template<typename T1, typename T2, typename T3> | |
213 inline | |
214 void | |
215 arma_cold | |
216 arma_print(const T1& x, const T2& y, const T3& z) | |
217 { | |
218 get_stream_err1() << x << y << z << std::endl; | |
219 } | |
220 | |
221 | |
222 | |
223 | |
224 | |
225 | |
226 // | |
227 // arma_sigprint | |
228 | |
229 //! print a message the the log stream with a preceding @ character. | |
230 //! by default the log stream is cout. | |
231 //! used for printing the signature of a function | |
232 //! (see the arma_extra_debug_sigprint macro) | |
233 inline | |
234 void | |
235 arma_sigprint(const char* x) | |
236 { | |
237 get_stream_err1() << "@ " << x; | |
238 } | |
239 | |
240 | |
241 | |
242 // | |
243 // arma_bktprint | |
244 | |
245 | |
246 inline | |
247 void | |
248 arma_bktprint() | |
249 { | |
250 get_stream_err1() << std::endl; | |
251 } | |
252 | |
253 | |
254 template<typename T1> | |
255 inline | |
256 void | |
257 arma_bktprint(const T1& x) | |
258 { | |
259 get_stream_err1() << " [" << x << ']' << std::endl; | |
260 } | |
261 | |
262 | |
263 | |
264 template<typename T1, typename T2> | |
265 inline | |
266 void | |
267 arma_bktprint(const T1& x, const T2& y) | |
268 { | |
269 get_stream_err1() << " [" << x << y << ']' << std::endl; | |
270 } | |
271 | |
272 | |
273 | |
274 | |
275 | |
276 | |
277 // | |
278 // arma_thisprint | |
279 | |
280 inline | |
281 void | |
282 arma_thisprint(const void* this_ptr) | |
283 { | |
284 get_stream_err1() << " [this = " << this_ptr << ']' << std::endl; | |
285 } | |
286 | |
287 | |
288 | |
289 // | |
290 // arma_warn | |
291 | |
292 | |
293 //! print a message to the warn stream | |
294 template<typename T1> | |
295 inline | |
296 void | |
297 arma_cold | |
298 arma_warn(const bool state, const T1& x) | |
299 { | |
300 if(state==true) | |
301 { | |
302 get_stream_err2() << x << std::endl; | |
303 } | |
304 } | |
305 | |
306 | |
307 template<typename T1, typename T2> | |
308 inline | |
309 void | |
310 arma_cold | |
311 arma_warn(const bool state, const T1& x, const T2& y) | |
312 { | |
313 if(state==true) | |
314 { | |
315 get_stream_err2() << x << y << std::endl; | |
316 } | |
317 } | |
318 | |
319 | |
320 template<typename T1, typename T2, typename T3> | |
321 inline | |
322 void | |
323 arma_cold | |
324 arma_warn(const bool state, const T1& x, const T2& y, const T3& z) | |
325 { | |
326 if(state==true) | |
327 { | |
328 get_stream_err2() << x << y << z << std::endl; | |
329 } | |
330 } | |
331 | |
332 | |
333 | |
334 // | |
335 // arma_check | |
336 | |
337 //! if state is true, abort program | |
338 template<typename T1> | |
339 inline | |
340 void | |
341 arma_hot | |
342 arma_check(const bool state, const T1& x) | |
343 { | |
344 if(state==true) | |
345 { | |
346 arma_stop(arma_boost::str_wrapper(x)); | |
347 } | |
348 } | |
349 | |
350 | |
351 template<typename T1, typename T2> | |
352 inline | |
353 void | |
354 arma_hot | |
355 arma_check(const bool state, const T1& x, const T2& y) | |
356 { | |
357 if(state==true) | |
358 { | |
359 arma_stop( std::string(x) + std::string(y) ); | |
360 } | |
361 } | |
362 | |
363 | |
364 template<typename T1> | |
365 inline | |
366 void | |
367 arma_hot | |
368 arma_check_bad_alloc(const bool state, const T1& x) | |
369 { | |
370 if(state==true) | |
371 { | |
372 arma_stop_bad_alloc(x); | |
373 } | |
374 } | |
375 | |
376 | |
377 | |
378 // | |
379 // arma_set_error | |
380 | |
381 | |
382 arma_inline | |
383 void | |
384 arma_hot | |
385 arma_set_error(bool& err_state, char*& err_msg, const bool expression, const char* message) | |
386 { | |
387 if(expression == true) | |
388 { | |
389 err_state = true; | |
390 err_msg = const_cast<char*>(message); | |
391 } | |
392 } | |
393 | |
394 | |
395 | |
396 | |
397 // | |
398 // functions for generating strings indicating size errors | |
399 | |
400 inline | |
401 std::string | |
402 arma_cold | |
403 arma_incompat_size_string(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) | |
404 { | |
405 std::stringstream tmp; | |
406 | |
407 tmp << x << ": incompatible matrix dimensions: " << A_n_rows << 'x' << A_n_cols << " and " << B_n_rows << 'x' << B_n_cols; | |
408 | |
409 return tmp.str(); | |
410 } | |
411 | |
412 | |
413 | |
414 inline | |
415 arma_cold | |
416 std::string | |
417 arma_incompat_size_string(const uword A_n_rows, const uword A_n_cols, const uword A_n_slices, const uword B_n_rows, const uword B_n_cols, const uword B_n_slices, const char* x) | |
418 { | |
419 std::stringstream tmp; | |
420 | |
421 tmp << x << ": incompatible cube dimensions: " << A_n_rows << 'x' << A_n_cols << 'x' << A_n_slices << " and " << B_n_rows << 'x' << B_n_cols << 'x' << B_n_slices; | |
422 | |
423 return tmp.str(); | |
424 } | |
425 | |
426 | |
427 | |
428 template<typename eT> | |
429 inline | |
430 arma_cold | |
431 std::string | |
432 arma_incompat_size_string(const subview_cube<eT>& Q, const Mat<eT>& A, const char* x) | |
433 { | |
434 std::stringstream tmp; | |
435 | |
436 tmp << x | |
437 << ": interpreting matrix as cube with dimenensions: " | |
438 << A.n_rows << 'x' << A.n_cols << 'x' << 1 | |
439 << " or " | |
440 << A.n_rows << 'x' << 1 << 'x' << A.n_cols | |
441 << " or " | |
442 << 1 << 'x' << A.n_rows << 'x' << A.n_cols | |
443 << " is incompatible with cube dimensions: " | |
444 << Q.n_rows << 'x' << Q.n_cols << 'x' << Q.n_slices; | |
445 | |
446 return tmp.str(); | |
447 } | |
448 | |
449 | |
450 | |
451 // | |
452 // functions for checking whether two matrices have the same dimensions | |
453 | |
454 | |
455 | |
456 inline | |
457 void | |
458 arma_hot | |
459 arma_assert_same_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) | |
460 { | |
461 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
462 { | |
463 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
464 } | |
465 } | |
466 | |
467 | |
468 | |
469 //! stop if given matrices have different sizes | |
470 template<typename eT1, typename eT2> | |
471 inline | |
472 void | |
473 arma_hot | |
474 arma_assert_same_size(const Mat<eT1>& A, const Mat<eT2>& B, const char* x) | |
475 { | |
476 const uword A_n_rows = A.n_rows; | |
477 const uword A_n_cols = A.n_cols; | |
478 | |
479 const uword B_n_rows = B.n_rows; | |
480 const uword B_n_cols = B.n_cols; | |
481 | |
482 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
483 { | |
484 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
485 } | |
486 } | |
487 | |
488 | |
489 | |
490 //! stop if given proxies have different sizes | |
491 template<typename eT1, typename eT2> | |
492 inline | |
493 void | |
494 arma_hot | |
495 arma_assert_same_size(const Proxy<eT1>& A, const Proxy<eT2>& B, const char* x) | |
496 { | |
497 const uword A_n_rows = A.get_n_rows(); | |
498 const uword A_n_cols = A.get_n_cols(); | |
499 | |
500 const uword B_n_rows = B.get_n_rows(); | |
501 const uword B_n_cols = B.get_n_cols(); | |
502 | |
503 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
504 { | |
505 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
506 } | |
507 } | |
508 | |
509 | |
510 | |
511 template<typename eT1, typename eT2> | |
512 inline | |
513 void | |
514 arma_hot | |
515 arma_assert_same_size(const subview<eT1>& A, const subview<eT2>& B, const char* x) | |
516 { | |
517 const uword A_n_rows = A.n_rows; | |
518 const uword A_n_cols = A.n_cols; | |
519 | |
520 const uword B_n_rows = B.n_rows; | |
521 const uword B_n_cols = B.n_cols; | |
522 | |
523 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
524 { | |
525 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
526 } | |
527 } | |
528 | |
529 | |
530 | |
531 template<typename eT1, typename eT2> | |
532 inline | |
533 void | |
534 arma_hot | |
535 arma_assert_same_size(const Mat<eT1>& A, const subview<eT2>& B, const char* x) | |
536 { | |
537 const uword A_n_rows = A.n_rows; | |
538 const uword A_n_cols = A.n_cols; | |
539 | |
540 const uword B_n_rows = B.n_rows; | |
541 const uword B_n_cols = B.n_cols; | |
542 | |
543 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
544 { | |
545 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
546 } | |
547 } | |
548 | |
549 | |
550 | |
551 template<typename eT1, typename eT2> | |
552 inline | |
553 void | |
554 arma_hot | |
555 arma_assert_same_size(const subview<eT1>& A, const Mat<eT2>& B, const char* x) | |
556 { | |
557 const uword A_n_rows = A.n_rows; | |
558 const uword A_n_cols = A.n_cols; | |
559 | |
560 const uword B_n_rows = B.n_rows; | |
561 const uword B_n_cols = B.n_cols; | |
562 | |
563 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
564 { | |
565 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
566 } | |
567 } | |
568 | |
569 | |
570 | |
571 template<typename eT1, typename eT2> | |
572 inline | |
573 void | |
574 arma_hot | |
575 arma_assert_same_size(const Mat<eT1>& A, const Proxy<eT2>& B, const char* x) | |
576 { | |
577 const uword A_n_rows = A.n_rows; | |
578 const uword A_n_cols = A.n_cols; | |
579 | |
580 const uword B_n_rows = B.get_n_rows(); | |
581 const uword B_n_cols = B.get_n_cols(); | |
582 | |
583 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
584 { | |
585 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
586 } | |
587 } | |
588 | |
589 | |
590 | |
591 template<typename eT1, typename eT2> | |
592 inline | |
593 void | |
594 arma_hot | |
595 arma_assert_same_size(const Proxy<eT1>& A, const Mat<eT2>& B, const char* x) | |
596 { | |
597 const uword A_n_rows = A.get_n_rows(); | |
598 const uword A_n_cols = A.get_n_cols(); | |
599 | |
600 const uword B_n_rows = B.n_rows; | |
601 const uword B_n_cols = B.n_cols; | |
602 | |
603 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
604 { | |
605 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
606 } | |
607 } | |
608 | |
609 | |
610 | |
611 template<typename eT1, typename eT2> | |
612 inline | |
613 void | |
614 arma_hot | |
615 arma_assert_same_size(const Proxy<eT1>& A, const subview<eT2>& B, const char* x) | |
616 { | |
617 const uword A_n_rows = A.get_n_rows(); | |
618 const uword A_n_cols = A.get_n_cols(); | |
619 | |
620 const uword B_n_rows = B.n_rows; | |
621 const uword B_n_cols = B.n_cols; | |
622 | |
623 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
624 { | |
625 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
626 } | |
627 } | |
628 | |
629 | |
630 | |
631 template<typename eT1, typename eT2> | |
632 inline | |
633 void | |
634 arma_hot | |
635 arma_assert_same_size(const subview<eT1>& A, const Proxy<eT2>& B, const char* x) | |
636 { | |
637 const uword A_n_rows = A.n_rows; | |
638 const uword A_n_cols = A.n_cols; | |
639 | |
640 const uword B_n_rows = B.get_n_rows(); | |
641 const uword B_n_cols = B.get_n_cols(); | |
642 | |
643 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) | |
644 { | |
645 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
646 } | |
647 } | |
648 | |
649 | |
650 | |
651 // | |
652 // functions for checking whether two cubes have the same dimensions | |
653 | |
654 | |
655 | |
656 inline | |
657 void | |
658 arma_hot | |
659 arma_assert_same_size(const uword A_n_rows, const uword A_n_cols, const uword A_n_slices, const uword B_n_rows, const uword B_n_cols, const uword B_n_slices, const char* x) | |
660 { | |
661 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices) ) | |
662 { | |
663 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) ); | |
664 } | |
665 } | |
666 | |
667 | |
668 | |
669 //! stop if given cubes have different sizes | |
670 template<typename eT1, typename eT2> | |
671 inline | |
672 void | |
673 arma_hot | |
674 arma_assert_same_size(const Cube<eT1>& A, const Cube<eT2>& B, const char* x) | |
675 { | |
676 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) ) | |
677 { | |
678 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); | |
679 } | |
680 } | |
681 | |
682 | |
683 | |
684 template<typename eT1, typename eT2> | |
685 inline | |
686 void | |
687 arma_hot | |
688 arma_assert_same_size(const Cube<eT1>& A, const subview_cube<eT2>& B, const char* x) | |
689 { | |
690 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) ) | |
691 { | |
692 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); | |
693 } | |
694 } | |
695 | |
696 | |
697 | |
698 template<typename eT1, typename eT2> | |
699 inline | |
700 void | |
701 arma_hot | |
702 arma_assert_same_size(const subview_cube<eT1>& A, const Cube<eT2>& B, const char* x) | |
703 { | |
704 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) ) | |
705 { | |
706 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); | |
707 } | |
708 } | |
709 | |
710 | |
711 | |
712 template<typename eT1, typename eT2> | |
713 inline | |
714 void | |
715 arma_hot | |
716 arma_assert_same_size(const subview_cube<eT1>& A, const subview_cube<eT2>& B, const char* x) | |
717 { | |
718 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices)) | |
719 { | |
720 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); | |
721 } | |
722 } | |
723 | |
724 | |
725 | |
726 //! stop if given cube proxies have different sizes | |
727 template<typename eT1, typename eT2> | |
728 inline | |
729 void | |
730 arma_hot | |
731 arma_assert_same_size(const ProxyCube<eT1>& A, const ProxyCube<eT2>& B, const char* x) | |
732 { | |
733 const uword A_n_rows = A.get_n_rows(); | |
734 const uword A_n_cols = A.get_n_cols(); | |
735 const uword A_n_slices = A.get_n_slices(); | |
736 | |
737 const uword B_n_rows = B.get_n_rows(); | |
738 const uword B_n_cols = B.get_n_cols(); | |
739 const uword B_n_slices = B.get_n_slices(); | |
740 | |
741 if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices)) | |
742 { | |
743 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) ); | |
744 } | |
745 } | |
746 | |
747 | |
748 | |
749 // | |
750 // functions for checking whether a cube or subcube can be interpreted as a matrix (i.e. single slice) | |
751 | |
752 | |
753 | |
754 template<typename eT1, typename eT2> | |
755 inline | |
756 void | |
757 arma_hot | |
758 arma_assert_same_size(const Cube<eT1>& A, const Mat<eT2>& B, const char* x) | |
759 { | |
760 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != 1) ) | |
761 { | |
762 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, 1, x) ); | |
763 } | |
764 } | |
765 | |
766 | |
767 | |
768 template<typename eT1, typename eT2> | |
769 inline | |
770 void | |
771 arma_hot | |
772 arma_assert_same_size(const Mat<eT1>& A, const Cube<eT2>& B, const char* x) | |
773 { | |
774 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (1 != B.n_slices) ) | |
775 { | |
776 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, 1, B.n_rows, B.n_cols, B.n_slices, x) ); | |
777 } | |
778 } | |
779 | |
780 | |
781 | |
782 template<typename eT1, typename eT2> | |
783 inline | |
784 void | |
785 arma_hot | |
786 arma_assert_same_size(const subview_cube<eT1>& A, const Mat<eT2>& B, const char* x) | |
787 { | |
788 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != 1) ) | |
789 { | |
790 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, 1, x) ); | |
791 } | |
792 } | |
793 | |
794 | |
795 | |
796 template<typename eT1, typename eT2> | |
797 inline | |
798 void | |
799 arma_hot | |
800 arma_assert_same_size(const Mat<eT1>& A, const subview_cube<eT2>& B, const char* x) | |
801 { | |
802 if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (1 != B.n_slices) ) | |
803 { | |
804 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, 1, B.n_rows, B.n_cols, B.n_slices, x) ); | |
805 } | |
806 } | |
807 | |
808 | |
809 | |
810 template<typename eT, typename T1> | |
811 inline | |
812 void | |
813 arma_assert_cube_as_mat(const Mat<eT>& M, const T1& Q, const char* x, const bool check_compat_size) | |
814 { | |
815 const uword Q_n_rows = Q.n_rows; | |
816 const uword Q_n_cols = Q.n_cols; | |
817 const uword Q_n_slices = Q.n_slices; | |
818 | |
819 const uword M_vec_state = M.vec_state; | |
820 | |
821 if(M_vec_state == 0) | |
822 { | |
823 if( ( (Q_n_rows == 1) || (Q_n_cols == 1) || (Q_n_slices == 1) ) == false ) | |
824 { | |
825 std::stringstream tmp; | |
826 | |
827 tmp << x | |
828 << ": can't interpret cube with dimensions " | |
829 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
830 << " as a matrix; one of the dimensions must be 1"; | |
831 | |
832 arma_stop( tmp.str() ); | |
833 } | |
834 } | |
835 else | |
836 { | |
837 if(Q_n_slices == 1) | |
838 { | |
839 if( (M_vec_state == 1) && (Q_n_cols != 1) ) | |
840 { | |
841 std::stringstream tmp; | |
842 | |
843 tmp << x | |
844 << ": can't interpret cube with dimensions " | |
845 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
846 << " as a column vector"; | |
847 | |
848 arma_stop( tmp.str() ); | |
849 } | |
850 | |
851 if( (M_vec_state == 2) && (Q_n_rows != 1) ) | |
852 { | |
853 std::stringstream tmp; | |
854 | |
855 tmp << x | |
856 << ": can't interpret cube with dimensions " | |
857 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
858 << " as a row vector"; | |
859 | |
860 arma_stop( tmp.str() ); | |
861 } | |
862 } | |
863 else | |
864 { | |
865 if( (Q_n_cols != 1) && (Q_n_rows != 1) ) | |
866 { | |
867 std::stringstream tmp; | |
868 | |
869 tmp << x | |
870 << ": can't interpret cube with dimensions " | |
871 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
872 << " as a vector"; | |
873 | |
874 arma_stop( tmp.str() ); | |
875 } | |
876 } | |
877 } | |
878 | |
879 | |
880 if(check_compat_size == true) | |
881 { | |
882 const uword M_n_rows = M.n_rows; | |
883 const uword M_n_cols = M.n_cols; | |
884 | |
885 if(M_vec_state == 0) | |
886 { | |
887 if( | |
888 ( | |
889 ( (Q_n_rows == M_n_rows) && (Q_n_cols == M_n_cols) ) | |
890 || | |
891 ( (Q_n_rows == M_n_rows) && (Q_n_slices == M_n_cols) ) | |
892 || | |
893 ( (Q_n_cols == M_n_rows) && (Q_n_slices == M_n_cols) ) | |
894 ) | |
895 == false | |
896 ) | |
897 { | |
898 std::stringstream tmp; | |
899 | |
900 tmp << x | |
901 << ": can't interpret cube with dimenensions " | |
902 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
903 << " as a matrix with dimensions " | |
904 << M_n_rows << 'x' << M_n_cols; | |
905 | |
906 arma_stop( tmp.str() ); | |
907 } | |
908 } | |
909 else | |
910 { | |
911 if(Q_n_slices == 1) | |
912 { | |
913 if( (M_vec_state == 1) && (Q_n_rows != M_n_rows) ) | |
914 { | |
915 std::stringstream tmp; | |
916 | |
917 tmp << x | |
918 << ": can't interpret cube with dimensions " | |
919 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
920 << " as a column vector with dimensions " | |
921 << M_n_rows << 'x' << M_n_cols; | |
922 | |
923 arma_stop( tmp.str() ); | |
924 } | |
925 | |
926 if( (M_vec_state == 2) && (Q_n_cols != M_n_cols) ) | |
927 { | |
928 std::stringstream tmp; | |
929 | |
930 tmp << x | |
931 << ": can't interpret cube with dimensions " | |
932 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
933 << " as a row vector with dimensions " | |
934 << M_n_rows << 'x' << M_n_cols; | |
935 | |
936 arma_stop( tmp.str() ); | |
937 } | |
938 } | |
939 else | |
940 { | |
941 if( ( (M_n_cols == Q_n_slices) || (M_n_rows == Q_n_slices) ) == false ) | |
942 { | |
943 std::stringstream tmp; | |
944 | |
945 tmp << x | |
946 << ": can't interpret cube with dimensions " | |
947 << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices | |
948 << " as a vector with dimensions " | |
949 << M_n_rows << 'x' << M_n_cols; | |
950 | |
951 arma_stop( tmp.str() ); | |
952 } | |
953 } | |
954 } | |
955 } | |
956 } | |
957 | |
958 | |
959 | |
960 // | |
961 // functions for checking whether two matrices have dimensions that are compatible with the matrix multiply operation | |
962 | |
963 | |
964 | |
965 inline | |
966 void | |
967 arma_hot | |
968 arma_assert_mul_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) | |
969 { | |
970 if(A_n_cols != B_n_rows) | |
971 { | |
972 arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); | |
973 } | |
974 } | |
975 | |
976 | |
977 | |
978 //! stop if given matrices are incompatible for multiplication | |
979 template<typename eT1, typename eT2> | |
980 inline | |
981 void | |
982 arma_hot | |
983 arma_assert_mul_size(const Mat<eT1>& A, const Mat<eT2>& B, const char* x) | |
984 { | |
985 const uword A_n_cols = A.n_cols; | |
986 const uword B_n_rows = B.n_rows; | |
987 | |
988 if(A_n_cols != B_n_rows) | |
989 { | |
990 arma_stop( arma_incompat_size_string(A.n_rows, A_n_cols, B_n_rows, B.n_cols, x) ); | |
991 } | |
992 } | |
993 | |
994 | |
995 | |
996 //! stop if given matrices are incompatible for multiplication | |
997 template<typename eT1, typename eT2> | |
998 inline | |
999 void | |
1000 arma_hot | |
1001 arma_assert_mul_size(const Mat<eT1>& A, const Mat<eT2>& B, const bool do_trans_A, const bool do_trans_B, const char* x) | |
1002 { | |
1003 const uword final_A_n_cols = (do_trans_A == false) ? A.n_cols : A.n_rows; | |
1004 const uword final_B_n_rows = (do_trans_B == false) ? B.n_rows : B.n_cols; | |
1005 | |
1006 if(final_A_n_cols != final_B_n_rows) | |
1007 { | |
1008 const uword final_A_n_rows = (do_trans_A == false) ? A.n_rows : A.n_cols; | |
1009 const uword final_B_n_cols = (do_trans_B == false) ? B.n_cols : B.n_rows; | |
1010 | |
1011 arma_stop( arma_incompat_size_string(final_A_n_rows, final_A_n_cols, final_B_n_rows, final_B_n_cols, x) ); | |
1012 } | |
1013 } | |
1014 | |
1015 | |
1016 | |
1017 template<typename eT1, typename eT2> | |
1018 inline | |
1019 void | |
1020 arma_hot | |
1021 arma_assert_mul_size(const Mat<eT1>& A, const subview<eT2>& B, const char* x) | |
1022 { | |
1023 if(A.n_cols != B.n_rows) | |
1024 { | |
1025 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) ); | |
1026 } | |
1027 } | |
1028 | |
1029 | |
1030 | |
1031 template<typename eT1, typename eT2> | |
1032 inline | |
1033 void | |
1034 arma_hot | |
1035 arma_assert_mul_size(const subview<eT1>& A, const Mat<eT2>& B, const char* x) | |
1036 { | |
1037 if(A.n_cols != B.n_rows) | |
1038 { | |
1039 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) ); | |
1040 } | |
1041 } | |
1042 | |
1043 | |
1044 | |
1045 template<typename eT1, typename eT2> | |
1046 inline | |
1047 void | |
1048 arma_hot | |
1049 arma_assert_mul_size(const subview<eT1>& A, const subview<eT2>& B, const char* x) | |
1050 { | |
1051 if(A.n_cols != B.n_rows) | |
1052 { | |
1053 arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) ); | |
1054 } | |
1055 } | |
1056 | |
1057 | |
1058 | |
1059 // | |
1060 // macros | |
1061 | |
1062 | |
1063 #define ARMA_STRING1(x) #x | |
1064 #define ARMA_STRING2(x) ARMA_STRING1(x) | |
1065 #define ARMA_FILELINE __FILE__ ": " ARMA_STRING2(__LINE__) | |
1066 | |
1067 | |
1068 #if defined (__GNUG__) | |
1069 #define ARMA_FNSIG __PRETTY_FUNCTION__ | |
1070 #elif defined (_MSC_VER) | |
1071 #define ARMA_FNSIG __FUNCSIG__ | |
1072 #elif defined (ARMA_USE_BOOST) | |
1073 #define ARMA_FNSIG BOOST_CURRENT_FUNCTION | |
1074 #else | |
1075 #define ARMA_FNSIG "(unknown)" | |
1076 #endif | |
1077 | |
1078 | |
1079 | |
1080 #if !defined(ARMA_NO_DEBUG) && !defined(NDEBUG) | |
1081 | |
1082 #define arma_debug_print arma_print | |
1083 #define arma_debug_warn arma_warn | |
1084 #define arma_debug_check arma_check | |
1085 #define arma_debug_set_error arma_set_error | |
1086 #define arma_debug_assert_same_size arma_assert_same_size | |
1087 #define arma_debug_assert_mul_size arma_assert_mul_size | |
1088 #define arma_debug_assert_cube_as_mat arma_assert_cube_as_mat | |
1089 | |
1090 #else | |
1091 | |
1092 #undef ARMA_EXTRA_DEBUG | |
1093 | |
1094 #define arma_debug_print true ? (void)0 : arma_print | |
1095 #define arma_debug_warn true ? (void)0 : arma_warn | |
1096 #define arma_debug_check true ? (void)0 : arma_check | |
1097 #define arma_debug_set_error true ? (void)0 : arma_set_error | |
1098 #define arma_debug_assert_same_size true ? (void)0 : arma_assert_same_size | |
1099 #define arma_debug_assert_mul_size true ? (void)0 : arma_assert_mul_size | |
1100 #define arma_debug_assert_cube_as_mat true ? (void)0 : arma_debug_assert_cube_as_mat | |
1101 | |
1102 #endif | |
1103 | |
1104 | |
1105 | |
1106 #if defined(ARMA_EXTRA_DEBUG) | |
1107 | |
1108 #define arma_extra_debug_sigprint arma_sigprint(ARMA_FNSIG); arma_bktprint | |
1109 #define arma_extra_debug_sigprint_this arma_sigprint(ARMA_FNSIG); arma_thisprint | |
1110 #define arma_extra_debug_print arma_print | |
1111 #define arma_extra_debug_warn arma_warn | |
1112 #define arma_extra_debug_check arma_check | |
1113 | |
1114 #else | |
1115 | |
1116 #define arma_extra_debug_sigprint true ? (void)0 : arma_bktprint | |
1117 #define arma_extra_debug_sigprint_this true ? (void)0 : arma_thisprint | |
1118 #define arma_extra_debug_print true ? (void)0 : arma_print | |
1119 #define arma_extra_debug_warn true ? (void)0 : arma_warn | |
1120 #define arma_extra_debug_check true ? (void)0 : arma_check | |
1121 | |
1122 #endif | |
1123 | |
1124 | |
1125 | |
1126 | |
1127 #if defined(ARMA_EXTRA_DEBUG) | |
1128 | |
1129 namespace junk | |
1130 { | |
1131 class arma_first_extra_debug_message | |
1132 { | |
1133 public: | |
1134 | |
1135 inline | |
1136 arma_cold | |
1137 arma_first_extra_debug_message() | |
1138 { | |
1139 union | |
1140 { | |
1141 unsigned short a; | |
1142 unsigned char b[sizeof(unsigned short)]; | |
1143 } endian_test; | |
1144 | |
1145 endian_test.a = 1; | |
1146 | |
1147 const bool little_endian = (endian_test.b[0] == 1); | |
1148 const char* nickname = ARMA_VERSION_NAME; | |
1149 | |
1150 std::ostream& out = get_stream_err1(); | |
1151 | |
1152 out << "@ ---" << '\n'; | |
1153 out << "@ Armadillo " | |
1154 << arma_version::major << '.' << arma_version::minor << '.' << arma_version::patch | |
1155 << " (" << nickname << ")\n"; | |
1156 | |
1157 out << "@ arma_config::mat_prealloc = " << arma_config::mat_prealloc << " element(s)\n"; | |
1158 out << "@ arma_config::atlas = " << arma_config::atlas << '\n'; | |
1159 out << "@ arma_config::lapack = " << arma_config::lapack << '\n'; | |
1160 out << "@ arma_config::blas = " << arma_config::blas << '\n'; | |
1161 out << "@ arma_config::boost = " << arma_config::boost << '\n'; | |
1162 out << "@ arma_config::boost_date = " << arma_config::boost_date << '\n'; | |
1163 out << "@ arma_config::good_comp = " << arma_config::good_comp << '\n'; | |
1164 out << "@ arma_config::extra_code = " << arma_config::extra_code << '\n'; | |
1165 out << "@ sizeof(void*) = " << sizeof(void*) << '\n'; | |
1166 out << "@ sizeof(uword) = " << sizeof(uword) << '\n'; | |
1167 out << "@ sizeof(int) = " << sizeof(int) << '\n'; | |
1168 out << "@ sizeof(long) = " << sizeof(long) << '\n'; | |
1169 out << "@ sizeof(blas_int) = " << sizeof(blas_int) << '\n'; | |
1170 out << "@ little_endian = " << little_endian << '\n'; | |
1171 out << "@ ---" << std::endl; | |
1172 } | |
1173 | |
1174 }; | |
1175 | |
1176 static arma_first_extra_debug_message arma_first_extra_debug_message_run; | |
1177 } | |
1178 | |
1179 #endif | |
1180 | |
1181 | |
1182 | |
1183 //! @} |