aboutsummaryrefslogtreecommitdiff
path: root/cbits/backprop.c
blob: 0ca62e3b512029010de167d5f8cc6b82688aa476 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// #include <stdio.h>
#include <stdint.h>
// #include <inttypes.h>

struct Contrib {
  int64_t i1;
  double dx;
  int64_t i2;
  double dy;
};

void ad_dual_hs_backpropagate_double(
  double *accums,
  int64_t id_base, int64_t topid, const void *contribs_buf
) {
  // fprintf(stderr, "< ci0=%" PRIi64 " topid=%" PRIi64 " >\n", id_base, topid);
  const struct Contrib *contribs = (const struct Contrib*)contribs_buf;

  for (int64_t i = topid - id_base; i >= 0; i--) {
    double d = accums[id_base + i];
    // fprintf(stderr, "ACC i=%" PRIi64 " d=%g C={%" PRIi64 ", %g, %" PRIi64 ", %g}\n", id_base + i, d, contribs[i].i1, contribs[i].dx, contribs[i].i2, contribs[i].dy);
    if (contribs[i].i1 != -1) accums[contribs[i].i1] += d * contribs[i].dx;
    if (contribs[i].i2 != -1) accums[contribs[i].i2] += d * contribs[i].dy;
  }
}