// #include #include // #include 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; } }