#include "selfdrive/modeld/runners/thneedmodel.h" #include ThneedModel::ThneedModel(const char *path, float *loutput, size_t loutput_size, int runtime, bool luse_extra) { thneed = new Thneed(true); thneed->load(path); thneed->clexec(); thneed->find_inputs_outputs(); recorded = false; output = loutput; use_extra = luse_extra; } void ThneedModel::addRecurrent(float *state, int state_size) { recurrent = state; } void ThneedModel::addTrafficConvention(float *state, int state_size) { trafficConvention = state; } void ThneedModel::addDesire(float *state, int state_size) { desire = state; } void ThneedModel::addImage(float *image_input_buf, int buf_size) { input = image_input_buf; } void ThneedModel::addExtra(float *extra_input_buf, int buf_size) { extra = extra_input_buf; } void* ThneedModel::getInputBuf() { if (use_extra && thneed->input_clmem.size() > 4) return &(thneed->input_clmem[4]); else if (!use_extra && thneed->input_clmem.size() > 3) return &(thneed->input_clmem[3]); else return nullptr; } void* ThneedModel::getExtraBuf() { if (thneed->input_clmem.size() > 3) return &(thneed->input_clmem[3]); else return nullptr; } void ThneedModel::execute() { if (!recorded) { thneed->record = true; if (use_extra) { float *inputs[5] = {recurrent, trafficConvention, desire, extra, input}; thneed->copy_inputs(inputs); } else { float *inputs[4] = {recurrent, trafficConvention, desire, input}; thneed->copy_inputs(inputs); } thneed->clexec(); thneed->copy_output(output); thneed->stop(); recorded = true; } else { if (use_extra) { float *inputs[5] = {recurrent, trafficConvention, desire, extra, input}; thneed->execute(inputs, output); } else { float *inputs[4] = {recurrent, trafficConvention, desire, input}; thneed->execute(inputs, output); } } }