aboutsummaryrefslogtreecommitdiff
path: root/embedding_example/main.c
blob: 8856d58cd256ed0f5fc3b00100ced1bc96c555b3 (plain) (blame)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "matrix/matrix.h"
#include "common.h"
#include "luaT/luaT.h"
#include <stdio.h>

const char *nerv_matrix_host_float_tname = "nerv.MMatrixFloat";
const char *input_name = "_nerv_embed_input";
const char *output_name = "_nerv_embed_output";
extern Matrix *nerv_matrix_host_float_create(long nrow, long ncol, Status *status);
extern void nerv_matrix_host_float_data_retain(Matrix *self);
extern void nerv_matrix_host_float_data_free(Matrix *self, Status *status);

lua_State *L;
Matrix *input, *output;
Status status;

void setup_nerv() {
    L = lua_open();
    luaL_openlibs(L);
    luaL_loadfile(L, "setup_nerv.lua");
    /* network configuration */
    lua_pushstring(L, "../nerv/examples/swb_baseline.lua");
    if (lua_pcall(L, 1, LUA_MULTRET, 0))
    {
        printf("%s\n", luaL_checkstring(L, 1));
        exit(1);
    }
    /* lua stack now: input width, output width, propagator */
    input = nerv_matrix_host_float_create(1, luaL_checkinteger(L, 1), &status);
    NERV_LUA_CHECK_STATUS(L, status);
    output = nerv_matrix_host_float_create(1, luaL_checkinteger(L, 2), &status);
    NERV_LUA_CHECK_STATUS(L, status);
    /* add reference to avoid gc */
    luaT_pushudata(L, output, nerv_matrix_host_float_tname);
    luaT_pushudata(L, input, nerv_matrix_host_float_tname);
    lua_setfield(L, LUA_GLOBALSINDEX, input_name);
    lua_setfield(L, LUA_GLOBALSINDEX, output_name);
}


void propagate(float for_fun) {
    int i, j;
    printf("ok: %d\n", lua_gettop(L));
    lua_pushvalue(L, 3);
    /* lua stack now: input width, output width, propagator, propagator */
    for (i = 0; i < input->nrow; i++) /* nrow is actually 1 */
    {
        float *nerv_row = (float *)((char *)input->data.f + i * input->stride);
        for (j = 0; j < input->ncol; j++)
        {
            nerv_row[j] = j * for_fun;
        }
    }
    lua_getfield(L, LUA_GLOBALSINDEX, input_name);
    lua_getfield(L, LUA_GLOBALSINDEX, output_name);
    /* lua stack now: input width, output width, propagator, propagator, input, output */
    if (lua_pcall(L, 2, 0, 0)) /* call propagator with two parameters */
    {
        printf("%s\n", luaL_checkstring(L, -1));
        exit(-1);
    }
    /* lua stack now: input width, output width, propagator */
    printf("## output: %ld %ld ##\n", output->nrow, output->ncol);
    for (i = 0; i < output->nrow; i++) /* nrow is actually 1 */
    {
        float *nerv_row = (float *)((char *)output->data.f + i * output->stride);
        for (j = 0; j < output->ncol; j++)
        {
            printf("%.8f ", nerv_row[j]);
        }
    }
}

void teardown_nerv() {
    lua_pushnil(L);
    lua_pushnil(L);
    lua_setfield(L, LUA_GLOBALSINDEX, input_name);
    lua_setfield(L, LUA_GLOBALSINDEX, output_name);
    lua_gc(L, LUA_GCCOLLECT, 0);
}

int main() {
    setup_nerv();
    propagate(1.0);
    propagate(2.0);
    propagate(2.0);
    propagate(3.0);
    teardown_nerv();
    return 0;
}