diff --git a/vowpalwabbit/parser.cc b/vowpalwabbit/parser.cc index 6e4850cc042..bca5fe9d815 100644 --- a/vowpalwabbit/parser.cc +++ b/vowpalwabbit/parser.cc @@ -1016,6 +1016,10 @@ const char* get_tag(example* ec) size_t get_feature_number(example* ec) { return ec->num_features; } + +float get_confidence(example* ec) +{ return ec->confidence; +} } void initialize_examples(vw& all) diff --git a/vowpalwabbit/vw.h b/vowpalwabbit/vw.h index c85ed3a1847..7dfa37f8e2d 100644 --- a/vowpalwabbit/vw.h +++ b/vowpalwabbit/vw.h @@ -87,6 +87,7 @@ uint32_t* get_multilabel_predictions(example* ec, size_t& len); size_t get_tag_length(example* ec); const char* get_tag(example* ec); size_t get_feature_number(example* ec); +float get_confidence(example* ec); feature* get_features(vw& all, example* ec, size_t& feature_number); void return_features(feature* f); diff --git a/vowpalwabbit/vwdll.cpp b/vowpalwabbit/vwdll.cpp index 44ac0e32ae2..5e214483de6 100644 --- a/vowpalwabbit/vwdll.cpp +++ b/vowpalwabbit/vwdll.cpp @@ -144,6 +144,10 @@ VW_DLL_MEMBER size_t VW_CALLING_CONV VW_GetFeatureNumber(VW_EXAMPLE e) { return VW::get_feature_number(static_cast(e)); } +VW_DLL_MEMBER float VW_CALLING_CONV VW_GetConfidence(VW_EXAMPLE e) +{ return VW::get_confidence(static_cast(e)); +} + VW_DLL_MEMBER VW_FEATURE VW_CALLING_CONV VW_GetFeatures(VW_HANDLE handle, VW_EXAMPLE e, size_t* plen) { vw* pointer = static_cast(handle); return VW::get_features(*pointer, static_cast(e), *plen); @@ -274,4 +278,64 @@ VW_DLL_MEMBER void VW_CALLING_CONV VW_SaveModel(VW_HANDLE handle) return VW::save_predictor(*pointer, name); } + + +class memory_io_buf : public io_buf +{ +public: + memory_io_buf() : readOffset(0) { + files.push_back(-1); // this is a hack because buf will do nothing if files is empty + } + + virtual ssize_t write_file(int file, const void* buf, size_t nbytes) { + auto byteBuf = reinterpret_cast(buf); + data.insert(data.end(), &byteBuf[0], &byteBuf[nbytes]); + return nbytes; + } + + virtual ssize_t read_file(int f, void* buf, size_t nbytes) { + nbytes = min(nbytes, data.size()-readOffset); + copy(data.data()+readOffset, data.data()+readOffset+nbytes, reinterpret_cast(buf)); + readOffset += nbytes; + return nbytes; + } + + char* GetDataPointer() { + return data.data(); + } + + size_t GetDataSize() const { + return data.size(); + } + +private: + vector data; + size_t readOffset; +}; + +VW_DLL_MEMBER VW_HANDLE VW_CALLING_CONV VW_InitializeWithModel(const char * pstrArgs, const char * modelData, size_t modelDataSize) +{ + unique_ptr buf(new memory_io_buf); + buf->write_file(-1, modelData, modelDataSize); + + vw* all = VW::initialize(string(pstrArgs), buf.get()); + return static_cast(all); +} + +VW_DLL_MEMBER void VW_CALLING_CONV VW_CopyModelData(VW_HANDLE handle, VW_IOBUF* outputBufferHandle, char** outputData, size_t* outputSize) { + vw* pointer = static_cast(handle); + + memory_io_buf* buf = new(memory_io_buf); + VW::save_predictor(*pointer, *buf); + + *outputBufferHandle = buf; + *outputSize = buf->GetDataSize(); + *outputData = buf->GetDataPointer(); +} + +VW_DLL_MEMBER void VW_CALLING_CONV VW_FreeIOBuf(VW_IOBUF bufferHandle) { + delete static_cast(bufferHandle); } + +} + diff --git a/vowpalwabbit/vwdll.h b/vowpalwabbit/vwdll.h index fe44190917d..4ccc36f8338 100644 --- a/vowpalwabbit/vwdll.h +++ b/vowpalwabbit/vwdll.h @@ -57,6 +57,7 @@ typedef void * VW_EXAMPLE; typedef void * VW_LABEL; typedef void * VW_FEATURE_SPACE; typedef void * VW_FEATURE; +typedef void * VW_IOBUF; const VW_HANDLE INVALID_VW_HANDLE = VW_TYPE_SAFE_NULL; const VW_HANDLE INVALID_VW_EXAMPLE = VW_TYPE_SAFE_NULL; @@ -65,6 +66,7 @@ const VW_HANDLE INVALID_VW_EXAMPLE = VW_TYPE_SAFE_NULL; VW_DLL_MEMBER VW_HANDLE VW_CALLING_CONV VW_Initialize(const char16_t * pstrArgs); #endif VW_DLL_MEMBER VW_HANDLE VW_CALLING_CONV VW_InitializeA(const char * pstrArgs); +VW_DLL_MEMBER VW_HANDLE VW_CALLING_CONV VW_InitializeWithModel(const char * pstrArgs, const char * modelData, size_t modelDataSize); VW_DLL_MEMBER void VW_CALLING_CONV VW_Finish_Passes(VW_HANDLE handle); VW_DLL_MEMBER void VW_CALLING_CONV VW_Finish(VW_HANDLE handle); @@ -93,6 +95,7 @@ VW_DLL_MEMBER float VW_CALLING_CONV VW_GetTopicPrediction(VW_EXAMPLE e, size_t i VW_DLL_MEMBER size_t VW_CALLING_CONV VW_GetTagLength(VW_EXAMPLE e); VW_DLL_MEMBER const char* VW_CALLING_CONV VW_GetTag(VW_EXAMPLE e); VW_DLL_MEMBER size_t VW_CALLING_CONV VW_GetFeatureNumber(VW_EXAMPLE e); +VW_DLL_MEMBER float VW_CALLING_CONV VW_GetConfidence(VW_EXAMPLE e); VW_DLL_MEMBER VW_FEATURE VW_CALLING_CONV VW_GetFeatures(VW_HANDLE handle, VW_EXAMPLE e, size_t* plen); VW_DLL_MEMBER void VW_CALLING_CONV VW_ReturnFeatures(VW_FEATURE f); #ifdef USE_CODECVT @@ -120,6 +123,8 @@ VW_DLL_MEMBER size_t VW_CALLING_CONV VW_Num_Weights(VW_HANDLE handle); VW_DLL_MEMBER size_t VW_CALLING_CONV VW_Get_Stride(VW_HANDLE handle); VW_DLL_MEMBER void VW_CALLING_CONV VW_SaveModel(VW_HANDLE handle); +VW_DLL_MEMBER void VW_CALLING_CONV VW_CopyModelData(VW_HANDLE handle, VW_IOBUF* bufferHandle, char** outputData, size_t* outputSize); +VW_DLL_MEMBER void VW_CALLING_CONV VW_FreeIOBuf(VW_IOBUF bufferHandle); #ifdef __cplusplus }