diff --git a/winml/lib/Api.Core/WinMLAdapter.cpp b/winml/lib/Api.Core/WinMLAdapter.cpp index b6173a0dc8..130c97e788 100644 --- a/winml/lib/Api.Core/WinMLAdapter.cpp +++ b/winml/lib/Api.Core/WinMLAdapter.cpp @@ -777,7 +777,7 @@ class IOBinding : public Microsoft::WRL::RuntimeClass< return binding_->GetOutputNames(); } std::vector& STDMETHODCALLTYPE GetOutputs() override { - auto output_inner = binding_->GetOutputs(); + auto& output_inner = binding_->GetOutputs(); outputs_weak_.clear(); outputs_.clear(); for (unsigned i = 0; i < output_inner.size(); i++) { diff --git a/winml/lib/Api/impl/MapBase.h b/winml/lib/Api/impl/MapBase.h index 50c3df6bc6..e1157f3358 100644 --- a/winml/lib/Api/impl/MapBase.h +++ b/winml/lib/Api/impl/MapBase.h @@ -62,12 +62,13 @@ struct MapBase : winrt::implements< } template - static TRawType ConvertToABIType(typename ValidLotusType::Type lotusValue) { - return lotusValue; + static TRawType ConvertToABIType(const typename ValidLotusType::Type& lotusValue) { + TRawType copy = lotusValue; + return copy; } template <> - static typename winrt::hstring ConvertToABIType(typename ValidLotusType::Type lotusValue) { + static typename winrt::hstring ConvertToABIType(const typename ValidLotusType::Type& lotusValue) { return WinML::Strings::HStringFromUTF8(lotusValue); } @@ -128,11 +129,19 @@ struct MapBase : winrt::implements< return adapter->GetMapType(TensorKindFrom::Type, TensorKindFrom::Type); } - STDMETHOD(GetOrtValue)(WinML::BindingContext& context, _winmla::IOrtValue** mlValue) { + STDMETHOD(GetOrtValue)(WinML::BindingContext& context, _winmla::IOrtValue** ml_value) { // TODO: Tensorized data should be cached so multiple bindings work more efficiently + // TODO : we need to handle inputs. for now only handle outputs and don't pre allocate anything + if (context.type == WinML::BindingType::kOutput) { + *ml_value = nullptr; + return S_OK; + } + // Create a copy of the map - auto map = context.type == WinML::BindingType::kInput ? std::make_unique(ConvertToLotusMap(m_data)) : std::make_unique(); + auto map = context.type == WinML::BindingType::kInput ? + std::make_unique(ConvertToLotusMap(m_data)) : + std::make_unique(); winrt::com_ptr<_winmla::IWinMLAdapter> adapter; RETURN_IF_FAILED(OrtGetWinMLAdapter(adapter.put())); @@ -142,7 +151,7 @@ struct MapBase : winrt::implements< winrt::com_ptr<_winmla::IOrtValue> ml_value_out; adapter->CreateOrtValue(map.release(), lotus_type, ml_value_out.put()); - *mlValue = ml_value_out.detach(); + *ml_value = ml_value_out.detach(); return S_OK; } diff --git a/winml/lib/Api/impl/SequenceBase.h b/winml/lib/Api/impl/SequenceBase.h index 9faf10b7a4..b93b022685 100644 --- a/winml/lib/Api/impl/SequenceBase.h +++ b/winml/lib/Api/impl/SequenceBase.h @@ -177,6 +177,12 @@ struct SequenceBase : public winrt::implements< _winmla::IOrtValue** ml_value) { // TODO: Tensorized data should be cached so multiple bindings work more efficiently + // TODO : we need to handle inputs. for now only handle outputs and don't pre allocate anything + if (context.type == WinML::BindingType::kOutput) { + *ml_value = nullptr; + return S_OK; + } + // Create a copy of the sequence auto sequence = context.type == WinML::BindingType::kInput ? std::make_unique(ConvertToLotusSequence(data_)) @@ -256,12 +262,12 @@ struct SequenceBase : public winrt::implements< winrt::com_ptr<_winmla::IWinMLAdapter> adapter; RETURN_IF_FAILED(OrtGetWinMLAdapter(adapter.put())); - const LotusSequence& sequence = *static_cast(adapter->GetVectorData( + const LotusSequence* sequence = static_cast(adapter->GetVectorData( ml_value, TensorKindFrom::TKey>::Type, TensorKindFrom::TValue>::Type)); - for (const auto& element : sequence) { + for (const auto& element : *sequence) { writable_vector.Append(ConvertToABIType(element)); }