27 void casadi_kron_contract_inner(
const T1* m,
const casadi_int* sp_m,
28 const T1* b,
const casadi_int* sp_b,
29 T1* y,
const casadi_int* sp_y,
31 casadi_int nA = sp_y[1];
32 const casadi_int* y_colind = sp_y+2;
33 const casadi_int* y_row = sp_y+2+nA+1;
34 casadi_int mB = sp_b[0];
35 casadi_int nB = sp_b[1];
36 const casadi_int* b_colind = sp_b+2;
37 const casadi_int* b_row = sp_b+2+nB+1;
38 casadi_int m_ncol = sp_m[1];
39 const casadi_int* m_colind = sp_m+2;
40 const casadi_int* m_row = sp_m+2+m_ncol+1;
42 casadi_int k, cc, el, j, s, rr, i, r, y_el, y_col_start, y_col_end;
46 for (k=0; k<mB*nB; ++k) w[k] = 0;
47 for (cc=0; cc<nB; ++cc) {
48 for (el=b_colind[cc]; el<b_colind[cc+1]; ++el) {
49 w[cc*mB + b_row[el]] = b[el];
54 for (k=0; k<y_colind[nA]; ++k) y[k] = 0;
58 for (j=0; j<nA; ++j) {
59 y_col_start = y_colind[j];
60 y_col_end = y_colind[j+1];
61 if (y_col_start == y_col_end)
continue;
62 for (s=0; s<nB; ++s) {
64 for (el=m_colind[cc]; el<m_colind[cc+1]; ++el) {
70 for (y_el=y_col_start; y_el<y_col_end; ++y_el) {
71 if (y_row[y_el] == i) { y[y_el] += m[el] * b_val;
break; }
72 if (y_row[y_el] > i)
break;