1 /* 2 * This file is part of CasADi. 3 * 4 * CasADi -- A symbolic framework for dynamic optimization. 5 * Copyright (C) 2010-2014 Joel Andersson, Joris Gillis, Moritz Diehl, 6 * K.U. Leuven. All rights reserved. 7 * Copyright (C) 2011-2014 Greg Horn 8 * 9 * CasADi is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 3 of the License, or (at your option) any later version. 13 * 14 * CasADi is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with CasADi; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 * 23 */ 24 25 #ifndef CASADI_SLICOT_LA_HPP 26 #define CASADI_SLICOT_LA_HPP 27 28 /// \cond INTERNAL 29 namespace casadi { 30 31 dense_kron_stride(casadi_int n,casadi_int m,const double * A,const double * B,double * C,casadi_int strideA,casadi_int strideB,casadi_int strideC)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)]; 38 } 39 } 40 } 41 dense_mul_nt_stride(casadi_int n,casadi_int m,casadi_int l,const double * A,const double * B,double * C,casadi_int strideA,casadi_int strideB,casadi_int strideC)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]; 49 } 50 } 51 } 52 } 53 54 // A : n-by-l B: m-by-l 55 // C = A*B' dense_mul_nt(casadi_int n,casadi_int m,casadi_int l,const double * A,const double * B,double * C)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); 59 } 60 dense_mul_nn_stride(casadi_int n,casadi_int m,casadi_int l,const double * A,const double * B,double * C,casadi_int strideA,casadi_int strideB,casadi_int strideC)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]; 68 } 69 } 70 } 71 } 72 dense_copy_stride(casadi_int n,casadi_int m,const double * A,double * B,casadi_int strideA,casadi_int strideB)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]; 78 } 79 } 80 } 81 dense_copy_t_stride(casadi_int n,casadi_int m,const double * A,double * B,casadi_int strideA,casadi_int strideB)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]; 87 } 88 } 89 } 90 91 // A : n-by-l B: l-by-m 92 // C = A*B dense_mul_nn(casadi_int n,casadi_int m,casadi_int l,const double * A,const double * B,double * C)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); 96 } 97 98 // A : n-by-l B: l-by-m 99 // C = A*B dense_mul_nn2(casadi_int n,casadi_int m,casadi_int l,const double * A,const double * B,double * C)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]; 106 } 107 } 108 } 109 //dense_mul_nn_stride(m, n, l, B, A, C, l, n, n); 110 } 111 112 // A : l-by-n B: l-by-m 113 // C = A'*B dense_mul_tn(casadi_int n,casadi_int m,casadi_int l,const double * A,const double * B,double * C)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]; 120 } 121 } 122 } 123 } 124 125 } // namespace casadi 126 127 /// \endcond 128 #endif // CASADI_SLICOT_LA_HPP 129