comparison liboctave/numeric/fCmplxCHOL.cc @ 21136:7cac4e7458f2

maint: clean up code around calls to current_liboctave_error_handler. Remove statements after call to handler that are no longer reachable. Place input validation first and immediately call handler if necessary. Change if/error_handler/else to if/error_handler and re-indent code. * Array-util.cc, Array.cc, CColVector.cc, CDiagMatrix.cc, CMatrix.cc, CNDArray.cc, CRowVector.cc, CSparse.cc, DiagArray2.cc, MArray.cc, PermMatrix.cc, Sparse.cc, Sparse.h, chMatrix.cc, chNDArray.cc, dColVector.cc, dDiagMatrix.cc, dMatrix.cc, dNDArray.cc, dRowVector.cc, dSparse.cc, fCColVector.cc, fCDiagMatrix.cc, fCMatrix.cc, fCNDArray.cc, fCRowVector.cc, fColVector.cc, fDiagMatrix.cc, fMatrix.cc, fNDArray.cc, fRowVector.cc, idx-vector.cc, CmplxAEPBAL.cc, CmplxCHOL.cc, CmplxGEPBAL.cc, CmplxHESS.cc, CmplxLU.cc, CmplxQR.cc, CmplxSCHUR.cc, CmplxSVD.cc, DASPK.cc, EIG.cc, LSODE.cc, Quad.cc, SparseCmplxCHOL.cc, SparseCmplxLU.cc, SparseCmplxQR.cc, SparseQR.cc, SparsedbleCHOL.cc, SparsedbleLU.cc, base-lu.cc, bsxfun-defs.cc, dbleAEPBAL.cc, dbleCHOL.cc, dbleGEPBAL.cc, dbleHESS.cc, dbleLU.cc, dbleQR.cc, dbleSCHUR.cc, dbleSVD.cc, eigs-base.cc, fCmplxAEPBAL.cc, fCmplxCHOL.cc, fCmplxLU.cc, fCmplxQR.cc, fCmplxSCHUR.cc, fEIG.cc, floatAEPBAL.cc, floatCHOL.cc, floatGEPBAL.cc, floatHESS.cc, floatLU.cc, floatQR.cc, floatSCHUR.cc, floatSVD.cc, lo-specfun.cc, oct-fftw.cc, oct-rand.cc, oct-spparms.cc, sparse-base-chol.cc, sparse-dmsolve.cc, file-ops.cc, lo-sysdep.cc, mach-info.cc, oct-env.cc, oct-syscalls.cc, cmd-edit.cc, cmd-hist.cc, data-conv.cc, lo-ieee.cc, lo-regexp.cc, oct-base64.cc, oct-shlib.cc, pathsearch.cc, singleton-cleanup.cc, sparse-util.cc, unwind-prot.cc: Remove statements after call to handler that are no longer reachable. Place input validation first and immediately call handler if necessary. Change if/error_handler/else to if/error_handler and re-indent code.
author Rik <rik@octave.org>
date Sat, 23 Jan 2016 13:52:03 -0800
parents ab705b42cfd8
children f7121e111991
comparison
equal deleted inserted replaced
21135:95da3bc8a281 21136:7cac4e7458f2
90 { 90 {
91 octave_idx_type a_nr = a.rows (); 91 octave_idx_type a_nr = a.rows ();
92 octave_idx_type a_nc = a.cols (); 92 octave_idx_type a_nc = a.cols ();
93 93
94 if (a_nr != a_nc) 94 if (a_nr != a_nc)
95 { 95 (*current_liboctave_error_handler)
96 (*current_liboctave_error_handler) 96 ("FloatComplexCHOL requires square matrix");
97 ("FloatComplexCHOL requires square matrix");
98 return -1;
99 }
100 97
101 octave_idx_type n = a_nc; 98 octave_idx_type n = a_nc;
102 octave_idx_type info; 99 octave_idx_type info;
103 100
104 is_upper = upper; 101 is_upper = upper;
163 FloatComplexMatrix retval; 160 FloatComplexMatrix retval;
164 161
165 octave_idx_type r_nr = r.rows (); 162 octave_idx_type r_nr = r.rows ();
166 octave_idx_type r_nc = r.cols (); 163 octave_idx_type r_nc = r.cols ();
167 164
168 if (r_nr == r_nc) 165 if (r_nr != r_nc)
169 { 166 (*current_liboctave_error_handler) ("chol2inv requires square matrix");
170 octave_idx_type n = r_nc; 167
171 octave_idx_type info; 168 octave_idx_type n = r_nc;
172 169 octave_idx_type info;
173 FloatComplexMatrix tmp = r; 170
174 171 FloatComplexMatrix tmp = r;
172
173 if (is_upper)
174 F77_XFCN (cpotri, CPOTRI, (F77_CONST_CHAR_ARG2 ("U", 1), n,
175 tmp.fortran_vec (), n, info
176 F77_CHAR_ARG_LEN (1)));
177 else
178 F77_XFCN (cpotri, CPOTRI, (F77_CONST_CHAR_ARG2 ("L", 1), n,
179 tmp.fortran_vec (), n, info
180 F77_CHAR_ARG_LEN (1)));
181
182 // If someone thinks of a more graceful way of doing this (or
183 // faster for that matter :-)), please let me know!
184
185 if (n > 1)
186 {
175 if (is_upper) 187 if (is_upper)
176 F77_XFCN (cpotri, CPOTRI, (F77_CONST_CHAR_ARG2 ("U", 1), n, 188 for (octave_idx_type j = 0; j < r_nc; j++)
177 tmp.fortran_vec (), n, info 189 for (octave_idx_type i = j+1; i < r_nr; i++)
178 F77_CHAR_ARG_LEN (1))); 190 tmp.xelem (i, j) = tmp.xelem (j, i);
179 else 191 else
180 F77_XFCN (cpotri, CPOTRI, (F77_CONST_CHAR_ARG2 ("L", 1), n, 192 for (octave_idx_type j = 0; j < r_nc; j++)
181 tmp.fortran_vec (), n, info 193 for (octave_idx_type i = j+1; i < r_nr; i++)
182 F77_CHAR_ARG_LEN (1))); 194 tmp.xelem (j, i) = tmp.xelem (i, j);
183 195 }
184 // If someone thinks of a more graceful way of doing this (or 196
185 // faster for that matter :-)), please let me know! 197 retval = tmp;
186
187 if (n > 1)
188 {
189 if (is_upper)
190 for (octave_idx_type j = 0; j < r_nc; j++)
191 for (octave_idx_type i = j+1; i < r_nr; i++)
192 tmp.xelem (i, j) = tmp.xelem (j, i);
193 else
194 for (octave_idx_type j = 0; j < r_nc; j++)
195 for (octave_idx_type i = j+1; i < r_nr; i++)
196 tmp.xelem (j, i) = tmp.xelem (i, j);
197 }
198
199 retval = tmp;
200 }
201 else
202 (*current_liboctave_error_handler) ("chol2inv requires square matrix");
203 198
204 return retval; 199 return retval;
205 } 200 }
206 201
207 // Compute the inverse of a matrix using the Cholesky factorization. 202 // Compute the inverse of a matrix using the Cholesky factorization.
212 } 207 }
213 208
214 void 209 void
215 FloatComplexCHOL::set (const FloatComplexMatrix& R) 210 FloatComplexCHOL::set (const FloatComplexMatrix& R)
216 { 211 {
217 if (R.is_square ()) 212 if (! R.is_square ())
218 chol_mat = R;
219 else
220 (*current_liboctave_error_handler) ("CHOL requires square matrix"); 213 (*current_liboctave_error_handler) ("CHOL requires square matrix");
214
215 chol_mat = R;
221 } 216 }
222 217
223 #ifdef HAVE_QRUPDATE 218 #ifdef HAVE_QRUPDATE
224 219
225 void 220 void
226 FloatComplexCHOL::update (const FloatComplexColumnVector& u) 221 FloatComplexCHOL::update (const FloatComplexColumnVector& u)
227 { 222 {
228 octave_idx_type n = chol_mat.rows (); 223 octave_idx_type n = chol_mat.rows ();
229 224
230 if (u.numel () == n) 225 if (u.numel () != n)
231 {
232 FloatComplexColumnVector utmp = u;
233
234 OCTAVE_LOCAL_BUFFER (float, rw, n);
235
236 F77_XFCN (cch1up, CCH1UP, (n, chol_mat.fortran_vec (), chol_mat.rows (),
237 utmp.fortran_vec (), rw));
238 }
239 else
240 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch"); 226 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch");
227
228 FloatComplexColumnVector utmp = u;
229
230 OCTAVE_LOCAL_BUFFER (float, rw, n);
231
232 F77_XFCN (cch1up, CCH1UP, (n, chol_mat.fortran_vec (), chol_mat.rows (),
233 utmp.fortran_vec (), rw));
241 } 234 }
242 235
243 octave_idx_type 236 octave_idx_type
244 FloatComplexCHOL::downdate (const FloatComplexColumnVector& u) 237 FloatComplexCHOL::downdate (const FloatComplexColumnVector& u)
245 { 238 {
246 octave_idx_type info = -1; 239 octave_idx_type info = -1;
247 240
248 octave_idx_type n = chol_mat.rows (); 241 octave_idx_type n = chol_mat.rows ();
249 242
250 if (u.numel () == n) 243 if (u.numel () != n)
251 {
252 FloatComplexColumnVector utmp = u;
253
254 OCTAVE_LOCAL_BUFFER (float, rw, n);
255
256 F77_XFCN (cch1dn, CCH1DN, (n, chol_mat.fortran_vec (), chol_mat.rows (),
257 utmp.fortran_vec (), rw, info));
258 }
259 else
260 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch"); 244 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch");
245
246 FloatComplexColumnVector utmp = u;
247
248 OCTAVE_LOCAL_BUFFER (float, rw, n);
249
250 F77_XFCN (cch1dn, CCH1DN, (n, chol_mat.fortran_vec (), chol_mat.rows (),
251 utmp.fortran_vec (), rw, info));
261 252
262 return info; 253 return info;
263 } 254 }
264 255
265 octave_idx_type 256 octave_idx_type
270 261
271 octave_idx_type n = chol_mat.rows (); 262 octave_idx_type n = chol_mat.rows ();
272 263
273 if (u.numel () != n + 1) 264 if (u.numel () != n + 1)
274 (*current_liboctave_error_handler) ("cholinsert: dimension mismatch"); 265 (*current_liboctave_error_handler) ("cholinsert: dimension mismatch");
275 else if (j < 0 || j > n) 266 if (j < 0 || j > n)
276 (*current_liboctave_error_handler) ("cholinsert: index out of range"); 267 (*current_liboctave_error_handler) ("cholinsert: index out of range");
277 else 268
278 { 269 FloatComplexColumnVector utmp = u;
279 FloatComplexColumnVector utmp = u; 270
280 271 OCTAVE_LOCAL_BUFFER (float, rw, n);
281 OCTAVE_LOCAL_BUFFER (float, rw, n); 272
282 273 chol_mat.resize (n+1, n+1);
283 chol_mat.resize (n+1, n+1); 274
284 275 F77_XFCN (cchinx, CCHINX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
285 F77_XFCN (cchinx, CCHINX, (n, chol_mat.fortran_vec (), chol_mat.rows (), 276 j + 1, utmp.fortran_vec (), rw, info));
286 j + 1, utmp.fortran_vec (), rw, info));
287 }
288 277
289 return info; 278 return info;
290 } 279 }
291 280
292 void 281 void
294 { 283 {
295 octave_idx_type n = chol_mat.rows (); 284 octave_idx_type n = chol_mat.rows ();
296 285
297 if (j < 0 || j > n-1) 286 if (j < 0 || j > n-1)
298 (*current_liboctave_error_handler) ("choldelete: index out of range"); 287 (*current_liboctave_error_handler) ("choldelete: index out of range");
299 else 288
300 { 289 OCTAVE_LOCAL_BUFFER (float, rw, n);
301 OCTAVE_LOCAL_BUFFER (float, rw, n); 290
302 291 F77_XFCN (cchdex, CCHDEX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
303 F77_XFCN (cchdex, CCHDEX, (n, chol_mat.fortran_vec (), chol_mat.rows (), 292 j + 1, rw));
304 j + 1, rw)); 293
305 294 chol_mat.resize (n-1, n-1);
306 chol_mat.resize (n-1, n-1);
307 }
308 } 295 }
309 296
310 void 297 void
311 FloatComplexCHOL::shift_sym (octave_idx_type i, octave_idx_type j) 298 FloatComplexCHOL::shift_sym (octave_idx_type i, octave_idx_type j)
312 { 299 {
313 octave_idx_type n = chol_mat.rows (); 300 octave_idx_type n = chol_mat.rows ();
314 301
315 if (i < 0 || i > n-1 || j < 0 || j > n-1) 302 if (i < 0 || i > n-1 || j < 0 || j > n-1)
316 (*current_liboctave_error_handler) ("cholshift: index out of range"); 303 (*current_liboctave_error_handler) ("cholshift: index out of range");
317 else 304
318 { 305 OCTAVE_LOCAL_BUFFER (FloatComplex, w, n);
319 OCTAVE_LOCAL_BUFFER (FloatComplex, w, n); 306 OCTAVE_LOCAL_BUFFER (float, rw, n);
320 OCTAVE_LOCAL_BUFFER (float, rw, n); 307
321 308 F77_XFCN (cchshx, CCHSHX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
322 F77_XFCN (cchshx, CCHSHX, (n, chol_mat.fortran_vec (), chol_mat.rows (), 309 i + 1, j + 1, w, rw));
323 i + 1, j + 1, w, rw));
324 }
325 } 310 }
326 311
327 #else 312 #else
328 313
329 void 314 void
331 { 316 {
332 warn_qrupdate_once (); 317 warn_qrupdate_once ();
333 318
334 octave_idx_type n = chol_mat.rows (); 319 octave_idx_type n = chol_mat.rows ();
335 320
336 if (u.length () == n) 321 if (u.length () != n)
337 {
338 init (chol_mat.hermitian () * chol_mat
339 + FloatComplexMatrix (u) * FloatComplexMatrix (u).hermitian (),
340 true, false);
341 }
342 else
343 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch"); 322 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch");
323
324 init (chol_mat.hermitian () * chol_mat
325 + FloatComplexMatrix (u) * FloatComplexMatrix (u).hermitian (),
326 true, false);
344 } 327 }
345 328
346 static bool 329 static bool
347 singular (const FloatComplexMatrix& a) 330 singular (const FloatComplexMatrix& a)
348 { 331 {
358 341
359 octave_idx_type info = -1; 342 octave_idx_type info = -1;
360 343
361 octave_idx_type n = chol_mat.rows (); 344 octave_idx_type n = chol_mat.rows ();
362 345
363 if (u.length () == n) 346 if (u.length () != n)
364 { 347 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch");
365 if (singular (chol_mat)) 348
366 info = 2; 349 if (singular (chol_mat))
367 else 350 info = 2;
368 {
369 info = init (chol_mat.hermitian () * chol_mat
370 - FloatComplexMatrix (u)
371 * FloatComplexMatrix (u).hermitian (),
372 true, false);
373 if (info) info = 1;
374 }
375 }
376 else 351 else
377 (*current_liboctave_error_handler) ("cholupdate: dimension mismatch"); 352 {
353 info = init (chol_mat.hermitian () * chol_mat
354 - FloatComplexMatrix (u)
355 * FloatComplexMatrix (u).hermitian (),
356 true, false);
357 if (info) info = 1;
358 }
378 359
379 return info; 360 return info;
380 } 361 }
381 362
382 octave_idx_type 363 octave_idx_type
389 370
390 octave_idx_type n = chol_mat.rows (); 371 octave_idx_type n = chol_mat.rows ();
391 372
392 if (u.length () != n + 1) 373 if (u.length () != n + 1)
393 (*current_liboctave_error_handler) ("cholinsert: dimension mismatch"); 374 (*current_liboctave_error_handler) ("cholinsert: dimension mismatch");
394 else if (j < 0 || j > n) 375 if (j < 0 || j > n)
395 (*current_liboctave_error_handler) ("cholinsert: index out of range"); 376 (*current_liboctave_error_handler) ("cholinsert: index out of range");
377
378 if (singular (chol_mat))
379 info = 2;
380 else if (u(j).imag () != 0.0)
381 info = 3;
396 else 382 else
397 { 383 {
398 if (singular (chol_mat)) 384 FloatComplexMatrix a = chol_mat.hermitian () * chol_mat;
399 info = 2; 385 FloatComplexMatrix a1 (n+1, n+1);
400 else if (u(j).imag () != 0.0) 386 for (octave_idx_type k = 0; k < n+1; k++)
401 info = 3; 387 for (octave_idx_type l = 0; l < n+1; l++)
402 else 388 {
403 { 389 if (l == j)
404 FloatComplexMatrix a = chol_mat.hermitian () * chol_mat; 390 a1(k, l) = u(k);
405 FloatComplexMatrix a1 (n+1, n+1); 391 else if (k == j)
406 for (octave_idx_type k = 0; k < n+1; k++) 392 a1(k, l) = std::conj (u(l));
407 for (octave_idx_type l = 0; l < n+1; l++) 393 else
408 { 394 a1(k, l) = a(k < j ? k : k-1, l < j ? l : l-1);
409 if (l == j) 395 }
410 a1(k, l) = u(k); 396 info = init (a1, true, false);
411 else if (k == j) 397 if (info) info = 1;
412 a1(k, l) = std::conj (u(l));
413 else
414 a1(k, l) = a(k < j ? k : k-1, l < j ? l : l-1);
415 }
416 info = init (a1, true, false);
417 if (info) info = 1;
418 }
419 } 398 }
420 399
421 return info; 400 return info;
422 } 401 }
423 402
428 407
429 octave_idx_type n = chol_mat.rows (); 408 octave_idx_type n = chol_mat.rows ();
430 409
431 if (j < 0 || j > n-1) 410 if (j < 0 || j > n-1)
432 (*current_liboctave_error_handler) ("choldelete: index out of range"); 411 (*current_liboctave_error_handler) ("choldelete: index out of range");
433 else 412
434 { 413 FloatComplexMatrix a = chol_mat.hermitian () * chol_mat;
435 FloatComplexMatrix a = chol_mat.hermitian () * chol_mat; 414 a.delete_elements (1, idx_vector (j));
436 a.delete_elements (1, idx_vector (j)); 415 a.delete_elements (0, idx_vector (j));
437 a.delete_elements (0, idx_vector (j)); 416 init (a, true, false);
438 init (a, true, false);
439 }
440 } 417 }
441 418
442 void 419 void
443 FloatComplexCHOL::shift_sym (octave_idx_type i, octave_idx_type j) 420 FloatComplexCHOL::shift_sym (octave_idx_type i, octave_idx_type j)
444 { 421 {
446 423
447 octave_idx_type n = chol_mat.rows (); 424 octave_idx_type n = chol_mat.rows ();
448 425
449 if (i < 0 || i > n-1 || j < 0 || j > n-1) 426 if (i < 0 || i > n-1 || j < 0 || j > n-1)
450 (*current_liboctave_error_handler) ("cholshift: index out of range"); 427 (*current_liboctave_error_handler) ("cholshift: index out of range");
451 else 428
452 { 429 FloatComplexMatrix a = chol_mat.hermitian () * chol_mat;
453 FloatComplexMatrix a = chol_mat.hermitian () * chol_mat; 430 Array<octave_idx_type> p (dim_vector (n, 1));
454 Array<octave_idx_type> p (dim_vector (n, 1)); 431 for (octave_idx_type k = 0; k < n; k++) p(k) = k;
455 for (octave_idx_type k = 0; k < n; k++) p(k) = k; 432 if (i < j)
456 if (i < j) 433 {
457 { 434 for (octave_idx_type k = i; k < j; k++) p(k) = k+1;
458 for (octave_idx_type k = i; k < j; k++) p(k) = k+1; 435 p(j) = i;
459 p(j) = i; 436 }
460 } 437 else if (j < i)
461 else if (j < i) 438 {
462 { 439 p(j) = i;
463 p(j) = i; 440 for (octave_idx_type k = j+1; k < i+1; k++) p(k) = k-1;
464 for (octave_idx_type k = j+1; k < i+1; k++) p(k) = k-1; 441 }
465 } 442
466 443 init (a.index (idx_vector (p), idx_vector (p)), true, false);
467 init (a.index (idx_vector (p), idx_vector (p)), true, false);
468 }
469 } 444 }
470 445
471 #endif 446 #endif
472 447
473 FloatComplexMatrix 448 FloatComplexMatrix