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