From: Akshay S. <ak...@us...> - 2012-07-12 16:37:29
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "matlisp". The branch, tensor has been updated via 04ac7f795b17225ad7f942b85bad9508a885ee1e (commit) from cbb7c2bfaa2dedc65e56be04c1469e46be975801 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 04ac7f795b17225ad7f942b85bad9508a885ee1e Author: Akshay Srinivasan <aks...@gm...> Date: Thu Jul 12 21:15:12 2012 +0530 o Tweaks to methods in gemm, gemv and axpy. diff --git a/src/level-1/axpy.lisp b/src/level-1/axpy.lisp index 2de1898..0a3b9cc 100644 --- a/src/level-1/axpy.lisp +++ b/src/level-1/axpy.lisp @@ -145,10 +145,10 @@ (:method ((alpha number) (x complex-tensor) (y real-tensor)) (error 'coercion-error :from 'complex-tensor :to 'real-tensor))) -(defmethod axpy! ((alpha number) (x (eql t)) (y real-tensor)) +(defmethod axpy! ((alpha number) (x (eql nil)) (y real-tensor)) (real-typed-num-axpy! (coerce-real alpha) y)) -(defmethod axpy! ((alpha number) (x (eql t)) (y complex-tensor)) +(defmethod axpy! ((alpha number) (x (eql nil)) (y complex-tensor)) (complex-typed-num-axpy! (coerce-complex alpha) y)) (defmethod axpy! ((alpha number) (x real-tensor) (y real-tensor)) diff --git a/src/level-2/gemv.lisp b/src/level-2/gemv.lisp index 911759e..43b9e10 100644 --- a/src/level-2/gemv.lisp +++ b/src/level-2/gemv.lisp @@ -220,3 +220,12 @@ (scal! y result) (gemv! alpha A x beta result job))) +(defmethod gemv ((alpha number) (A standard-matrix) (x standard-vector) + (beta (eql nil)) (y (eql nil)) &optional (job :n)) + (let ((result (apply + (if (or (complexp alpha) (complexp beta) + (typep A 'complex-matrix) (typep x 'complex-vector)) + #'make-complex-tensor + #'make-real-tensor) + (list (ecase job (:n (nrows A)) (:t (ncols A))))))) + (gemv! alpha A x beta result job))) diff --git a/src/level-3/gemm.lisp b/src/level-3/gemm.lisp index 4cae6f3..f5172b7 100644 --- a/src/level-3/gemm.lisp +++ b/src/level-3/gemm.lisp @@ -304,7 +304,7 @@ ")) (defmethod gemm ((alpha number) (a standard-matrix) (b standard-matrix) - (beta number) (c real-matrix) + (beta number) (c complex-matrix) &optional (job :nn)) (let ((result (copy C))) (gemm! alpha A B beta result job))) @@ -312,7 +312,7 @@ ;; if all args are not real then at least one of them ;; is complex, so we need to call GEMM! with a complex C (defmethod gemm ((alpha number) (a standard-matrix) (b standard-matrix) - (beta number) (c standard-matrix) + (beta number) (c real-matrix) &optional (job :nn)) (let ((result (if (or (complexp alpha) (complexp beta) (typep a 'complex-matrix) (typep b 'complex-matrix)) @@ -320,3 +320,20 @@ (make-real-tensor (nrows C) (ncols C))))) (copy! C result) (gemm! alpha A B beta result job))) + +(defmethod gemm ((alpha number) (a standard-matrix) (b standard-matrix) + (beta (eql nil)) (c (eql nil)) + &optional (job :nn)) + (multiple-value-bind (job-A job-B) (ecase job + (:nn (values :n :n)) + (:nt (values :n :t)) + (:tn (values :t :n)) + (:tt (values :t :t))) + (let ((result (apply + (if (or (complexp alpha) (complexp beta) + (typep a 'complex-matrix) (typep b 'complex-matrix)) + #'make-complex-tensor + #'make-real-tensor) + (list (if (eq job-A :n) (nrows A) (ncols A)) + (if (eq job-B :n) (ncols B) (nrows B)))))) + (gemm! alpha A B 0 result job)))) ----------------------------------------------------------------------- Summary of changes: src/level-1/axpy.lisp | 4 ++-- src/level-2/gemv.lisp | 9 +++++++++ src/level-3/gemm.lisp | 21 +++++++++++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) hooks/post-receive -- matlisp |