#include "lite-c/global_c.h"
#include "lite-c/network_c.h"
#include "lite-c/tensor_c.h"
#include <stdio.h>
#include <string.h>
#define LITE_CAPI_CHECK(_expr) \
do { \
int _ret = (_expr); \
if (_ret) { \
fprintf(stderr, "error msg: %s", LITE_get_last_error()); \
return -1; \
} \
} while (0)
int basic_c_interface(const char* mode_path) {
LiteNetwork c_network;
LITE_CAPI_CHECK(
LITE_make_network(&c_network, *default_config(), *default_network_io()));
LITE_CAPI_CHECK(LITE_load_model_from_path(c_network, mode_path));
LiteTensor c_input_tensor;
LITE_CAPI_CHECK(LITE_get_io_tensor(c_network, "data", LITE_IO, &c_input_tensor));
void* dst_ptr;
size_t length_in_byte;
LITE_CAPI_CHECK(
LITE_get_tensor_total_size_in_byte(c_input_tensor, &length_in_byte));
LITE_CAPI_CHECK(LITE_get_tensor_memory(c_input_tensor, &dst_ptr));
memset(dst_ptr, 5, length_in_byte);
LITE_CAPI_CHECK(LITE_forward(c_network));
LITE_CAPI_CHECK(LITE_wait(c_network));
const char* output_name;
LiteTensor c_output_tensor;
LITE_CAPI_CHECK(LITE_get_output_name(c_network, 0, &output_name));
LITE_CAPI_CHECK(
LITE_get_io_tensor(c_network, output_name, LITE_IO, &c_output_tensor));
void* output_ptr;
size_t length_output_in_byte;
LITE_CAPI_CHECK(LITE_get_tensor_memory(c_output_tensor, &output_ptr));
LITE_CAPI_CHECK(LITE_get_tensor_total_size_in_byte(
c_output_tensor, &length_output_in_byte));
size_t out_length = length_output_in_byte / sizeof(float);
printf("length=%zu\n", out_length);
float max = -1.0f;
float sum = 0.0f;
for (size_t i = 0; i < out_length; i++) {
float data = ((float*)(output_ptr))[i];
sum += data;
if (max < data)
max = data;
}
printf("max=%e, sum=%e\n", max, sum);
return 0;
}
int main(int argc, char** argv) {
if (argc < 2) {
printf("usage: lite_c_examples <model file> , just test C interface "
"build.\n");
return -1;
}
return basic_c_interface(argv[1]);
}