1 #include "mzd_ptr.h"
2 #include "m4ri_functions.h"
3
4
djb_apply_mzd_ptr(djb_t * m,mzd_t ** W,const mzd_t ** V)5 void djb_apply_mzd_ptr(djb_t *m, mzd_t **W, const mzd_t **V) {
6 int *iszero = m4ri_mm_malloc(sizeof(int)*m->nrows);
7 for(int i = 0; i < m->nrows; ++i)
8 iszero[i] = 1;
9
10 rci_t i = m->length;
11 while (i > 0) {
12 --i;
13 if (iszero[m->target[i]]) {
14 if (m->srctyp[i] == source_source) {
15 mzd_copy(W[m->target[i]], V[m->source[i]]);
16 } else {
17 mzd_copy(W[m->target[i]], W[m->source[i]]);
18 }
19 iszero[m->target[i]] = 0;
20 } else {
21 if (m->srctyp[i] == source_source) {
22 mzd_add(W[m->target[i]], W[m->target[i]], V[m->source[i]]);
23 } else {
24 mzd_add(W[m->target[i]], W[m->target[i]], W[m->source[i]]);
25 }
26 }
27 }
28 m4ri_mm_free(iszero);
29 }
30