int NeoDLRLayer::LoadDLRInfo()

in lab1/deepstream_plugin/neodlr_plugin.cc [158:247]


int NeoDLRLayer::LoadDLRInfo() {
  std::string dlr_lib_path = model_path_ + "/libdlr.so";
  libdlr_ = dlopen(dlr_lib_path.c_str(), RTLD_LAZY | RTLD_LOCAL);
  if (libdlr_ == nullptr) {
    std::cout << "Could not load libdlr.so: " << dlerror();
    return -1;
  }
  // Load functions from libdlr.so
  *(void**)(&CreateDLRModel) = dlsym(libdlr_, "CreateDLRModel");
  *(void**)(&DeleteDLRModel) = dlsym(libdlr_, "DeleteDLRModel");
  *(void**)(&RunDLRModel) = dlsym(libdlr_, "RunDLRModel");
  *(void**)(&GetDLRNumInputs) = dlsym(libdlr_, "GetDLRNumInputs");
  *(void**)(&GetDLRNumWeights) = dlsym(libdlr_, "GetDLRNumWeights");
  *(void**)(&GetDLRInputName) = dlsym(libdlr_, "GetDLRInputName");
  *(void**)(&GetDLRInputType) = dlsym(libdlr_, "GetDLRInputType");
  *(void**)(&GetDLRWeightName) = dlsym(libdlr_, "GetDLRWeightName");
  *(void**)(&SetDLRInput) = dlsym(libdlr_, "SetDLRInput");
  *(void**)(&SetDLRInputTensor) = dlsym(libdlr_, "SetDLRInputTensor");
  *(void**)(&GetDLRInput) = dlsym(libdlr_, "GetDLRInput");
  *(void**)(&GetDLRInputShape) = dlsym(libdlr_, "GetDLRInputShape");
  *(void**)(&GetDLRInputSizeDim) = dlsym(libdlr_, "GetDLRInputSizeDim");
  *(void**)(&GetDLROutputShape) = dlsym(libdlr_, "GetDLROutputShape");
  *(void**)(&GetDLROutput) = dlsym(libdlr_, "GetDLROutput");
  *(void**)(&GetDLROutputPtr) = dlsym(libdlr_, "GetDLROutputPtr");
  *(void**)(&GetDLROutputTensor) = dlsym(libdlr_, "GetDLROutputTensor");
  *(void**)(&GetDLRNumOutputs) = dlsym(libdlr_, "GetDLRNumOutputs");
  *(void**)(&GetDLROutputSizeDim) = dlsym(libdlr_, "GetDLROutputSizeDim");
  *(void**)(&GetDLROutputType) = dlsym(libdlr_, "GetDLROutputType");
  *(void**)(&GetDLRHasMetadata) = dlsym(libdlr_, "GetDLRHasMetadata");
  *(void**)(&GetDLROutputName) = dlsym(libdlr_, "GetDLROutputName");
  *(void**)(&GetDLROutputIndex) = dlsym(libdlr_, "GetDLROutputIndex");
  *(void**)(&GetDLROutputByName) = dlsym(libdlr_, "GetDLROutputByName");
  *(void**)(&DLRGetLastError) = dlsym(libdlr_, "DLRGetLastError");
  *(void**)(&GetDLRBackend) = dlsym(libdlr_, "GetDLRBackend");
  *(void**)(&GetDLRDeviceType) = dlsym(libdlr_, "GetDLRDeviceType");

  // Load model
  int dev_type = GetDLRDeviceType(model_path_.c_str());
  if (dev_type == -1) {
    // Device type couldn't be read from model. Assume it is GPU.
    dev_type = kDLCUDA;
  }
  if (CreateDLRModel(&model_, model_path_.c_str(), dev_type, 0) != 0) {
    std::cout << DLRGetLastError() << std::endl;
    return -1;
  }

  // Read model info
  // Inputs
  int num_inputs = 0;
  if (GetDLRNumInputs(&model_, &num_inputs) != 0) {
    std::cout << DLRGetLastError() << std::endl;
    return -1;
  }
  for (int i = 0; i < num_inputs; ++i) {
    // Get name
    const char* input_name;
    GetDLRInputName(&model_, i, &input_name);
    input_names_.emplace_back(input_name);
    // Get shape
    int64_t input_size;
    int input_dim;
    GetDLRInputSizeDim(&model_, i, &input_size, &input_dim);
    std::vector<int64_t> shape(input_dim);
    GetDLRInputShape(&model_, i, shape.data());

    input_shapes_.emplace_back(shape);
  }
  // Outputs
  // TODO: Check if dynamic
  int num_outputs = 0;
  if (GetDLRNumOutputs(&model_, &num_outputs) != 0) {
    std::cout << DLRGetLastError() << std::endl;
    return -1;
  }
  for (int i = 0; i < num_outputs; ++i) {
    // Get shape
    int64_t output_size;
    int output_dim;
    GetDLROutputSizeDim(&model_, i, &output_size, &output_dim);
    std::vector<int64_t> shape(output_dim);
    GetDLROutputShape(&model_, i, shape.data());
    output_shapes_.emplace_back(shape);
    // Type
    const char* dtype;
    GetDLROutputType(&model_, i, &dtype);
    output_types_.emplace_back(dtype);
  }
  return 0;
}