12template<
typename Index,
typename Scalar,
int StorageOrder,
bool ConjugateLhs,
bool ConjugateRhs>
15 static void run(
Index rows,
Index cols,
const Scalar *lhs,
Index lhsStride,
const Scalar *rhs,
Index rhsIncr, Scalar* res,
Index resIncr, Scalar alpha)
21 <
Index,Scalar,LhsMapper,StorageOrder,ConjugateLhs,Scalar,RhsMapper,ConjugateRhs>::run(
22 rows, cols, LhsMapper(lhs, lhsStride), RhsMapper(rhs, rhsIncr), res, resIncr, alpha);
26int EIGEN_BLAS_FUNC(gemv)(
const char *opa,
const int *m,
const int *n,
const RealScalar *palpha,
27 const RealScalar *pa,
const int *lda,
const RealScalar *pb,
const int *incb,
const RealScalar *pbeta, RealScalar *pc,
const int *incc)
29 typedef void (*functype)(int, int,
const Scalar *, int,
const Scalar *, int , Scalar *, int, Scalar);
30 static const functype func[4] = {
40 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
41 const Scalar* b =
reinterpret_cast<const Scalar*
>(pb);
42 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
43 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
44 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
48 if(OP(*opa)==INVALID) info = 1;
49 else if(*m<0) info = 2;
50 else if(*n<0) info = 3;
51 else if(*lda<std::max(1,*m)) info = 6;
52 else if(*incb==0) info = 8;
53 else if(*incc==0) info = 11;
55 return xerbla_(SCALAR_SUFFIX_UP
"GEMV ",&info,6);
57 if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1)))
64 std::swap(actual_m,actual_n);
66 const Scalar* actual_b = get_compact_vector(b,actual_n,*incb);
67 Scalar* actual_c = get_compact_vector(c,actual_m,*incc);
71 if(beta==Scalar(0)) make_vector(actual_c, actual_m).setZero();
72 else make_vector(actual_c, actual_m) *= beta;
75 if(code>=4 || func[code]==0)
78 func[code](actual_m, actual_n, a, *lda, actual_b, 1, actual_c, 1, alpha);
80 if(actual_b!=b)
delete[] actual_b;
81 if(actual_c!=c)
delete[] copy_back(actual_c,c,actual_m,*incc);
86int EIGEN_BLAS_FUNC(trsv)(
const char *uplo,
const char *opa,
const char *diag,
const int *n,
const RealScalar *pa,
const int *lda, RealScalar *pb,
const int *incb)
88 typedef void (*functype)(int,
const Scalar *, int, Scalar *);
89 static const functype func[16] = {
91 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,ColMajor>::run),
93 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,RowMajor>::run),
95 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, Conj, RowMajor>::run),
98 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0, false,ColMajor>::run),
100 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, false,RowMajor>::run),
102 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0, Conj, RowMajor>::run),
105 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run),
107 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run),
109 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run),
112 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run),
114 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run),
116 (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run),
120 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
121 Scalar* b =
reinterpret_cast<Scalar*
>(pb);
124 if(UPLO(*uplo)==INVALID) info = 1;
125 else if(OP(*opa)==INVALID) info = 2;
126 else if(DIAG(*diag)==INVALID) info = 3;
127 else if(*n<0) info = 4;
128 else if(*lda<std::max(1,*n)) info = 6;
129 else if(*incb==0) info = 8;
131 return xerbla_(SCALAR_SUFFIX_UP
"TRSV ",&info,6);
133 Scalar* actual_b = get_compact_vector(b,*n,*incb);
135 int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);
136 func[code](*n, a, *lda, actual_b);
138 if(actual_b!=b)
delete[] copy_back(actual_b,b,*n,*incb);
145int EIGEN_BLAS_FUNC(trmv)(
const char *uplo,
const char *opa,
const char *diag,
const int *n,
const RealScalar *pa,
const int *lda, RealScalar *pb,
const int *incb)
147 typedef void (*functype)(int, int,
const Scalar *, int,
const Scalar *, int, Scalar *, int,
const Scalar&);
148 static const functype func[16] = {
150 (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run),
152 (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run),
154 (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run),
157 (internal::triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run),
159 (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run),
161 (internal::triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run),
164 (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run),
166 (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run),
168 (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run),
171 (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run),
173 (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run),
175 (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run),
179 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
180 Scalar* b =
reinterpret_cast<Scalar*
>(pb);
183 if(UPLO(*uplo)==INVALID) info = 1;
184 else if(OP(*opa)==INVALID) info = 2;
185 else if(DIAG(*diag)==INVALID) info = 3;
186 else if(*n<0) info = 4;
187 else if(*lda<std::max(1,*n)) info = 6;
188 else if(*incb==0) info = 8;
190 return xerbla_(SCALAR_SUFFIX_UP
"TRMV ",&info,6);
195 Scalar* actual_b = get_compact_vector(b,*n,*incb);
199 int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);
200 if(code>=16 || func[code]==0)
203 func[code](*n, *n, a, *lda, actual_b, 1, res.data(), 1, Scalar(1));
205 copy_back(res.data(),b,*n,*incb);
206 if(actual_b!=b)
delete[] actual_b;
218int EIGEN_BLAS_FUNC(gbmv)(
char *trans,
int *m,
int *n,
int *kl,
int *ku, RealScalar *palpha, RealScalar *pa,
int *lda,
219 RealScalar *px,
int *incx, RealScalar *pbeta, RealScalar *py,
int *incy)
221 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
222 const Scalar* x =
reinterpret_cast<const Scalar*
>(px);
223 Scalar* y =
reinterpret_cast<Scalar*
>(py);
224 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
225 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
226 int coeff_rows = *kl+*ku+1;
229 if(OP(*trans)==INVALID) info = 1;
230 else if(*m<0) info = 2;
231 else if(*n<0) info = 3;
232 else if(*kl<0) info = 4;
233 else if(*ku<0) info = 5;
234 else if(*lda<coeff_rows) info = 8;
235 else if(*incx==0) info = 10;
236 else if(*incy==0) info = 13;
238 return xerbla_(SCALAR_SUFFIX_UP
"GBMV ",&info,6);
240 if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1)))
246 std::swap(actual_m,actual_n);
248 const Scalar* actual_x = get_compact_vector(x,actual_n,*incx);
249 Scalar* actual_y = get_compact_vector(y,actual_m,*incy);
253 if(beta==Scalar(0)) make_vector(actual_y, actual_m).setZero();
254 else make_vector(actual_y, actual_m) *= beta;
259 int nb = std::min(*n,(*m)+(*ku));
260 for(
int j=0; j<nb; ++j)
262 int start = std::max(0,j - *ku);
263 int end = std::min((*m)-1,j + *kl);
264 int len = end - start + 1;
265 int offset = (*ku) - j + start;
267 make_vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len);
268 else if(OP(*trans)==TR)
269 actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * make_vector(actual_x+start,len) ).value();
271 actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * make_vector(actual_x+start,len) ).value();
274 if(actual_x!=x)
delete[] actual_x;
275 if(actual_y!=y)
delete[] copy_back(actual_y,y,actual_m,*incy);
288int EIGEN_BLAS_FUNC(tbmv)(
char *uplo,
char *opa,
char *diag,
int *n,
int *k, RealScalar *pa,
int *lda, RealScalar *px,
int *incx)
290 Scalar* a =
reinterpret_cast<Scalar*
>(pa);
291 Scalar* x =
reinterpret_cast<Scalar*
>(px);
292 int coeff_rows = *k + 1;
295 if(UPLO(*uplo)==INVALID) info = 1;
296 else if(OP(*opa)==INVALID) info = 2;
297 else if(DIAG(*diag)==INVALID) info = 3;
298 else if(*n<0) info = 4;
299 else if(*k<0) info = 5;
300 else if(*lda<coeff_rows) info = 7;
301 else if(*incx==0) info = 9;
303 return xerbla_(SCALAR_SUFFIX_UP
"TBMV ",&info,6);
310 Scalar* actual_x = get_compact_vector(x,actual_n,*incx);
314 int ku = UPLO(*uplo)==UPPER ? *k : 0;
315 int kl = UPLO(*uplo)==LOWER ? *k : 0;
317 for(
int j=0; j<*n; ++j)
319 int start = std::max(0,j - ku);
320 int end = std::min((*m)-1,j + kl);
321 int len = end - start + 1;
322 int offset = (ku) - j + start;
325 make_vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len);
326 else if(OP(*trans)==TR)
327 actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * make_vector(actual_x+start,len) ).value();
329 actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint() * make_vector(actual_x+start,len) ).value();
332 if(actual_x!=x)
delete[] actual_x;
333 if(actual_y!=y)
delete[] copy_back(actual_y,y,actual_m,*incy);
350int EIGEN_BLAS_FUNC(tbsv)(
char *uplo,
char *op,
char *diag,
int *n,
int *k, RealScalar *pa,
int *lda, RealScalar *px,
int *incx)
352 typedef void (*functype)(int, int,
const Scalar *, int, Scalar *);
353 static const functype func[16] = {
384 Scalar* a =
reinterpret_cast<Scalar*
>(pa);
385 Scalar* x =
reinterpret_cast<Scalar*
>(px);
386 int coeff_rows = *k+1;
389 if(UPLO(*uplo)==INVALID) info = 1;
390 else if(OP(*op)==INVALID) info = 2;
391 else if(DIAG(*diag)==INVALID) info = 3;
392 else if(*n<0) info = 4;
393 else if(*k<0) info = 5;
394 else if(*lda<coeff_rows) info = 7;
395 else if(*incx==0) info = 9;
397 return xerbla_(SCALAR_SUFFIX_UP
"TBSV ",&info,6);
399 if(*n==0 || (*k==0 && DIAG(*diag)==UNIT))
404 Scalar* actual_x = get_compact_vector(x,actual_n,*incx);
406 int code = OP(*op) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);
407 if(code>=16 || func[code]==0)
410 func[code](*n, *k, a, *lda, actual_x);
412 if(actual_x!=x)
delete[] copy_back(actual_x,x,actual_n,*incx);
424int EIGEN_BLAS_FUNC(tpmv)(
char *uplo,
char *opa,
char *diag,
int *n, RealScalar *pap, RealScalar *px,
int *incx)
426 typedef void (*functype)(int,
const Scalar*,
const Scalar*, Scalar*, Scalar);
427 static const functype func[16] = {
458 Scalar* ap =
reinterpret_cast<Scalar*
>(pap);
459 Scalar* x =
reinterpret_cast<Scalar*
>(px);
462 if(UPLO(*uplo)==INVALID) info = 1;
463 else if(OP(*opa)==INVALID) info = 2;
464 else if(DIAG(*diag)==INVALID) info = 3;
465 else if(*n<0) info = 4;
466 else if(*incx==0) info = 7;
468 return xerbla_(SCALAR_SUFFIX_UP
"TPMV ",&info,6);
473 Scalar* actual_x = get_compact_vector(x,*n,*incx);
477 int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);
478 if(code>=16 || func[code]==0)
481 func[code](*n, ap, actual_x, res.data(), Scalar(1));
483 copy_back(res.data(),x,*n,*incx);
484 if(actual_x!=x)
delete[] actual_x;
499int EIGEN_BLAS_FUNC(tpsv)(
char *uplo,
char *opa,
char *diag,
int *n, RealScalar *pap, RealScalar *px,
int *incx)
501 typedef void (*functype)(int,
const Scalar*, Scalar*);
502 static const functype func[16] = {
533 Scalar* ap =
reinterpret_cast<Scalar*
>(pap);
534 Scalar* x =
reinterpret_cast<Scalar*
>(px);
537 if(UPLO(*uplo)==INVALID) info = 1;
538 else if(OP(*opa)==INVALID) info = 2;
539 else if(DIAG(*diag)==INVALID) info = 3;
540 else if(*n<0) info = 4;
541 else if(*incx==0) info = 7;
543 return xerbla_(SCALAR_SUFFIX_UP
"TPSV ",&info,6);
545 Scalar* actual_x = get_compact_vector(x,*n,*incx);
547 int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);
548 func[code](*n, ap, actual_x);
550 if(actual_x!=x)
delete[] copy_back(actual_x,x,*n,*incx);
A matrix or vector expression mapping an existing array of data.
Definition Map.h:96
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
Definition BlasUtil.h:389
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
Definition level2_impl.h:14
Definition BandTriangularSolver.h:19
Definition PackedTriangularMatrixVector.h:16
Definition PackedTriangularSolverVector.h:16