comparison liboctave/Sparse.cc @ 10480:19e1e4470e01

remove old sparse assembly ctors
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 31 Mar 2010 10:24:57 +0200
parents ded9beac7582
children 6a9571b57745
comparison
equal deleted inserted replaced
10479:ded9beac7582 10480:19e1e4470e01
310 xdata(j) = a.data(j); 310 xdata(j) = a.data(j);
311 xridx(j) = ii; 311 xridx(j) = ii;
312 } 312 }
313 for (octave_idx_type k = kk; k < new_nc; k++) 313 for (octave_idx_type k = kk; k < new_nc; k++)
314 xcidx(k+1) = new_nzmx; 314 xcidx(k+1) = new_nzmx;
315 }
316 }
317
318 template <class T>
319 Sparse<T>::Sparse (const Array<T>& a, const Array<octave_idx_type>& r,
320 const Array<octave_idx_type>& c, octave_idx_type nr,
321 octave_idx_type nc, bool sum_terms)
322 : dimensions (dim_vector (nr, nc)), idx (0), idx_count (0)
323 {
324 octave_idx_type a_len = a.length ();
325 octave_idx_type r_len = r.length ();
326 octave_idx_type c_len = c.length ();
327 bool ri_scalar = (r_len == 1);
328 bool ci_scalar = (c_len == 1);
329 bool cf_scalar = (a_len == 1);
330
331 if ((a_len != r_len && !cf_scalar && !ri_scalar) ||
332 (a_len != c_len && !cf_scalar && !ci_scalar) ||
333 (r_len != c_len && !ri_scalar && !ci_scalar) || nr < 0 || nc < 0)
334 {
335 (*current_liboctave_error_handler)
336 ("Sparse::Sparse (const Array<T>&, const Array<octave_idx_type>&, ...): dimension mismatch");
337 rep = nil_rep ();
338 dimensions = dim_vector (0, 0);
339 }
340 else
341 {
342 octave_idx_type max_nzmx = (r_len > c_len ? r_len : c_len);
343
344 OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl *, sidx, max_nzmx);
345 OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl, sidxX, max_nzmx);
346
347 for (octave_idx_type i = 0; i < max_nzmx; i++)
348 sidx[i] = &sidxX[i];
349
350 octave_idx_type actual_nzmx = 0;
351 octave_quit ();
352 for (octave_idx_type i = 0; i < max_nzmx; i++)
353 {
354 octave_idx_type rowidx = (ri_scalar ? r(0) : r(i));
355 octave_idx_type colidx = (ci_scalar ? c(0) : c(i));
356 if (rowidx < nr && rowidx >= 0 &&
357 colidx < nc && colidx >= 0 )
358 {
359 if ( a (cf_scalar ? 0 : i ) != T ())
360 {
361 sidx[actual_nzmx]->r = rowidx;
362 sidx[actual_nzmx]->c = colidx;
363 sidx[actual_nzmx]->idx = i;
364 actual_nzmx++;
365 }
366 }
367 else
368 {
369 (*current_liboctave_error_handler)
370 ("Sparse::Sparse : index (%d,%d) out of range",
371 rowidx + 1, colidx + 1);
372 rep = nil_rep ();
373 dimensions = dim_vector (0, 0);
374 return;
375 }
376 }
377
378 if (actual_nzmx == 0)
379 rep = new typename Sparse<T>::SparseRep (nr, nc);
380 else
381 {
382 octave_quit ();
383 octave_sort<octave_sparse_sort_idxl *>
384 lsort (octave_sparse_sidxl_comp);
385
386 lsort.sort (sidx, actual_nzmx);
387 octave_quit ();
388
389 // Now count the unique non-zero values
390 octave_idx_type real_nzmx = 1;
391 for (octave_idx_type i = 1; i < actual_nzmx; i++)
392 if (sidx[i-1]->r != sidx[i]->r || sidx[i-1]->c != sidx[i]->c)
393 real_nzmx++;
394
395 rep = new typename Sparse<T>::SparseRep (nr, nc, real_nzmx);
396
397 octave_idx_type cx = 0;
398 octave_idx_type prev_rval = -1;
399 octave_idx_type prev_cval = -1;
400 octave_idx_type ii = -1;
401 xcidx (0) = 0;
402 for (octave_idx_type i = 0; i < actual_nzmx; i++)
403 {
404 octave_quit ();
405 octave_idx_type iidx = sidx[i]->idx;
406 octave_idx_type rval = sidx[i]->r;
407 octave_idx_type cval = sidx[i]->c;
408
409 if (prev_cval < cval || (prev_rval < rval && prev_cval == cval))
410 {
411 octave_idx_type ci = static_cast<octave_idx_type> (c (ci_scalar ? 0 : iidx));
412 ii++;
413 while (cx < ci)
414 xcidx (++cx) = ii;
415 xdata(ii) = a (cf_scalar ? 0 : iidx);
416 xridx(ii) = static_cast<octave_idx_type> (r (ri_scalar ? 0 : iidx));
417 }
418 else
419 {
420 if (sum_terms)
421 xdata(ii) += a (cf_scalar ? 0 : iidx);
422 else
423 xdata(ii) = a (cf_scalar ? 0 : iidx);
424 }
425 prev_rval = rval;
426 prev_cval = cval;
427 }
428
429 while (cx < nc)
430 xcidx (++cx) = ii + 1;
431 }
432 }
433 }
434
435 template <class T>
436 Sparse<T>::Sparse (const Array<T>& a, const Array<double>& r,
437 const Array<double>& c, octave_idx_type nr,
438 octave_idx_type nc, bool sum_terms)
439 : dimensions (dim_vector (nr, nc)), idx (0), idx_count (0)
440 {
441 octave_idx_type a_len = a.length ();
442 octave_idx_type r_len = r.length ();
443 octave_idx_type c_len = c.length ();
444 bool ri_scalar = (r_len == 1);
445 bool ci_scalar = (c_len == 1);
446 bool cf_scalar = (a_len == 1);
447
448 if ((a_len != r_len && !cf_scalar && !ri_scalar) ||
449 (a_len != c_len && !cf_scalar && !ci_scalar) ||
450 (r_len != c_len && !ri_scalar && !ci_scalar) || nr < 0 || nc < 0)
451 {
452 (*current_liboctave_error_handler)
453 ("Sparse::Sparse (const Array<T>&, const Array<double>&, ...): dimension mismatch");
454 rep = nil_rep ();
455 dimensions = dim_vector (0, 0);
456 }
457 else
458 {
459 octave_idx_type max_nzmx = (r_len > c_len ? r_len : c_len);
460
461 OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl *, sidx, max_nzmx);
462 OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl, sidxX, max_nzmx);
463
464 for (octave_idx_type i = 0; i < max_nzmx; i++)
465 sidx[i] = &sidxX[i];
466
467 octave_idx_type actual_nzmx = 0;
468 octave_quit ();
469
470 for (octave_idx_type i = 0; i < max_nzmx; i++)
471 {
472 octave_idx_type rowidx = static_cast<octave_idx_type> (ri_scalar ? r(0) : r(i));
473 octave_idx_type colidx = static_cast<octave_idx_type> (ci_scalar ? c(0) : c(i));
474 if (rowidx < nr && rowidx >= 0 &&
475 colidx < nc && colidx >= 0 )
476 {
477 if ( a (cf_scalar ? 0 : i ) != T ())
478 {
479 sidx[actual_nzmx]->r = rowidx;
480 sidx[actual_nzmx]->c = colidx;
481 sidx[actual_nzmx]->idx = i;
482 actual_nzmx++;
483 }
484 }
485 else
486 {
487 (*current_liboctave_error_handler)
488 ("Sparse::Sparse : index (%d,%d) out of range",
489 rowidx + 1, colidx + 1);
490 rep = nil_rep ();
491 dimensions = dim_vector (0, 0);
492 return;
493 }
494 }
495
496 if (actual_nzmx == 0)
497 rep = new typename Sparse<T>::SparseRep (nr, nc);
498 else
499 {
500 octave_quit ();
501 octave_sort<octave_sparse_sort_idxl *>
502 lsort (octave_sparse_sidxl_comp);
503
504 lsort.sort (sidx, actual_nzmx);
505 octave_quit ();
506
507 // Now count the unique non-zero values
508 octave_idx_type real_nzmx = 1;
509 for (octave_idx_type i = 1; i < actual_nzmx; i++)
510 if (sidx[i-1]->r != sidx[i]->r || sidx[i-1]->c != sidx[i]->c)
511 real_nzmx++;
512
513 rep = new typename Sparse<T>::SparseRep (nr, nc, real_nzmx);
514
515 octave_idx_type cx = 0;
516 octave_idx_type prev_rval = -1;
517 octave_idx_type prev_cval = -1;
518 octave_idx_type ii = -1;
519 xcidx (0) = 0;
520 for (octave_idx_type i = 0; i < actual_nzmx; i++)
521 {
522 octave_quit ();
523 octave_idx_type iidx = sidx[i]->idx;
524 octave_idx_type rval = sidx[i]->r;
525 octave_idx_type cval = sidx[i]->c;
526
527 if (prev_cval < cval || (prev_rval < rval && prev_cval == cval))
528 {
529 octave_idx_type ci = static_cast<octave_idx_type> (c (ci_scalar ? 0 : iidx));
530 ii++;
531
532 while (cx < ci)
533 xcidx (++cx) = ii;
534 xdata(ii) = a (cf_scalar ? 0 : iidx);
535 xridx(ii) = static_cast<octave_idx_type> (r (ri_scalar ? 0 : iidx));
536 }
537 else
538 {
539 if (sum_terms)
540 xdata(ii) += a (cf_scalar ? 0 : iidx);
541 else
542 xdata(ii) = a (cf_scalar ? 0 : iidx);
543 }
544 prev_rval = rval;
545 prev_cval = cval;
546 }
547
548 while (cx < nc)
549 xcidx (++cx) = ii + 1;
550 }
551 } 315 }
552 } 316 }
553 317
554 template <class T> 318 template <class T>
555 Sparse<T>::Sparse (const Array<T>& a, const idx_vector& r, 319 Sparse<T>::Sparse (const Array<T>& a, const idx_vector& r,