// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

//! \file Windows.AI.MachineLearning.idl
import "Windows.Foundation.idl";
import "windows.graphics.idl";
import "windows.media.idl";

#ifndef WINDOWSAI_RAZZLE_BUILD
// Pull in definition for DualApiPartitionAttribute, because the WinML IDL
// does not build in the OS Repo, and needs to access internal definitions for
// various custom attribute definitions.
import "dualapipartitionattribute.idl";
import "windows.graphics.directx.direct3d11.idl";
import "windows.graphics.imaging.idl";
import "windows.storage.idl";
#endif

#include <sdkddkver.h>

#ifdef BUILD_INBOX
  #define ROOT_NS Windows
  #define INBOX_ONLY(x) x
  #define OTB_ONLY(x)
#else
  #define INBOX_ONLY(x)
  #define OTB_ONLY(x) x
#endif

#ifndef ROOT_NS
  #define ROOT_NS Microsoft
#endif

namespace ROOT_NS.AI.MachineLearning 
{
    [contractversion(5)]
    apicontract MachineLearningContract{};

    //! Forward declarations
    runtimeclass LearningModelBinding;

    //! \enum LearningModelFeatureKind
    //! \brief Defines the list of input and output feature types for a machine learning model. 
    //! Each of these maps to a corresponding FeatureDescriptor that you can use to learn more 
    //! about how to pass the feature into and out of the the model.
    [contract(MachineLearningContract, 1)]
    enum LearningModelFeatureKind
    {
        //! The feature is a tensor, use TensorFeatureDescriptor
        Tensor = 0,
        //! The feature is a sequence, use SequenceFeatureDescriptor
        Sequence,
        //! The feature is a map, use MapFeatureDescriptor
        Map,
        //! The feature is an image, use ImageFeatureDescriptor
        Image
    };

    //! \brief Describes the common properties that all features have.
    INBOX_ONLY([uuid(bc08cf7c-6ed0-4004-97ba-b9a2eecd2b4f)])
    [contract(MachineLearningContract, 1)]
    interface ILearningModelFeatureDescriptor
    {
        //! \brief The name you use to bind values to this feature.
        //! This property is required and will always be there.  All features have a name as 
        //! primary key for the model.  Usually as a single word.   You use this name when 
        //! enumerating the features of the model and then later when binding a value to one 
        //! those feature using a LearningModelBinding.  It will be unique across all features.
        String Name{ get; };
        //! \brief A description of what this feature is used for in the model
        //! This property is optional.  If provided by an author model it will be a description
        //! of what the feature is for the model.
        String Description{ get; };
        //! \brief The kind of feature - use this to know which derived class to use.
        LearningModelFeatureKind Kind{ get; };
        //! \brief If true, you must bind a value to this feature before calling Evalaute().
        Boolean IsRequired{ get; };
    }

    INBOX_ONLY([uuid(2a222e5d-afb1-47ed-bfad-b5b3a459ec04)])
    OTB_ONLY([uuid(ae066239-6b19-4509-be3e-502ba40203b3)])
    [contract(MachineLearningContract, 1)]
    interface ILearningModelOperatorProvider : IInspectable
    {
    }

    //! \interface LearningModel
    //! \brief Represents a trained machine learning model.
    //! \details This is the main object you use to interact with Windows Machine Learning.  You use 
    //! it to load, bind, and evaluate trained ONNX models.   To load the model you use 
    //! one of the Load constructors.  You can then enumerate the InputFeatures and 
    //! OutputFeatures.   To bind and evaluate you create a LearningModelSession.
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ILearningModelStatics", e3b977e8-6952-4e47-8ef4-1f7f07897c6d)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ILearningModel", 5b8e4920-489f-4e86-9128-265a327b78fa)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass LearningModel : Windows.Foundation.IClosable
    {
        //! Loads an ONNX model from a StorageFile asynchronously.
        [remote_async]
        static Windows.Foundation.IAsyncOperation<LearningModel> LoadFromStorageFileAsync(Windows.Storage.IStorageFile modelFile);
        //! Loads an ONNX model from a stream asynchronously.
        [remote_async]
        static Windows.Foundation.IAsyncOperation<LearningModel> LoadFromStreamAsync(Windows.Storage.Streams.IRandomAccessStreamReference modelStream);
        //! Loads an ONNX model from a file on disk.
        static LearningModel LoadFromFilePath(String filePath);
        //! Loads an ONNX model from a stream.
        static LearningModel LoadFromStream(Windows.Storage.Streams.IRandomAccessStreamReference modelStream);

        //! Loads an ONNX model from a StorageFile asynchronously.
        [remote_async]
        [method_name("LoadFromStorageFileWithOperatorProviderAsync")] static Windows.Foundation.IAsyncOperation<LearningModel> LoadFromStorageFileAsync(Windows.Storage.IStorageFile modelFile, ILearningModelOperatorProvider operatorProvider);
        //! Loads an ONNX model from a stream asynchronously.
        [remote_async]
        [method_name("LoadFromStreamWithOperatorProviderAsync")] static Windows.Foundation.IAsyncOperation<LearningModel> LoadFromStreamAsync(Windows.Storage.Streams.IRandomAccessStreamReference modelStream, ILearningModelOperatorProvider operatorProvider);
        //! Loads an ONNX model from a file on disk.
        [method_name("LoadFromFilePathWithOperatorProvider")] static LearningModel LoadFromFilePath(String filePath, ILearningModelOperatorProvider operatorProvider);
        //! Loads an ONNX model from a stream.
        [method_name("LoadFromStreamWithOperatorProvider")] static LearningModel LoadFromStream(Windows.Storage.Streams.IRandomAccessStreamReference modelStream, ILearningModelOperatorProvider operatorProvider);

        //! The name of the model author.
        String Author{ get; };
        //! The name of the model.
        String Name{ get; };
        //! The namespace of the imported model operator set. All models implicitly import the default ONNX operator set. 
        String Domain{ get; };
        //! A description of the model.
        String Description{ get; };
        //! The ONNX version assumed by the model.
        Int64 Version{ get; };
        //! The raw ONNX model provided <string,string> metadata.
        Windows.Foundation.Collections.IMapView <String, String> Metadata{ get; };
        //! All of the input features.
        Windows.Foundation.Collections.IVectorView<ILearningModelFeatureDescriptor > InputFeatures{ get; };
        //! All of the output features.
        Windows.Foundation.Collections.IVectorView<ILearningModelFeatureDescriptor > OutputFeatures{ get; };
    }

    //! \enum LearningModelDeviceKind
    //! \brief Defines the list of devices that can evaluate a machine learning model. 
    [contract(MachineLearningContract, 1)]
    enum LearningModelDeviceKind
    {
        //! Let the system decide which device to use.
        Default = 0,
        //! Use the CPU to evaluate the model.
        Cpu,
        //! Use a GPU or other DirectX device to evaluate the model.
        DirectX,
        //! Use the system policy defined device for high performance.
        DirectXHighPerformance,
        //! Use the system policy defined device for minimum power.
        DirectXMinPower
    };


    //! \class LearningModelDevice
    //! \brief Create an instance specific to which device you want to evaluate the machine learning model on. 
    //! \namespace Windows.AI.MachineLearning
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([constructor_name("Windows.AI.MachineLearning.ILearningModelDeviceFactory", 9cffd74d-b1e5-4f20-80ad-0a56690db06b)])
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ILearningModelDeviceStatics", 49f32107-a8bf-42bb-92c7-10b12dc5d21f)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ILearningModelDevice", f5c2c8fe-3f56-4a8c-ac5f-fdb92d8b8252)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass LearningModelDevice
    {
        //! Create a LearningModelDevice from the specified IDirect3DDevice. 
        //! During evaluation, the specified IDirect3DDevice will be used to create resources and queue work during execution.
        static LearningModelDevice CreateFromDirect3D11Device(Windows.Graphics.DirectX.Direct3D11.IDirect3DDevice device);
        //! Create a LearningModelDevice from the specified list of devices enumerated in LearningModelDeviceKind.
        [method_name("Create")] LearningModelDevice(LearningModelDeviceKind deviceKind);

        // BUGBUG: this needs to be Windows.Graphics.DisplayAdapterId which is only there in the RS4 winmd
        //! Returns the unique identifier for the chosen adapter for model 
        Windows.Graphics.DisplayAdapterId AdapterId{ get; };
        //! Returns the chosen IDirect3DDevice for model evaluation.
        Windows.Graphics.DirectX.Direct3D11.IDirect3DDevice Direct3D11Device{ get; };
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ILearningModelEvaluationResult", b2f9bfcd-960e-49c0-8593-eb190ae3eee2)])
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass LearningModelEvaluationResult
    {
        //! The optional user supplied string that was attached to the Evaluate() call to connect the output results.
        String CorrelationId{ get; };
        //! If the evaluation failed, returns an error code for what caused the failure. 
        Int32 ErrorStatus{ get; };
        //! True if the evaluation completed successfully.
        //! If False, use ErrorStatus to find out what caused the failure. 
        Boolean Succeeded{ get; };
        //! A set of features representing the output prediction along with probabilities.
        Windows.Foundation.Collections.IMapView<String, IInspectable> Outputs{ get; };
    }

    //! \class LearningModelSessionOptions
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 2)]
    [dualapipartition(1)]
    runtimeclass LearningModelSessionOptions
    {
        // default constructor
        LearningModelSessionOptions();

        //! The BatchSizeOverride option will allow the model compiler to use constant batch size performance optimizations when setting up the LearningModelSession.
        //! The default value for the BatchSizeOverride will be 1 indicating a static batch size of 1.
        //! BatchSizeOverride = 0 indicates that the batch size present in the model should be honored.
        //! BatchSizeOverride > 0 indicates the size of batch that will be used to override the model batch size and optimize evaluations.
        UInt32 BatchSizeOverride { get; set; };

        [contract(MachineLearningContract, 4)]
        {
            //! The OverrideNamedDimension method will allow the model compiler to use constant batch size performance optimizations when setting up the LearningModelSession.
            //! The caller can specify the size of the dimension for a given named dimension.
            //! dimension = 0 indicates that the dimension present in the model should be honored.
            //! dimension > 0 indicates the size of the dimension that will be used to override the model "name" dimension and optimize evaluations.
            void OverrideNamedDimension(String name, UInt32 dimension);
        }

        [contract(MachineLearningContract, 3)]
        {
            //! The CloseModelOnSessionCreation option will allow the LearningModelSession to take ownership of the LearningModel's
            //! internal model representation. This will defunct the LearningModel session, but decreases the necessary peak working set. 
            //! CloseModelOnSessionCreation = True indicates that the model's internal data will be moved into the session during construction.
            //! CloseModelOnSessionCreation = False indicates that the model's internal data will be copied into the session during construction.
            Boolean CloseModelOnSessionCreation { get; set; };
        }
    }

    //! \class LearningModelSession
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([constructor_name("Windows.AI.MachineLearning.ILearningModelSessionFactory", 0f6b881d-1c9b-47b6-bfe0-f1cf62a67579)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ILearningModelSession", 8e58f8f6-b787-4c11-90f0-7129aeca74a9)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass LearningModelSession : Windows.Foundation.IClosable
    {
        //! Create a session, on the system default device, to evaluate the specified model on.
        [method_name("CreateFromModel")] LearningModelSession(LearningModel model);
        //! Create a session, on the provided device, to evaluate the specified model on.
        [method_name("CreateFromModelOnDevice")] LearningModelSession(LearningModel model, LearningModelDevice deviceToRunOn);

        //! Returns the machine learning model attached to the session.
        LearningModel Model{ get; };
        //! Returns the evaluation device that the session was created on.
        LearningModelDevice Device{ get; };
        //! Returns the list of properties set for model evaluation.
        Windows.Foundation.Collections.IPropertySet EvaluationProperties{ get; };
        //! Evaluate the machine learning model using the feature values already bound in 'bindings'. (asynchronous)
        [remote_async]
        Windows.Foundation.IAsyncOperation<LearningModelEvaluationResult> EvaluateAsync(LearningModelBinding bindings, String correlationId);
        //! Evaluate the machine learning model using the feature values in the map 'features'. (asynchronous)
        //! This method is an alternative to the separated bind then eval form that takes a LearningModelBinding. 
        //! It will take the passed in features, create a LearningModelBinding for you, bind the features, and then evaluate the model.
        [remote_async]
        Windows.Foundation.IAsyncOperation<LearningModelEvaluationResult> EvaluateFeaturesAsync(Windows.Foundation.Collections.IMap<String, IInspectable> features, String correlationId);
        //! Evaluate the machine learning model using the feature values bound in 'bindings'.
        LearningModelEvaluationResult Evaluate(LearningModelBinding bindings, String correlationId);
        //! Evaluate the machine learning model using the feature values in the map 'features'.
        //! This method is an alternative to the separated bind then eval form that takes a LearningModelBinding.
        //! It will take the passed in features, create a LearningModelBinding for you, bind the features, and then evaluate the model.
        LearningModelEvaluationResult EvaluateFeatures(Windows.Foundation.Collections.IMap<String, IInspectable> features, String correlationId);

        [contract(MachineLearningContract, 2)]
        {
            //! Create a session, on the provided device, with the desired model compilation options, to evaluate the specified model on.
            [method_name("CreateFromModelOnDeviceWithSessionOptions")] LearningModelSession(LearningModel model, LearningModelDevice deviceToRunOn, LearningModelSessionOptions learningModelSessionOptions);
        }
    }

    //! \interface ILearningModelFeatureValue
    //! \brief The instantiated value for a feature.
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([uuid(f51005db-4085-4dfe-9fed-95eb0c0cf75c)])
    interface ILearningModelFeatureValue
    {
        //! The data type of the feature.
        LearningModelFeatureKind Kind{ get; };
    };

    //! \class LearningModelBinding
    //! \brief Holder for associations between model inputs/outputs and variable instances.
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([constructor_name("Windows.AI.MachineLearning.ILearningModelBindingFactory", c95f7a7a-e788-475e-8917-23aa381faf0b)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ILearningModelBinding", ea312f20-168f-4f8c-94fe-2e7ac31b4aa8)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass LearningModelBinding : Windows.Foundation.Collections.IMapView <String, IInspectable>
    {
        //! Create a LearningModelBinding from the specified LearningModelSession. 
        //! During evaluation, the specified adapter will be used to create resources and queue work during execution.
        [method_name("CreateFromSession")] LearningModelBinding(LearningModelSession session);
        //! Bind a value to the specified feature.
        void Bind(String name, IInspectable value);
        //! TODO:Docs
        [method_name("BindWithProperties")] void Bind(String name, IInspectable value, Windows.Foundation.Collections.IPropertySet props);
        //! Remove all bindings.
        void Clear();
    }

    //! \enum TensorKind
    //! \brief Defines the list of supported tensor data types.
    [contract(MachineLearningContract, 1)]
    enum TensorKind
    {
        //! Supported by ONNX, but should never happen and is invalid for Windows ML.
        Undefined = 0,
        //! The tensor type is 32bit float.
        Float,
        //! The tensor type is 8bit unsigned int.
        UInt8,
        //! The tensor type is 8bit signed int.
        Int8,
        //! The tensor type is 16bit unsigned int.
        UInt16,
        //! The tensor type is 16bit signed int.
        Int16,
        //! The tensor type is 32bit signed int.
        Int32,
        //! The tensor type is 64bit signed int.
        Int64,
        //! The tensor type is String.
        String,
        //! The tensor type is Boolean.
        Boolean,
        //! The tensor type is 16bit float.
        Float16,
        //! The tensor type is 64bit float.
        Double,
        //! The tensor type is 32bit unsigned int.
        UInt32,
        //! The tensor type is 64bit unsigned int.
        UInt64,
        //! Supported by ONNX, but is not supported by Windows ML.
        Complex64,
        //! Supported by ONNX, but is not supported by Windows ML.
        Complex128
    };

    //! \class MapFeatureDescriptor
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.IMapFeatureDescriptor", 530424bd-a257-436d-9e60-c2981f7cc5c4)])
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass MapFeatureDescriptor : ILearningModelFeatureDescriptor
    {
        //! Returns the data type of the map's key.
        TensorKind KeyKind{ get; };
        //! Returns the properties of the map's value.
        ILearningModelFeatureDescriptor  ValueDescriptor{ get; };
    }

    //! \class SequenceFeatureDescriptor
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ISequenceFeatureDescriptor", 84f6945a-562b-4d62-a851-739aced96668)])
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass SequenceFeatureDescriptor : ILearningModelFeatureDescriptor
    {
        //! Gets the properties of the specified feature.
        ILearningModelFeatureDescriptor  ElementDescriptor{ get; };
    }

    //! \class TensorFeatureDescriptor
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorFeatureDescriptor", 74455c80-946a-4310-a19c-ee0af028fce4)])
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorFeatureDescriptor : ILearningModelFeatureDescriptor
    {
        //! Returns the data type of the tensor.
        TensorKind TensorKind{ get; };
        //! Returns the count and size of each dimension.
        Windows.Foundation.Collections.IVectorView<Int64> Shape{ get; };
    }

    //! \enum LearningModelPixelRange
    //! \brief Defines the list of image nominal pixel range specified in model metadata.
    [contract(MachineLearningContract, 5)]
    enum LearningModelPixelRange
    {
        //! [0...255] for 8bpp(8 Bits per Pixel) samples
        ZeroTo255= 0,
        //! [0...1] pixel data is stored normalized
        ZeroToOne,
        //! [-1...1] pixel data is stored normalized
        MinusOneToOne 
    };

    //! \class ImageFeatureDescriptor
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.IImageFeatureDescriptor", 365585a5-171a-4a2a-985f-265159d3895a)])
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass ImageFeatureDescriptor : ILearningModelFeatureDescriptor
    {
        //! Specifies the pixel format (channel ordering, bit depth, and data type) of the pixel data.
        Windows.Graphics.Imaging.BitmapPixelFormat BitmapPixelFormat{ get; };
        //! Specifies the alpha mode of the pixel data.
        Windows.Graphics.Imaging.BitmapAlphaMode BitmapAlphaMode{ get; };
        [contract(MachineLearningContract, 5)]
        {
            //！Specifies the nominal pixel range of pixel data.
            LearningModelPixelRange PixelRange{ get; };
        }

        //! The width of the image.
        UInt32 Width{ get; };
        //! The height of the image.
        UInt32 Height{ get; };
    }

    //! \interface ITensor
    //! \brief TODO:Docs
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([uuid(05489593-a305-4a25-ad09-440119b4b7f6)])
    interface ITensor : IInspectable requires ILearningModelFeatureValue
    {
        //! Returns the data type of the tensor.
        TensorKind TensorKind{ get; };
        //! TODO:Docs
        Windows.Foundation.Collections.IVectorView<Int64> Shape{ get; };
    }

    //! \class TensorFloat
    //! \brief A 32bit float tensor object.
    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorFloatStatics", dbcd395b-3ba3-452f-b10d-3c135e573fa9)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorFloat", f2282d82-aa02-42c8-a0c8-df1efc9676e1)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorFloat : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        //! Creates a tensor object without allocating a buffer.
        static TensorFloat Create();
        //! Creates a tensor object and allocates a buffer of size 'shape'.
        static TensorFloat Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
        static TensorFloat CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Single[] data);
        //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
        static TensorFloat CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Single> data);
        //! Returns a read only view of the data.
        Windows.Foundation.Collections.IVectorView <Single> GetAsVectorView();

        [contract(MachineLearningContract, 2)] 

        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorFloat CreateFromShapeArrayAndDataArray(Int64[] shape, Single[] data);

            //! Creates a tensor object of size 'shape', and uses the data in 'buffer'.
            static TensorFloat CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorFloat16BitStatics", a52db6f5-318a-44d4-820b-0cdc7054a84a)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorFloat16Bit", 0ab994fc-5b89-4c3c-b5e4-5282a5316c0a)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorFloat16Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorFloat16Bit Create();
        static TensorFloat16Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorFloat16Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Single[] data);
        static TensorFloat16Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Single> data);
        Windows.Foundation.Collections.IVectorView <Single> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorFloat16Bit CreateFromShapeArrayAndDataArray(Int64[] shape, Single[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            //! 'buffer' contains a packed array of 16bit floating point values.
            static TensorFloat16Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorUInt8BitStatics", 05f67583-bc24-4220-8a41-2dcd8c5ed33c)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorUInt8Bit", 58e1ae27-622b-48e3-be22-d867aed1daac)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorUInt8Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorUInt8Bit Create();
        static TensorUInt8Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorUInt8Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, UInt8[] data);
        static TensorUInt8Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<UInt8> data);
        Windows.Foundation.Collections.IVectorView <UInt8> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorUInt8Bit CreateFromShapeArrayAndDataArray(Int64[] shape, UInt8[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            //! 'buffer' contains a packed array of 8bit uint8 values.
            static TensorUInt8Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorInt8BitStatics", b1a12284-095c-4c76-a661-ac4cee1f3e8b)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorInt8Bit", cddd97c5-ffd8-4fef-aefb-30e1a485b2ee)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorInt8Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorInt8Bit Create();
        static TensorInt8Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorInt8Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, BYTE[] data);
        static TensorInt8Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<BYTE> data);
        Windows.Foundation.Collections.IVectorView <BYTE> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorInt8Bit CreateFromShapeArrayAndDataArray(Int64[] shape, BYTE[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorInt8Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorUInt16BitStatics", 5df745dd-028a-481a-a27c-c7e6435e52dd)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorUInt16Bit", 68140f4b-23c0-42f3-81f6-a891c011bc3f)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorUInt16Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorUInt16Bit Create();
        static TensorUInt16Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorUInt16Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, UInt16[] data);
        static TensorUInt16Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<UInt16> data);
        Windows.Foundation.Collections.IVectorView <UInt16> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorUInt16Bit CreateFromShapeArrayAndDataArray(Int64[] shape, UInt16[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorUInt16Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorInt16BitStatics", 98646293-266e-4b1a-821f-e60d70898b91)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorInt16Bit", 98a32d39-e6d6-44af-8afa-baebc44dc020)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorInt16Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorInt16Bit Create();
        static TensorInt16Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorInt16Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Int16[] data);
        static TensorInt16Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Int16> data);
        Windows.Foundation.Collections.IVectorView <Int16> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorInt16Bit CreateFromShapeArrayAndDataArray(Int64[] shape, Int16[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorInt16Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorUInt32BitStatics", 417c3837-e773-4378-8e7f-0cc33dbea697)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorUInt32Bit", d8c9c2ff-7511-45a3-bfac-c38f370d2237)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorUInt32Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorUInt32Bit Create();
        static TensorUInt32Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorUInt32Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, UInt32[] data);
        static TensorUInt32Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<UInt32> data);
        Windows.Foundation.Collections.IVectorView <UInt32> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorUInt32Bit CreateFromShapeArrayAndDataArray(Int64[] shape, UInt32[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorUInt32Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorInt32BitStatics", 6539864b-52fa-4e35-907c-834cac417b50)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorInt32Bit", 2c0c28d3-207c-4486-a7d2-884522c5e589)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorInt32Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorInt32Bit Create();
        static TensorInt32Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorInt32Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Int32[] data);
        static TensorInt32Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Int32> data);
        Windows.Foundation.Collections.IVectorView <Int32> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorInt32Bit CreateFromShapeArrayAndDataArray(Int64[] shape, Int32[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorInt32Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorUInt64BitStatics", 7a7e20eb-242f-47cb-a9c6-f602ecfbfee4)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorUInt64Bit", 2e70ffad-04bf-4825-839a-82baef8c7886)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorUInt64Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorUInt64Bit Create();
        static TensorUInt64Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorUInt64Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, UInt64[] data);
        static TensorUInt64Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<UInt64> data);
        Windows.Foundation.Collections.IVectorView <UInt64> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorUInt64Bit CreateFromShapeArrayAndDataArray(Int64[] shape, UInt64[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorUInt64Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorInt64BitStatics", 9648ad9d-1198-4d74-9517-783ab62b9cc2)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorInt64Bit", 499665ba-1fa2-45ad-af25-a0bd9bda4c87)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorInt64Bit : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorInt64Bit Create();
        static TensorInt64Bit Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorInt64Bit CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Int64[] data);
        static TensorInt64Bit CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Int64> data);
        Windows.Foundation.Collections.IVectorView <Int64> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorInt64Bit CreateFromShapeArrayAndDataArray(Int64[] shape, Int64[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorInt64Bit CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorBooleanStatics", 2796862c-2357-49a7-b476-d0aa3dfe6866)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorBoolean", 50f311ed-29e9-4a5c-a44d-8fc512584eed)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorBoolean : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorBoolean Create();
        static TensorBoolean Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorBoolean CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Boolean[] data);
        static TensorBoolean CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Boolean> data);
        Windows.Foundation.Collections.IVectorView <Boolean> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorBoolean CreateFromShapeArrayAndDataArray(Int64[] shape, Boolean[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            //! 'buffer' represents a byte packed array of boolean values.
            static TensorBoolean CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorDoubleStatics", a86693c5-9538-44e7-a3ca-5df374a5a70c)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorDouble", 91e41252-7a8f-4f0e-a28f-9637ffc8a3d0)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorDouble : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorDouble Create();
        static TensorDouble Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorDouble CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, Double[] data);
        static TensorDouble CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<Double> data);
        Windows.Foundation.Collections.IVectorView <Double> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorDouble CreateFromShapeArrayAndDataArray(Int64[] shape, Double[] data);

            //! Creates a tensor object, creates a tensor of size 'shape', and uses the data in 'buffer'.
            static TensorDouble CreateFromBuffer(Int64[] shape, Windows.Storage.Streams.IBuffer buffer);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.ITensorStringStatics", 83623324-cf26-4f17-a2d4-20ef8d097d53)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.ITensorString", 582335c8-bdb1-4610-bc75-35e9cbf009b7)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass TensorString : ITensor, [contract(MachineLearningContract, 2)]Windows.Foundation.IMemoryBuffer
    {
        static TensorString Create();
        static TensorString Create(Windows.Foundation.Collections.IIterable<Int64> shape);
        static TensorString CreateFromArray(Windows.Foundation.Collections.IIterable<Int64> shape, String[] data);
        static TensorString CreateFromIterable(Windows.Foundation.Collections.IIterable<Int64> shape, Windows.Foundation.Collections.IIterable<String> data);
        Windows.Foundation.Collections.IVectorView <String> GetAsVectorView();

        [contract(MachineLearningContract, 2)]
        {
            //! Creates a tensor object, allocates a buffer of size 'shape', and copies all of 'data' into it.
            static TensorString CreateFromShapeArrayAndDataArray(Int64[] shape, String[] data);
        }
    }

    [contract(MachineLearningContract, 1)]
    INBOX_ONLY([static_name("Windows.AI.MachineLearning.IImageFeatureValueStatics", 1bc317fd-23cb-4610-b085-c8e1c87ebaa0)])
    INBOX_ONLY([interface_name("Windows.AI.MachineLearning.IImageFeatureValue", f0414fd9-c9aa-4405-b7fb-94f87c8a3037)])
    [threading(both)]
    [marshaling_behavior(agile)]
    [dualapipartition(1)]
    runtimeclass ImageFeatureValue : ILearningModelFeatureValue
    {
        static ImageFeatureValue CreateFromVideoFrame(Windows.Media.VideoFrame image);
        Windows.Media.VideoFrame VideoFrame{ get; };
    }
}
