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