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