1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "common.h" 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// computes the sum of magnitudes of all vector elements or, for a complex vector x, the sum 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// res = |Rex1| + |Imx1| + |Rex2| + |Imx2| + ... + |Rexn| + |Imxn|, where x is a vector of order n 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathRealScalar EIGEN_BLAS_FUNC(asum)(int *n, RealScalar *px, int *incx) 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cerr << "_asum " << *n << " " << *incx << "\n"; 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n<=0) return 0; 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*incx==1) return vector(x,*n).cwiseAbs().sum(); 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else return vector(x,*n,std::abs(*incx)).cwiseAbs().sum(); 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// computes a vector-vector dot product. 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathScalar EIGEN_BLAS_FUNC(dot)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy) 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cerr << "_dot " << *n << " " << *incx << " " << *incy << "\n"; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n<=0) return 0; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* y = reinterpret_cast<Scalar*>(py); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*incx==1 && *incy==1) return (vector(x,*n).cwiseProduct(vector(y,*n))).sum(); 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx>0 && *incy>0) return (vector(x,*n,*incx).cwiseProduct(vector(y,*n,*incy))).sum(); 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx<0 && *incy>0) return (vector(x,*n,-*incx).reverse().cwiseProduct(vector(y,*n,*incy))).sum(); 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx>0 && *incy<0) return (vector(x,*n,*incx).cwiseProduct(vector(y,*n,-*incy).reverse())).sum(); 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx<0 && *incy<0) return (vector(x,*n,-*incx).reverse().cwiseProduct(vector(y,*n,-*incy).reverse())).sum(); 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else return 0; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// computes the Euclidean norm of a vector. 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathScalar EIGEN_BLAS_FUNC(nrm2)(int *n, RealScalar *px, int *incx) 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cerr << "_nrm2 " << *n << " " << *incx << "\n"; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n<=0) return 0; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*incx==1) return vector(x,*n).stableNorm(); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else return vector(x,*n,std::abs(*incx)).stableNorm(); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(rot)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, RealScalar *ps) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cerr << "_rot " << *n << " " << *incx << " " << *incy << "\n"; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*n<=0) return 0; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* y = reinterpret_cast<Scalar*>(py); 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar c = *reinterpret_cast<Scalar*>(pc); 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar s = *reinterpret_cast<Scalar*>(ps); 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath StridedVectorType vx(vector(x,*n,std::abs(*incx))); 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath StridedVectorType vy(vector(y,*n,std::abs(*incy))); 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Reverse<StridedVectorType> rvx(vx); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Reverse<StridedVectorType> rvy(vy); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(*incx<0 && *incy>0) internal::apply_rotation_in_the_plane(rvx, vy, JacobiRotation<Scalar>(c,s)); 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(*incx>0 && *incy<0) internal::apply_rotation_in_the_plane(vx, rvy, JacobiRotation<Scalar>(c,s)); 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else internal::apply_rotation_in_the_plane(vx, vy, JacobiRotation<Scalar>(c,s)); 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// performs rotation of points in the modified plane. 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(rotm)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *param) 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* x = reinterpret_cast<Scalar*>(px); 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar* y = reinterpret_cast<Scalar*>(py); 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // TODO 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// computes the modified parameters for a Givens rotation. 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint EIGEN_BLAS_FUNC(rotmg)(RealScalar *d1, RealScalar *d2, RealScalar *x1, RealScalar *x2, RealScalar *param) 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // TODO 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/ 101