27 void casadi_kron_contract_outer(
const T1* m,
const casadi_int* sp_m,
28 const T1* a,
const casadi_int* sp_a,
29 T1* y,
const casadi_int* sp_y,
31 casadi_int nB = sp_y[1];
32 const casadi_int* y_colind = sp_y+2;
33 const casadi_int* y_row = sp_y+2+nB+1;
34 casadi_int mA = sp_a[0];
35 casadi_int nA = sp_a[1];
36 const casadi_int* a_colind = sp_a+2;
37 const casadi_int* a_row = sp_a+2+nA+1;
38 casadi_int m_ncol = sp_m[1];
39 casadi_int mB = sp_y[0];
40 const casadi_int* m_colind = sp_m+2;
41 const casadi_int* m_row = sp_m+2+m_ncol+1;
43 casadi_int k, cc, el, j, s, rr, i, r, y_el, y_col_start, y_col_end;
47 for (k=0; k<mA*nA; ++k) w[k] = 0;
48 for (cc=0; cc<nA; ++cc) {
49 for (el=a_colind[cc]; el<a_colind[cc+1]; ++el) {
50 w[cc*mA + a_row[el]] = a[el];
55 for (k=0; k<y_colind[nB]; ++k) y[k] = 0;
59 for (j=0; j<nA; ++j) {
60 for (s=0; s<nB; ++s) {
62 y_col_start = y_colind[s];
63 y_col_end = y_colind[s+1];
64 if (y_col_start == y_col_end)
continue;
65 for (el=m_colind[cc]; el<m_colind[cc+1]; ++el) {
71 for (y_el=y_col_start; y_el<y_col_end; ++y_el) {
72 if (y_row[y_el] == r) { y[y_el] += a_val * m[el];
break; }
73 if (y_row[y_el] > r)
break;