25 #ifndef CASADI_SLICOT_LA_HPP
26 #define CASADI_SLICOT_LA_HPP
32 inline void dense_kron_stride(casadi_int n, casadi_int m,
33 const double *A,
const double *B,
double *C,
34 casadi_int strideA, casadi_int strideB, casadi_int strideC) {
35 for (casadi_int i=0;i<n;++i) {
36 for (casadi_int j=0;j<n;++j) {
37 C[strideC*i + j] = -A[strideA*(i/m) + (j/m)]*B[strideB*(i%m) + (j%m)];
42 inline void dense_mul_nt_stride(casadi_int n, casadi_int m, casadi_int l,
43 const double *A,
const double *B,
double *C,
44 casadi_int strideA, casadi_int strideB, casadi_int strideC) {
45 for (casadi_int i=0;i<n;++i) {
46 for (casadi_int j=0;j<m;++j) {
47 for (casadi_int k=0;k<l;++k) {
48 C[strideC*i + j] += A[strideA*i + k]*B[strideB*j + k];
56 inline void dense_mul_nt(casadi_int n, casadi_int m, casadi_int l,
57 const double *A,
const double *B,
double *C) {
58 dense_mul_nt_stride(n, m, l, A, B, C, n, m, n);
61 inline void dense_mul_nn_stride(casadi_int n, casadi_int m, casadi_int l,
62 const double *A,
const double *B,
double *C,
63 casadi_int strideA, casadi_int strideB, casadi_int strideC) {
64 for (casadi_int i=0;i<n;++i) {
65 for (casadi_int j=0;j<m;++j) {
66 for (casadi_int k=0;k<l;++k) {
67 C[strideC*i + j] += A[strideA*i + k]*B[strideB*k + j];
73 inline void dense_copy_stride(casadi_int n, casadi_int m,
const double *A,
double *B,
74 casadi_int strideA, casadi_int strideB) {
75 for (casadi_int i=0;i<n;++i) {
76 for (casadi_int j=0;j<m;++j) {
77 B[strideB*i + j] = A[strideA*i+j];
82 inline void dense_copy_t_stride(casadi_int n, casadi_int m,
const double *A,
double *B,
83 casadi_int strideA, casadi_int strideB) {
84 for (casadi_int i=0;i<n;++i) {
85 for (casadi_int j=0;j<m;++j) {
86 B[strideB*j + i] = A[strideA*i+j];
93 inline void dense_mul_nn(casadi_int n, casadi_int m, casadi_int l,
94 const double *A,
const double *B,
double *C) {
95 dense_mul_nn_stride(n, m, l, A, B, C, n, l, n);
100 inline void dense_mul_nn2(casadi_int n, casadi_int m, casadi_int l,
101 const double *A,
const double *B,
double *C) {
102 for (casadi_int i=0;i<n;++i) {
103 for (casadi_int j=0;j<m;++j) {
104 for (casadi_int k=0;k<l;++k) {
105 C[i + n*j] += A[i + n*k]*B[k + l*j];
114 inline void dense_mul_tn(casadi_int n, casadi_int m, casadi_int l,
115 const double *A,
const double *B,
double *C) {
116 for (casadi_int i=0;i<n;++i) {
117 for (casadi_int j=0;j<m;++j) {
118 for (casadi_int k=0;k<l;++k) {
119 C[n*i + j] += A[l*k + i]*B[l*k + j];