anchor.diff:      `(let* ((,%matrix ,matrix)
               (,dense-index 0)
               (,width (the fixnum (width-of ,%matrix))))
  +       (declare (type (integer 0 #.(1- most-positive-fixnum)) ,dense-index))
          (dotimes (,row (the fixnum (height-of ,%matrix)))
            (dotimes (,column ,width)
              (let ((,value (aref ,%matrix ,row ,column)))
  
positive.code:                              (width-of matrix :densep t))))
        (compact (sv-left new-sv) (sv-left sv) #'dense-row-index)
        (compact (sv-right new-sv) (sv-right sv) #'dense-column-index)
        new-sv)))
  
  (defun save-svd (svd filename)
  
negative.code:                                      (- (* err r)
                                          (* ,normalization-factor l)))))))))
  
  ;;; Well, this is not so critical as it is only used when starting
  ;;; from an existing SVD and when going from one sv to the next in
  ;;; training.
  (defmacro add-sv-to-approximation (&key matrix clip do-matrix)
    `(lambda (sv approximation)
       (declare (type single-float-vector approximation)
                (inline ,clip)
                (optimize (speed 3)))
       (let* ((sv (expand-sv sv ,matrix))
              (left (sv-left sv))
              (right (sv-right sv)))
         (,do-matrix ((row column - index2) ,matrix)
           (setf (aref approximation index2)
                 (,clip (+ (aref approximation index2)
                           (* (aref left row)
                              (aref right column))))))
         ,matrix)))
  
  (defun svd-1 (matrix &key trainer svd supervisor learning-rate)
    (declare (type svd svd))
    ;; We work with sparse indices to avoid having to map indices and
  