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 //! @}
|