File: Builder\BuilderExtensions.cs
Web Access
Project: src\src\Microsoft.Extensions.ML\Microsoft.Extensions.ML.csproj (Microsoft.Extensions.ML)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using Microsoft.Extensions.DependencyInjection;
 
namespace Microsoft.Extensions.ML
{
    /// <summary>
    /// Extension methods for <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
    /// </summary>
    public static class BuilderExtensions
    {
        /// <summary>
        /// Adds the model at the specified location to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="uri">The location of the model.</param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromUri<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string uri)
            where TData : class
            where TPrediction : class, new()
        {
            return builder.FromUri(string.Empty, new Uri(uri));
        }
 
        /// <summary>
        /// Adds the named model at the specified location to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="modelName">
        /// The name of the model which allows for uniquely identifying the model when
        /// multiple models have the same <typeparamref name="TData"/> and
        /// <typeparamref name="TPrediction"/> types.
        /// </param>
        /// <param name="uri">The location of the model.</param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromUri<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string modelName, string uri)
            where TData : class
            where TPrediction : class, new()
        {
            return builder.FromUri(modelName, new Uri(uri));
        }
 
        /// <summary>
        /// Adds the named model at the specified location to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="modelName">
        /// The name of the model which allows for uniquely identifying the model when
        /// multiple models have the same <typeparamref name="TData"/> and
        /// <typeparamref name="TPrediction"/> types.
        /// </param>
        /// <param name="uri">The location of the model.</param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromUri<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string modelName, Uri uri)
            where TData : class where TPrediction : class, new()
        {
            return builder.FromUri(modelName, uri, TimeSpan.FromMinutes(5));
        }
 
        /// <summary>
        /// Adds the model at the specified location to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="uri">The location of the model.</param>
        /// <param name="period">
        /// How often to query if the model has been updated at the specified location.
        /// </param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromUri<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string uri, TimeSpan period)
            where TData : class where TPrediction : class, new()
        {
            return builder.FromUri(string.Empty, new Uri(uri), period);
        }
 
        /// <summary>
        /// Adds the named model at the specified location to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="modelName">
        /// The name of the model which allows for uniquely identifying the model when
        /// multiple models have the same <typeparamref name="TData"/> and
        /// <typeparamref name="TPrediction"/> types.
        /// </param>
        /// <param name="uri">The location of the model.</param>
        /// <param name="period">
        /// How often to query if the model has been updated at the specified location.
        /// </param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromUri<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string modelName, string uri, TimeSpan period)
            where TData : class
            where TPrediction : class, new()
        {
            return builder.FromUri(modelName, new Uri(uri), period);
        }
 
        /// <summary>
        /// Adds the named model at the specified location to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="modelName">
        /// The name of the model which allows for uniquely identifying the model when
        /// multiple models have the same <typeparamref name="TData"/> and
        /// <typeparamref name="TPrediction"/> types.
        /// </param>
        /// <param name="uri">The location of the model.</param>
        /// <param name="period">
        /// How often to query if the model has been updated at the specified location.
        /// </param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromUri<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string modelName, Uri uri, TimeSpan period)
            where TData : class
            where TPrediction : class, new()
        {
            builder.Services.AddTransient<UriModelLoader, UriModelLoader>();
            builder.Services.AddOptions<PredictionEnginePoolOptions<TData, TPrediction>>(modelName)
                .Configure<UriModelLoader>((opt, loader) =>
                {
                    loader.Start(uri, period);
                    opt.ModelLoader = loader;
                });
            return builder;
        }
 
        /// <summary>
        /// Adds the model at the specified file to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="filePath">The location of the model.</param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromFile<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string filePath)
            where TData : class
            where TPrediction : class, new()
        {
            return builder.FromFile(string.Empty, filePath, true);
        }
 
        /// <summary>
        /// Adds the model at the specified file to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="filePath">The location of the model.</param>
        /// <param name="watchForChanges">
        /// Whether to watch for changes to the file path and update the model when the file is changed or not.
        /// </param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromFile<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string filePath, bool watchForChanges)
            where TData : class
            where TPrediction : class, new()
        {
            return builder.FromFile(string.Empty, filePath, watchForChanges);
        }
 
        /// <summary>
        /// Adds the model at the specified file to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="modelName">
        /// The name of the model which allows for uniquely identifying the model when
        /// multiple models have the same <typeparamref name="TData"/> and
        /// <typeparamref name="TPrediction"/> types.
        /// </param>
        /// <param name="filePath">The location of the model.</param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromFile<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string modelName, string filePath)
            where TData : class
            where TPrediction : class, new()
        {
            return builder.FromFile(modelName, filePath, true);
        }
 
        /// <summary>
        /// Adds the model at the specified file to the builder.
        /// </summary>
        /// <param name="builder">The builder to which to add the model.</param>
        /// <param name="modelName">
        /// The name of the model which allows for uniquely identifying the model when
        /// multiple models have the same <typeparamref name="TData"/> and
        /// <typeparamref name="TPrediction"/> types.
        /// </param>
        /// <param name="filePath">The location of the model.</param>
        /// <param name="watchForChanges">
        /// Whether to watch for changes to the file path and update the model when the file is changed or not.
        /// </param>
        /// <returns>
        /// The updated <see cref="PredictionEnginePoolBuilder{TData, TPrediction}"/>.
        /// </returns>
        public static PredictionEnginePoolBuilder<TData, TPrediction> FromFile<TData, TPrediction>(
            this PredictionEnginePoolBuilder<TData, TPrediction> builder, string modelName, string filePath, bool watchForChanges)
            where TData : class
            where TPrediction : class, new()
        {
            builder.Services.AddTransient<FileModelLoader, FileModelLoader>();
            builder.Services.AddOptions<PredictionEnginePoolOptions<TData, TPrediction>>(modelName)
                .Configure<FileModelLoader>((options, loader) =>
                {
                    loader.Start(filePath, watchForChanges);
                    options.ModelLoader = loader;
                });
            return builder;
        }
    }
}