|
452 | 452 | (apply list->array domain (vector->list vec) o))
|
453 | 453 |
|
454 | 454 | (define (array-assign! destination source)
|
455 |
| - (assert (and (mutable-array? destination) (array? source) |
456 |
| - (interval= (array-domain destination) (array-domain source)))) |
457 |
| - (let ((getter (array-getter source)) |
458 |
| - (setter (array-setter destination))) |
459 |
| - (interval-for-each |
460 |
| - (case (array-dimension destination) |
461 |
| - ((1) (lambda (i) (setter (getter i) i))) |
462 |
| - ((2) (lambda (i j) (setter (getter i j) i j))) |
463 |
| - ((3) (lambda (i j k) (setter (getter i j k) i j k))) |
464 |
| - (else |
465 |
| - (lambda multi-index |
466 |
| - (apply setter (apply getter multi-index) multi-index)))) |
467 |
| - (array-domain source)) |
468 |
| - destination)) |
| 455 | + (let ((dest-domain (array-domain destination)) |
| 456 | + (source-domain (array-domain source))) |
| 457 | + (assert (and (mutable-array? destination) (array? source) |
| 458 | + (interval= dest-domain source-domain))) |
| 459 | + (let ((getter (array-getter source)) |
| 460 | + (setter (array-setter destination))) |
| 461 | + (interval-for-each |
| 462 | + (case (array-dimension destination) |
| 463 | + ((1) (lambda (i) (setter (getter i) i))) |
| 464 | + ((2) (lambda (i j) (setter (getter i j) i j))) |
| 465 | + ((3) (lambda (i j k) (setter (getter i j k) i j k))) |
| 466 | + (else |
| 467 | + (lambda multi-index |
| 468 | + (apply setter (apply getter multi-index) multi-index)))) |
| 469 | + (array-domain source)) |
| 470 | + destination))) |
469 | 471 |
|
470 | 472 | (define (reshape-without-copy array new-domain)
|
471 | 473 | (let* ((domain (array-domain array))
|
|
612 | 614 | (pair? arrays)
|
613 | 615 | (every array? arrays)
|
614 | 616 | (< -1 axis (array-dimension (car arrays)))))
|
615 |
| - (let* ((a (car arrays)) |
| 617 | + (let* ((arrays (remove array-empty? arrays)) |
| 618 | + (a (car arrays)) |
616 | 619 | (a-domain (array-domain a))
|
617 | 620 | (storage (if (pair? o) (car o) generic-storage-class))
|
618 | 621 | (mutable? (if (and (pair? o) (pair? (cdr o)))
|
|
634 | 637 | (vector-ref c-hi axis)
|
635 | 638 | (cdr arrays)))
|
636 | 639 | (let* ((c-domain (make-interval c-lo c-hi))
|
637 |
| - (c (make-specialized-array/default c-domain storage safe?)) |
638 |
| - (b-trans (make-vector (array-dimension a) 0))) |
| 640 | + (c (make-specialized-array/default c-domain storage safe?))) |
639 | 641 | (array-assign!
|
640 | 642 | (array-extract c (make-interval c-lo (interval-widths a-domain)))
|
641 | 643 | (array-translate a (vector-map - a-lo)))
|
642 | 644 | (let lp ((arrays (cdr arrays))
|
643 | 645 | (b-offset (- (interval-upper-bound a-domain axis)
|
644 | 646 | (interval-lower-bound a-domain axis))))
|
645 |
| - (if (null? arrays) |
646 |
| - (if mutable? c (array-freeze! c)) |
647 |
| - (let* ((b (car arrays)) |
648 |
| - (b-domain (array-domain b)) |
649 |
| - (b-offset2 (+ b-offset (interval-width b-domain axis))) |
650 |
| - (b-lo (make-vector (interval-dimension b-domain) 0)) |
651 |
| - (b-hi (interval-widths b-domain))) |
652 |
| - (vector-set! b-lo axis b-offset) |
653 |
| - (vector-set! b-hi axis b-offset2) |
654 |
| - (vector-set! b-trans axis (- b-offset)) |
655 |
| - (let ((view (array-translate |
656 |
| - (array-extract c (make-interval b-lo b-hi)) |
657 |
| - b-trans))) |
658 |
| - (array-assign! view b) |
659 |
| - (lp (cdr arrays) b-offset2))))))))) |
| 647 | + (cond |
| 648 | + ((null? arrays) |
| 649 | + (if mutable? c (array-freeze! c))) |
| 650 | + (else |
| 651 | + (let* ((b (car arrays)) |
| 652 | + (b-domain (array-domain b)) |
| 653 | + (b-offset2 (+ b-offset (interval-width b-domain axis))) |
| 654 | + (b-lo (make-vector (interval-dimension b-domain) 0)) |
| 655 | + (b-hi (interval-widths b-domain))) |
| 656 | + (vector-set! b-lo axis b-offset) |
| 657 | + (vector-set! b-hi axis b-offset2) |
| 658 | + (let ((dest-view (array-extract c (make-interval b-lo b-hi))) |
| 659 | + (b-trans |
| 660 | + (vector-map - (interval-lower-bounds->vector b-domain)))) |
| 661 | + (vector-set! b-trans axis (+ (vector-ref b-trans axis) |
| 662 | + b-offset)) |
| 663 | + (array-assign! dest-view (array-translate b b-trans)) |
| 664 | + (lp (cdr arrays) b-offset2)) |
| 665 | + )))))))) |
660 | 666 |
|
661 | 667 | (define array-append! array-append)
|
662 | 668 |
|
|
0 commit comments