Revert "generic MEAN and MEDIAN, new function DISPLACE-ARRAY"
authorNikodemus Siivola <nikodemus@random-state.net>
Fri, 30 Mar 2012 14:55:55 +0000 (17:55 +0300)
committerNikodemus Siivola <nikodemus@random-state.net>
Fri, 30 Mar 2012 14:56:47 +0000 (17:56 +0300)
  This reverts commit 485544d4feb13d3f463f54a5605b3a480bc49046.

  MEAN and MEDIAN are again non-generic, and DISPLACE-ARRAY is removed.

  Motivation on the mailing list.

arrays.lisp
numbers.lisp
package.lisp
tests.lisp

index 1f30150..76c1879 100644 (file)
@@ -16,14 +16,3 @@ arguments."
      (setf (row-major-aref new-array i)
            (row-major-aref array i)))
    new-array))
-
-(declaim (inline displace-array))
-(defun displace-array (array &key (offset 0)
-                                  (dimensions (- (array-total-size array)
-                                               offset)))
-  "Return an array displaced to ARRAY with the given OFFSET and DIMENSIONS.
-Default arguments displace to a vector."
-  (make-array dimensions
-              :displaced-to array
-              :displaced-index-offset offset
-              :element-type (array-element-type array)))
index 7340f26..03430cc 100644 (file)
@@ -84,58 +84,21 @@ Examples:
 interpolation coefficient V."
    (+ a (* v (- b a))))
 
-(defgeneric mean (object)
-  (:documentation "Returns the mean of OBJECT.
-Predefined methods work on sequences and arrays of numbers. Users can
-define new methods.")
-  (:method ((object list))
-    (let ((sum 0)
-          (count 0))
-      (declare (fixnum count))
-      (dolist (elt object)
-        (incf sum elt)
-        (incf count))
-      (/ sum count)))
-  (:method ((object vector))
-    ;; Need a separate method for vectors, since
-    ;; they could have fill-pointers which we need to respect.
-    (let ((n (length object)))
-      (/ (loop for index below n
-               summing (aref object index))
-         n)))
-  (:method ((object array))
-    (let ((n (array-total-size object)))
-      (/ (loop for index below n
-               summing (row-major-aref object index))
-         n)))
-  (:method ((object sequence))
-    ;; For implementations supporting custom sequence types.
-    (/ (reduce #'+ object) (length object))))
-
-(defun median-in-place (vector)
-  (declare (vector vector))
-  (let* ((vector (sort vector #'<))
+(declaim (inline mean))
+(defun mean (sample)
+  "Returns the mean of SAMPLE. SAMPLE must be a sequence of numbers."
+  (/ (reduce #'+ sample) (length sample)))
+
+(declaim (inline median))
+(defun median (sample)
+  "Returns median of SAMPLE. SAMPLE must be a sequence of real numbers."
+  (let* ((vector (sort (copy-sequence 'vector sample) #'<))
          (length (length vector))
          (middle (truncate length 2)))
     (if (oddp length)
         (aref vector middle)
         (/ (+ (aref vector middle) (aref vector (1- middle))) 2))))
 
-(defgeneric median (object)
-  (:documentation
-   "Returns median of OBJECT.
-Predefined methods work on sequences and arrays of numbers. Users can
-define new methods.")
-  (:method ((object list))
-    (median-in-place (copy-sequence 'vector object)))
-  (:method ((object array))
-    (median-in-place (copy-sequence 'vector (if (vectorp object)
-                                                object
-                                                (displace-array object)))))
-  (:method ((object sequence))
-    ;; For implementations supporting custom sequence types.
-    (median-in-place (copy-sequence 'vector object))))
-
 (declaim (inline variance))
 (defun variance (sample &key (biased t))
   "Variance of SAMPLE. Returns the biased variance if BIASED is true (the default),
index 8bdf060..673ed30 100644 (file)
    #:array-index
    #:array-length
    #:copy-array
-   #:displace-array
    ;; Sequences
    #:copy-sequence
    #:deletef
index 7d7d1ca..bd2725f 100644 (file)
        (typep copy 'simple-array)))
  t)
 
-(deftest displace-array.1
-    (displace-array #2A((1 2)
-                        (3 4)))
-  #(1 2 3 4))
-
-(deftest displace-array.2
-    (displace-array #2A((1 2)
-                        (3 4))
-                    :offset 1)
-  #(2 3 4))
-
-(deftest displace-array.3
-    (displace-array #2A((1 2)
-                        (3 4))
-                    :offset 1
-                    :dimensions '(3 1))
-  #2A((2) (3) (4)))
-
 (deftest array-index.1
     (typep 0 'array-index)
   t)
     (mean '(1 2 10))
   13/3)
 
-(deftest mean.4
-    (mean #2A((1 2 3)
-              (4 5 6)
-              (7 8 9)))
-  5)
-
 (deftest median.1
     (median '(100 0 99 1 98 2 97))
   97)
     (median '(100 0 99 1 98 2 97 96))
   193/2)
 
-(deftest median.3
-    (median #2A((100 0 99 1)
-                (98 2 97 96)))
-  193/2)
-
 (deftest variance.1
     (variance (list 1 2 3))
   2/3)