annotate armadillo-3.900.4/include/armadillo_bits/debug.hpp @ 84:55a047986812 tip

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