xref: /aosp_15_r20/external/eigen/blas/level1_impl.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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