aboutsummaryrefslogtreecommitdiff
path: root/include/utils.h
blob: e0901ff13f4f26a3811f90dfbb16d92712bda284 (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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#pragma once

#include <stdint.h>
#include <stddef.h>

typedef struct { uint64_t state; } RNG;

typedef struct {
    double *x;
    double *h_pre;
    double *h;
    double *dh;
    double *dh_pre;
    double *dx;
    double *neg_a;
    double *vjp_z;
    double *vjp_theta;
} Workspace;

RNG      rng_init(uint64_t seed);
uint64_t rng_next(RNG *r);
double   rng_uniform(RNG *r);
double   rng_normal(RNG *r);

void    *xmalloc(size_t n);
void    *xcalloc(size_t count, size_t size);

double  *vec_alloc(int n);
double  *vec_zeros(int n);
void     vec_zero(double *v, int n);
void     vec_copy(const double *src, double *dst, int n);
void     vec_add_scaled(double *dst, double alpha, const double *v, int n);
double   vec_dot(const double *a, const double *b, int n);
void     mat_vec(const double *M, const double *x, double *dst, int rows, int cols);
void     mat_vec_T(const double *M, const double *v, double *dst, int rows, int cols);
void     mat_outer_add(double *M, double alpha, const double *a, const double *b, int rows, int cols);

Workspace workspace_alloc(int D, int H, int nparams);
void      workspace_free(Workspace *ws);