anchor.diff:        (loop for i below (chunk-size (chunk1 cloud)) do
               (setf (matlisp:matrix-ref weights i i) #.(flt 0))))))
   
  -(defmethod activate-cloud ((cloud full-cloud) reversep)
  -  (declare (optimize (speed 3) #.*no-array-bounds-check*))
  +(defmethod activate-cloud* ((cloud full-cloud) reversep from-fn to-fn)
     (if (not reversep)
         (let ((weights (weights cloud))
  -            (from (old-nodes (chunk1 cloud)))
  -            (to (nodes (chunk2 cloud)))
  +            (from (funcall from-fn (chunk1 cloud)))
  +            (to (funcall to-fn (chunk2 cloud)))
               (scale (scale2 cloud)))
  -        (declare (type flt scale))
  +        (declare (type flt scale)
  +                 (optimize (speed 3) #.*no-array-bounds-check*))
           (if (use-blas-on-chunk-p (cost-of-gemm weights from :nn)
                                    (chunk1 cloud))
               (matlisp:gemm! scale weights from (flt 1) to)
  
positive.code:   (when (eq (chunk1 cloud) (chunk2 cloud))
      (error "ZERO-WEIGHT-TO-SELF not implemented for FACTORED-CLOUD")))
  
  (defmethod activate-cloud ((cloud factored-cloud) reversep)
    ;; Normal chunks are zeroed by HIJACK-MEANS-TO-ACTIVATION.
    (zero-chunk (factored-cloud-shared-chunk cloud))
    (cond ((not reversep)
           (activate-cloud (cloud-b cloud) reversep)
           (activate-cloud (cloud-a cloud) reversep))
          (t
           (activate-cloud (cloud-a cloud) reversep)
           (activate-cloud (cloud-b cloud) reversep))))
  
  (defmethod map-segments (fn (cloud factored-cloud))
    (funcall fn (cloud-a cloud))
  
negative.code: (defgeneric zero-weight-to-self (cloud)
    (:documentation "In a BM W_{i,i} is always zero."))
  
  (defmethod activate-cloud* :before (cloud reversep from-fn to-fn)
    (zero-weight-to-self cloud))
  
  ;;; Return the chunk of CLOUD that's among CHUNKS and the other chunk
  