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
EIGEN_BLAS_FUNC(axpy)12*bf2c3715SXin Li int EIGEN_BLAS_FUNC(axpy)(const int *n, const RealScalar *palpha, const RealScalar *px, const int *incx, RealScalar *py, const int *incy)
13*bf2c3715SXin Li {
14*bf2c3715SXin Li const Scalar* x = reinterpret_cast<const Scalar*>(px);
15*bf2c3715SXin Li Scalar* y = reinterpret_cast<Scalar*>(py);
16*bf2c3715SXin Li Scalar alpha = *reinterpret_cast<const Scalar*>(palpha);
17*bf2c3715SXin Li
18*bf2c3715SXin Li if(*n<=0) return 0;
19*bf2c3715SXin Li
20*bf2c3715SXin Li if(*incx==1 && *incy==1) make_vector(y,*n) += alpha * make_vector(x,*n);
21*bf2c3715SXin Li else if(*incx>0 && *incy>0) make_vector(y,*n,*incy) += alpha * make_vector(x,*n,*incx);
22*bf2c3715SXin Li else if(*incx>0 && *incy<0) make_vector(y,*n,-*incy).reverse() += alpha * make_vector(x,*n,*incx);
23*bf2c3715SXin Li else if(*incx<0 && *incy>0) make_vector(y,*n,*incy) += alpha * make_vector(x,*n,-*incx).reverse();
24*bf2c3715SXin Li else if(*incx<0 && *incy<0) make_vector(y,*n,-*incy).reverse() += alpha * make_vector(x,*n,-*incx).reverse();
25*bf2c3715SXin Li
26*bf2c3715SXin Li return 0;
27*bf2c3715SXin Li }
28*bf2c3715SXin Li
EIGEN_BLAS_FUNC(copy)29*bf2c3715SXin Li int EIGEN_BLAS_FUNC(copy)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
30*bf2c3715SXin Li {
31*bf2c3715SXin Li if(*n<=0) return 0;
32*bf2c3715SXin Li
33*bf2c3715SXin Li Scalar* x = reinterpret_cast<Scalar*>(px);
34*bf2c3715SXin Li Scalar* y = reinterpret_cast<Scalar*>(py);
35*bf2c3715SXin Li
36*bf2c3715SXin Li // be careful, *incx==0 is allowed !!
37*bf2c3715SXin Li if(*incx==1 && *incy==1)
38*bf2c3715SXin Li make_vector(y,*n) = make_vector(x,*n);
39*bf2c3715SXin Li else
40*bf2c3715SXin Li {
41*bf2c3715SXin Li if(*incx<0) x = x - (*n-1)*(*incx);
42*bf2c3715SXin Li if(*incy<0) y = y - (*n-1)*(*incy);
43*bf2c3715SXin Li for(int i=0;i<*n;++i)
44*bf2c3715SXin Li {
45*bf2c3715SXin Li *y = *x;
46*bf2c3715SXin Li x += *incx;
47*bf2c3715SXin Li y += *incy;
48*bf2c3715SXin Li }
49*bf2c3715SXin Li }
50*bf2c3715SXin Li
51*bf2c3715SXin Li return 0;
52*bf2c3715SXin Li }
53*bf2c3715SXin Li
EIGEN_BLAS_FUNC(rotg)54*bf2c3715SXin Li int EIGEN_BLAS_FUNC(rotg)(RealScalar *pa, RealScalar *pb, RealScalar *pc, RealScalar *ps)
55*bf2c3715SXin Li {
56*bf2c3715SXin Li using std::sqrt;
57*bf2c3715SXin Li using std::abs;
58*bf2c3715SXin Li
59*bf2c3715SXin Li Scalar& a = *reinterpret_cast<Scalar*>(pa);
60*bf2c3715SXin Li Scalar& b = *reinterpret_cast<Scalar*>(pb);
61*bf2c3715SXin Li RealScalar* c = pc;
62*bf2c3715SXin Li Scalar* s = reinterpret_cast<Scalar*>(ps);
63*bf2c3715SXin Li
64*bf2c3715SXin Li #if !ISCOMPLEX
65*bf2c3715SXin Li Scalar r,z;
66*bf2c3715SXin Li Scalar aa = abs(a);
67*bf2c3715SXin Li Scalar ab = abs(b);
68*bf2c3715SXin Li if((aa+ab)==Scalar(0))
69*bf2c3715SXin Li {
70*bf2c3715SXin Li *c = 1;
71*bf2c3715SXin Li *s = 0;
72*bf2c3715SXin Li r = 0;
73*bf2c3715SXin Li z = 0;
74*bf2c3715SXin Li }
75*bf2c3715SXin Li else
76*bf2c3715SXin Li {
77*bf2c3715SXin Li r = sqrt(a*a + b*b);
78*bf2c3715SXin Li Scalar amax = aa>ab ? a : b;
79*bf2c3715SXin Li r = amax>0 ? r : -r;
80*bf2c3715SXin Li *c = a/r;
81*bf2c3715SXin Li *s = b/r;
82*bf2c3715SXin Li z = 1;
83*bf2c3715SXin Li if (aa > ab) z = *s;
84*bf2c3715SXin Li if (ab > aa && *c!=RealScalar(0))
85*bf2c3715SXin Li z = Scalar(1)/ *c;
86*bf2c3715SXin Li }
87*bf2c3715SXin Li *pa = r;
88*bf2c3715SXin Li *pb = z;
89*bf2c3715SXin Li #else
90*bf2c3715SXin Li Scalar alpha;
91*bf2c3715SXin Li RealScalar norm,scale;
92*bf2c3715SXin Li if(abs(a)==RealScalar(0))
93*bf2c3715SXin Li {
94*bf2c3715SXin Li *c = RealScalar(0);
95*bf2c3715SXin Li *s = Scalar(1);
96*bf2c3715SXin Li a = b;
97*bf2c3715SXin Li }
98*bf2c3715SXin Li else
99*bf2c3715SXin Li {
100*bf2c3715SXin Li scale = abs(a) + abs(b);
101*bf2c3715SXin Li norm = scale*sqrt((numext::abs2(a/scale)) + (numext::abs2(b/scale)));
102*bf2c3715SXin Li alpha = a/abs(a);
103*bf2c3715SXin Li *c = abs(a)/norm;
104*bf2c3715SXin Li *s = alpha*numext::conj(b)/norm;
105*bf2c3715SXin Li a = alpha*norm;
106*bf2c3715SXin Li }
107*bf2c3715SXin Li #endif
108*bf2c3715SXin Li
109*bf2c3715SXin Li // JacobiRotation<Scalar> r;
110*bf2c3715SXin Li // r.makeGivens(a,b);
111*bf2c3715SXin Li // *c = r.c();
112*bf2c3715SXin Li // *s = r.s();
113*bf2c3715SXin Li
114*bf2c3715SXin Li return 0;
115*bf2c3715SXin Li }
116*bf2c3715SXin Li
EIGEN_BLAS_FUNC(scal)117*bf2c3715SXin Li int EIGEN_BLAS_FUNC(scal)(int *n, RealScalar *palpha, RealScalar *px, int *incx)
118*bf2c3715SXin Li {
119*bf2c3715SXin Li if(*n<=0) return 0;
120*bf2c3715SXin Li
121*bf2c3715SXin Li Scalar* x = reinterpret_cast<Scalar*>(px);
122*bf2c3715SXin Li Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
123*bf2c3715SXin Li
124*bf2c3715SXin Li if(*incx==1) make_vector(x,*n) *= alpha;
125*bf2c3715SXin Li else make_vector(x,*n,std::abs(*incx)) *= alpha;
126*bf2c3715SXin Li
127*bf2c3715SXin Li return 0;
128*bf2c3715SXin Li }
129*bf2c3715SXin Li
EIGEN_BLAS_FUNC(swap)130*bf2c3715SXin Li int EIGEN_BLAS_FUNC(swap)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
131*bf2c3715SXin Li {
132*bf2c3715SXin Li if(*n<=0) return 0;
133*bf2c3715SXin Li
134*bf2c3715SXin Li Scalar* x = reinterpret_cast<Scalar*>(px);
135*bf2c3715SXin Li Scalar* y = reinterpret_cast<Scalar*>(py);
136*bf2c3715SXin Li
137*bf2c3715SXin Li if(*incx==1 && *incy==1) make_vector(y,*n).swap(make_vector(x,*n));
138*bf2c3715SXin Li else if(*incx>0 && *incy>0) make_vector(y,*n,*incy).swap(make_vector(x,*n,*incx));
139*bf2c3715SXin Li else if(*incx>0 && *incy<0) make_vector(y,*n,-*incy).reverse().swap(make_vector(x,*n,*incx));
140*bf2c3715SXin Li else if(*incx<0 && *incy>0) make_vector(y,*n,*incy).swap(make_vector(x,*n,-*incx).reverse());
141*bf2c3715SXin Li else if(*incx<0 && *incy<0) make_vector(y,*n,-*incy).reverse().swap(make_vector(x,*n,-*incx).reverse());
142*bf2c3715SXin Li
143*bf2c3715SXin Li return 1;
144*bf2c3715SXin Li }
145