public ActionResult Validate() { try { APIUtil.Authenticate(this.Request); if (this.metaData == null || lastDownload + TimeSpan.FromMinutes(1) < DateTime.Now) { var url = APIUtil.GetSettingsUrl(); this.metaData = ApplicationMetadataUtil.DownloadMetadata <ApplicationClientMetadata>(url); lastDownload = DateTime.Now; } var context = APIUtil.ReadBody(this.Request); using (var vw = new VowpalWabbit(new VowpalWabbitSettings(metaData.TrainArguments) { EnableStringExampleGeneration = true, EnableStringFloatCompact = true })) using (var serializer = new VowpalWabbitJsonSerializer(vw)) using (var example = serializer.ParseAndCreate(context)) { return(Json(new { VWExample = example.VowpalWabbitString })); } } catch (UnauthorizedAccessException ex) { return(new HttpStatusCodeResult(HttpStatusCode.Unauthorized, ex.Message)); } catch (Exception ex) { new TelemetryClient().TrackException(ex); return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError, ex.ToString())); } }
private CollectiveSettingsView CreateCollectiveSettings(ApplicationClientMetadata clientMetadata, ApplicationExtraMetadata extraMetadata, string uniqueStringInUrl) { var svm = new CollectiveSettingsView { AzureSubscriptionId = extraMetadata.SubscriptionId, DecisionType = extraMetadata.DecisionType == DecisionType.SingleAction ? DecisionDisplayType.No : DecisionDisplayType.Yes, TrainArguments = clientMetadata.TrainArguments, AzureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString], AzureResourceGroupName = extraMetadata.AzureResourceGroupName, ApplicationInsightsInstrumentationKey = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKAppInsightsKey], OnlineTrainerAddress = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKTrainerURL], WebApiAddress = $"https://{extraMetadata.AzureResourceGroupName}-webapi-{uniqueStringInUrl}.azurewebsites.net", ASAEvalName = extraMetadata.AzureResourceGroupName + "-eval", ASAJoinName = extraMetadata.AzureResourceGroupName + "-join", EventHubInteractionConnectionString = clientMetadata.EventHubInteractionConnectionString, EventHubObservationConnectionString = clientMetadata.EventHubObservationConnectionString, ExperimentalUnitDuration = extraMetadata.ExperimentalUnitDuration, SelectedModelId = new SettingBlobListViewModel { Items = new List <BlobModelViewModel>() { new BlobModelViewModel { Name = ApplicationSettingConstants.UseLatestModelSetting } }, SelectedItem = extraMetadata.ModelId }, IsExplorationEnabled = clientMetadata.IsExplorationEnabled, InitialExplorationEpsilon = clientMetadata.InitialExplorationEpsilon, SettingsBlobUri = extraMetadata.SettingsTokenUri1 }; return(svm); }
public async Task<HttpResponseMessage> Post() { var header = this.Request.Headers.SingleOrDefault(x => x.Key == "Authorization"); if (header.Value == null) throw new UnauthorizedAccessException("AuthorizationToken missing"); var userToken = header.Value.First(); if (string.IsNullOrWhiteSpace(userToken) || userToken != ConfigurationManager.AppSettings["UserToken"]) return Request.CreateResponse(HttpStatusCode.Unauthorized); if (this.metaData == null || lastDownload + TimeSpan.FromMinutes(1) < DateTime.Now) { var url = ConfigurationManager.AppSettings["DecisionServiceSettingsUrl"]; this.metaData = ApplicationMetadataUtil.DownloadMetadata<ApplicationClientMetadata>(url); lastDownload = DateTime.Now; } using (var vw = new VowpalWabbit(new VowpalWabbitSettings(metaData.TrainArguments) { EnableStringExampleGeneration = true, EnableStringFloatCompact = true })) using (var serializer = new VowpalWabbitJsonSerializer(vw)) using (var example = serializer.ParseAndCreate(new JsonTextReader(new StreamReader(await Request.Content.ReadAsStreamAsync())))) { return Request.CreateResponse(HttpStatusCode.OK, example.VowpalWabbitString); } }
public async Task <HttpResponseMessage> Post() { var header = this.Request.Headers.SingleOrDefault(x => x.Key == "Authorization"); if (header.Value == null) { throw new UnauthorizedAccessException("AuthorizationToken missing"); } var userToken = header.Value.First(); if (string.IsNullOrWhiteSpace(userToken) || userToken != ConfigurationManager.AppSettings["UserToken"]) { return(Request.CreateResponse(HttpStatusCode.Unauthorized)); } if (this.metaData == null || lastDownload + TimeSpan.FromMinutes(1) < DateTime.Now) { var url = ConfigurationManager.AppSettings["DecisionServiceSettingsUrl"]; this.metaData = ApplicationMetadataUtil.DownloadMetadata <ApplicationClientMetadata>(url); lastDownload = DateTime.Now; } using (var vw = new VowpalWabbit(new VowpalWabbitSettings(metaData.TrainArguments) { EnableStringExampleGeneration = true, EnableStringFloatCompact = true })) using (var serializer = new VowpalWabbitJsonSerializer(vw)) using (var example = serializer.ParseAndCreate(new JsonTextReader(new StreamReader(await Request.Content.ReadAsStreamAsync())))) { return(Request.CreateResponse(HttpStatusCode.OK, example.VowpalWabbitString)); } }
public async Task UpdateSettings(string trainArguments = null, float?initialExplorationEpsilon = null, bool?isExplorationEnabled = null) { var token = Request.Headers["auth"]; if (token != ConfigurationManager.AppSettings[ApplicationMetadataStore.AKPassword]) { throw new UnauthorizedAccessException(); } var telemetry = new TelemetryClient(); try { telemetry.TrackTrace($"UpdateSettings(trainArguments={trainArguments}, initialExplorationEpsilon={initialExplorationEpsilon}, isExplorationEnabled={isExplorationEnabled})"); string azureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString]; var storageAccount = CloudStorageAccount.Parse(azureStorageConnectionString); var blobClient = storageAccount.CreateCloudBlobClient(); var settingsBlobContainer = blobClient.GetContainerReference(ApplicationBlobConstants.SettingsContainerName); var blob = settingsBlobContainer.GetBlockBlobReference(ApplicationBlobConstants.LatestClientSettingsBlobName); ApplicationClientMetadata clientMeta; if (await blob.ExistsAsync()) { clientMeta = JsonConvert.DeserializeObject <ApplicationClientMetadata>(await blob.DownloadTextAsync()); } else { clientMeta = new ApplicationClientMetadata(); } if (trainArguments != null) { clientMeta.TrainArguments = trainArguments; } if (initialExplorationEpsilon != null) { clientMeta.InitialExplorationEpsilon = (float)initialExplorationEpsilon; } if (isExplorationEnabled != null) { clientMeta.IsExplorationEnabled = (bool)isExplorationEnabled; } await blob.UploadTextAsync(JsonConvert.SerializeObject(clientMeta)); } catch (Exception e) { telemetry.TrackException(e); } }
public byte[] GetSettingsBlobContent(string vwArgs, float initialExplorationEpsilon) { var metadata = new ApplicationClientMetadata { ApplicationID = TestAppID, IsExplorationEnabled = true, ModelBlobUri = this.localAzureModelBlobUri, InitialExplorationEpsilon = initialExplorationEpsilon, TrainArguments = vwArgs }; return(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(metadata))); }
private List <SettingItemViewModel> SettingsView() { var clientSettingsBlob = (CloudBlockBlob)Session[SKClientSettingsBlob]; ApplicationClientMetadata clientApp = JsonConvert.DeserializeObject <ApplicationClientMetadata>(clientSettingsBlob.DownloadText()); Session[SKClientSettings] = clientApp; var extraSettingsBlob = (CloudBlockBlob)Session[SKExtraSettingsBlob]; ApplicationExtraMetadata extraApp = JsonConvert.DeserializeObject <ApplicationExtraMetadata>(extraSettingsBlob.DownloadText()); Session[SKExtraSettings] = extraApp; return(CreateAppView(clientApp, extraApp)); }
public void TestSingleActionOfflineModeCustomLogger() { var dsConfig = new DecisionServiceConfiguration("") { OfflineMode = true, OfflineApplicationID = "" }; var metaData = new ApplicationClientMetadata { TrainArguments = "--cb_explore_adf --epsilon 0.3", InitialExplorationEpsilon = 1f }; var recorder = new TestLogger(); int numChooseAction = 100; using (var ds = DecisionService.Create <TestContext>(dsConfig, metaData: metaData) .WithRecorder(recorder) .ExploitUntilModelReady(new ConstantPolicy <TestContext>())) { for (int i = 0; i < numChooseAction; i++) { ds.ChooseAction(i.ToString(), new TestContext()); } Assert.AreEqual(numChooseAction, recorder.NumRecord); int numReward = 200; for (int i = 0; i < numReward; i++) { ds.ReportReward(i, i.ToString()); } Assert.AreEqual(numReward, recorder.NumReward); int numOutcome = 300; for (int i = 0; i < numOutcome; i++) { ds.ReportOutcome(i.ToString(), i.ToString()); } Assert.AreEqual(numOutcome, recorder.NumOutcome); } Assert.AreEqual(0, recorder.NumRecord); Assert.AreEqual(0, recorder.NumReward); Assert.AreEqual(0, recorder.NumOutcome); }
public async Task <ActionResult> Offline(string startTimeInclusive, string endTimeExclusive, string dataFormat = "json") { var token = Request.Headers["auth"]; if (token != ConfigurationManager.AppSettings[ApplicationMetadataStore.AKPassword]) { throw new UnauthorizedAccessException(); } var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString]); var blobClient = storageAccount.CreateCloudBlobClient(); StreamWriter responseWriter = null; switch (dataFormat) { case "json": responseWriter = new StreamWriter(Response.OutputStream, Encoding.UTF8); break; case "vw": var settingsBlobContainer = blobClient.GetContainerReference(ApplicationBlobConstants.SettingsContainerName); var blob = settingsBlobContainer.GetBlockBlobReference(ApplicationBlobConstants.LatestClientSettingsBlobName); if (!await blob.ExistsAsync()) { return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "Application settings blob not found.")); } ApplicationClientMetadata clientMeta = JsonConvert.DeserializeObject <ApplicationClientMetadata>(await blob.DownloadTextAsync()); responseWriter = new VowpalWabbitStreamWriter(Response.OutputStream, Encoding.UTF8, clientMeta.TrainArguments); break; default: return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Unrecognized data format.")); } using (responseWriter) { await AzureBlobDownloader.Download( storageAccount, DateTime.ParseExact(startTimeInclusive, "yyyyMMddHHmm", System.Globalization.CultureInfo.InvariantCulture), DateTime.ParseExact(endTimeExclusive, "yyyyMMddHHmm", System.Globalization.CultureInfo.InvariantCulture), responseWriter).ConfigureAwait(false); } return(new HttpStatusCodeResult(HttpStatusCode.OK)); }
public void TestMultiActionOfflineModeArgument() { var metaData = new ApplicationClientMetadata { TrainArguments = "--cb_explore_adf --epsilon 0.3", InitialExplorationEpsilon = 1f }; using (var ds = DecisionService.CreateJson( new DecisionServiceConfiguration("") { OfflineMode = true, OfflineApplicationID = "" }, metaData)) { ds.ChooseAction("", "{}"); } }
public async Task InitialFullExplorationTest() { var recorder = new MyRecorder(); using (var model = new MemoryStream()) { using (var vw = new VowpalWabbit("--cb_explore_adf --epsilon 0.3")) { vw.Learn(new[] { "1:-3:0.2 | b:2" }); vw.ID = "123"; vw.SaveModel(model); } var config = new DecisionServiceConfiguration("") { OfflineMode = true, OfflineApplicationID = "", DevelopmentMode = true }; var metaData = new ApplicationClientMetadata { TrainArguments = "--cb_explore_adf --epsilon 0.3", InitialExplorationEpsilon = 1f }; using (var ds = DecisionService.CreateJson(config, metaData: metaData).WithRecorder(recorder)) { var decision = await ds.ChooseRankingAsync("abc", "{\"a\":1,\"_multi\":[{\"b\":2}]}"); // since there's not a model loaded why should get 100% exploration // Assert.AreEqual(1f, recorder.LastExplorerState.Probability); model.Position = 0; ds.UpdateModel(model); decision = await ds.ChooseRankingAsync("abc", "{\"a\":1,\"_multi\":[{\"b\":2}, {\"b\":3}]}"); // Assert.AreNotEqual(1f, recorder.LastExplorerState.Probability); var vwState = recorder.LastMapperState as VWState; Assert.IsNotNull(vwState); Assert.AreEqual("123", vwState.ModelId); } } }
public async Task UpdateSettings(string trainArguments = null, float? initialExplorationEpsilon = null, bool? isExplorationEnabled = null) { var token = Request.Headers["Authorization"]; if (token != ConfigurationManager.AppSettings[ApplicationMetadataStore.AKPassword]) throw new UnauthorizedAccessException(); var telemetry = new TelemetryClient(); try { telemetry.TrackTrace($"UpdateSettings(trainArguments={trainArguments}, initialExplorationEpsilon={initialExplorationEpsilon}, isExplorationEnabled={isExplorationEnabled})"); string azureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString]; var storageAccount = CloudStorageAccount.Parse(azureStorageConnectionString); var blobClient = storageAccount.CreateCloudBlobClient(); var settingsBlobContainer = blobClient.GetContainerReference(ApplicationBlobConstants.SettingsContainerName); var blob = settingsBlobContainer.GetBlockBlobReference(ApplicationBlobConstants.LatestClientSettingsBlobName); ApplicationClientMetadata clientMeta; if (await blob.ExistsAsync()) clientMeta = JsonConvert.DeserializeObject<ApplicationClientMetadata>(await blob.DownloadTextAsync()); else clientMeta = new ApplicationClientMetadata(); if (trainArguments != null) clientMeta.TrainArguments = trainArguments; if (initialExplorationEpsilon != null) clientMeta.InitialExplorationEpsilon = (float)initialExplorationEpsilon; if (isExplorationEnabled != null) clientMeta.IsExplorationEnabled = (bool)isExplorationEnabled; await blob.UploadTextAsync(JsonConvert.SerializeObject(clientMeta)); } catch (Exception e) { telemetry.TrackException(e); } }
public void TestSingleActionOfflineModeArgument() { var dsConfig = new DecisionServiceConfiguration("") { OfflineMode = true, OfflineApplicationID = "" }; try { var metaData = new ApplicationClientMetadata { TrainArguments = "--cb_explore_adf --epsilon 0.3", InitialExplorationEpsilon = 1f }; using (var ds = DecisionService.Create <TestContext>(dsConfig, metaData: metaData)) { } } catch (ArgumentException ex) { Assert.AreEqual("Recorder", ex.ParamName); } }
private List <SettingItemViewModel> CreateAppView( ApplicationClientMetadata clientMetadata, ApplicationExtraMetadata extraMetadata) { string uniqueStringInUrl = Regex.Match(Request.Url.ToString(), ".*mc-(.*).azurewebsites.*").Groups[1].Value; CollectiveSettingsView svm = CreateCollectiveSettings(clientMetadata, extraMetadata, uniqueStringInUrl); string azureStorageName = Regex.Match(svm.AzureStorageConnectionString, ".*AccountName=(.*);AccountKey.*").Groups[1].Value; var nameToValue = svm.GetType().GetProperties() .Select(p => new { Name = p.Name, Value = p.GetValue(svm) }); var nameToHelpText = typeof(HelpText).GetProperties() .Where(p => p.PropertyType == typeof(string)) .Select(p => new { HelpText = ((string)p.GetValue(null)).Split(new string[] { " ::: " }, StringSplitOptions.RemoveEmptyEntries).ToList(), Name = p.Name }); var nameToUrl = new[] { new { Name = nameof(svm.AzureResourceGroupName), Tooltip = "View Azure Resource Group", Url = $"https://ms.portal.azure.com/#asset/HubsExtension/ResourceGroups/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}" }, new { Name = nameof(svm.AzureStorageConnectionString), Tooltip = "View Data", Url = $"https://ms.portal.azure.com/#blade/Microsoft_Azure_Storage/ContainersBlade/storageAccountId/%2Fsubscriptions%2F{svm.AzureSubscriptionId}%2FresourceGroups%2F{svm.AzureResourceGroupName}%2Fproviders%2FMicrosoft.Storage%2FstorageAccounts%2F{azureStorageName}" }, new { Name = nameof(svm.ApplicationInsightsInstrumentationKey), Tooltip = "View Application Logs", Url = $"https://ms.portal.azure.com/#blade/AppInsightsExtension/SearchBlade/ComponentId/%7B%22SubscriptionId%22%3A%22{svm.AzureSubscriptionId}%22%2C%22ResourceGroup%22%3A%22{svm.AzureResourceGroupName}%22%2C%22Name%22%3A%22{svm.AzureResourceGroupName}-appinsights-{uniqueStringInUrl}%22%7D/InitialFilter/%7B%22eventTypes%22%3A%5B4%2C1%2C3%2C5%2C2%2C6%5D%2C%22typeFacets%22%3A%7B%7D%2C%22isPermissive%22%3Afalse%7D/InitialTime/%7B%22durationMs%22%3A43200000%2C%22endTime%22%3Anull%2C%22isInitialTime%22%3Atrue%2C%22grain%22%3A1%7D/InitialQueryText//ConfigurationId/blankSearch%3A" }, new { Name = nameof(svm.ASAJoinName), Tooltip = "View ASA Join Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAJoinName}" }, new { Name = nameof(svm.ASAEvalName), Tooltip = "View ASA Policy Evaluation Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAEvalName}" }, new { Name = nameof(svm.OnlineTrainerAddress), Tooltip = "Configure Online Trainer", Url = $"https://manage.windowsazure.com/microsoft.onmicrosoft.com#Workspaces/CloudServicesExtension/CloudService/{svm.OnlineTrainerAddress}/configure" } }; var nameToEditable = new[] { new { Name = nameof(svm.TrainArguments), IsEditable = true }, new { Name = nameof(svm.IsExplorationEnabled), IsEditable = true }, new { Name = nameof(svm.InitialExplorationEpsilon), IsEditable = true }, new { Name = nameof(svm.SelectedModelId), IsEditable = true } }; var nameToSpotLightUrl = new[] { new { Name = nameof(svm.AzureResourceGroupName), IsSplotlightUrl = true } }; var nameToResettable = new[] { new { Name = nameof(svm.OnlineTrainerAddress), Resettable = true } }; var settingItems = from nv in nameToValue from nht in nameToHelpText.Where(n => n.Name == nv.Name).DefaultIfEmpty() from nu in nameToUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty() from ne in nameToEditable.Where(n => n.Name == nv.Name).DefaultIfEmpty() from nsl in nameToSpotLightUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty() from nrs in nameToResettable.Where(n => n.Name == nv.Name).DefaultIfEmpty() select new SettingItemViewModel { Value = nv.Value, DisplayName = nht?.HelpText[0], HelpText = nht?.HelpText[1], IsEditable = ne?.IsEditable, Name = nv.Name, Url = nu?.Url, UrlToolTip = nu?.Tooltip, IsSplotlightUrl = nsl?.IsSplotlightUrl, IsResettable = nrs?.Resettable }; return(settingItems.ToList()); }
private List<SettingItemViewModel> CreateAppView( ApplicationClientMetadata clientMetadata, ApplicationExtraMetadata extraMetadata) { string uniqueStringInUrl = Regex.Match(Request.Url.ToString(), ".*mc-(.*).azurewebsites.*").Groups[1].Value; CollectiveSettingsView svm = CreateCollectiveSettings(clientMetadata, extraMetadata, uniqueStringInUrl); string azureStorageName = Regex.Match(svm.AzureStorageConnectionString, ".*AccountName=(.*);AccountKey.*").Groups[1].Value; var nameToValue = svm.GetType().GetProperties() .Select(p => new { Name = p.Name, Value = p.GetValue(svm) }); var nameToHelpText = typeof(HelpText).GetProperties() .Where(p => p.PropertyType == typeof(string)) .Select(p => new { HelpText = ((string)p.GetValue(null)).Split(new string[] { " ::: " }, StringSplitOptions.RemoveEmptyEntries).ToList(), Name = p.Name }); var nameToUrl = new[] { new { Name = nameof(svm.AzureResourceGroupName), Tooltip = "View Azure Resource Group", Url = $"https://ms.portal.azure.com/#asset/HubsExtension/ResourceGroups/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}"}, new { Name = nameof(svm.AzureStorageConnectionString), Tooltip = "View Data", Url = $"https://ms.portal.azure.com/#blade/Microsoft_Azure_Storage/ContainersBlade/storageAccountId/%2Fsubscriptions%2F{svm.AzureSubscriptionId}%2FresourceGroups%2F{svm.AzureResourceGroupName}%2Fproviders%2FMicrosoft.Storage%2FstorageAccounts%2F{azureStorageName}"}, new { Name = nameof(svm.ApplicationInsightsInstrumentationKey), Tooltip = "View Application Logs", Url = $"https://ms.portal.azure.com/#blade/AppInsightsExtension/SearchBlade/ComponentId/%7B%22SubscriptionId%22%3A%22{svm.AzureSubscriptionId}%22%2C%22ResourceGroup%22%3A%22{svm.AzureResourceGroupName}%22%2C%22Name%22%3A%22{svm.AzureResourceGroupName}-appinsights-{uniqueStringInUrl}%22%7D/InitialFilter/%7B%22eventTypes%22%3A%5B4%2C1%2C3%2C5%2C2%2C6%5D%2C%22typeFacets%22%3A%7B%7D%2C%22isPermissive%22%3Afalse%7D/InitialTime/%7B%22durationMs%22%3A43200000%2C%22endTime%22%3Anull%2C%22isInitialTime%22%3Atrue%2C%22grain%22%3A1%7D/InitialQueryText//ConfigurationId/blankSearch%3A"}, new { Name = nameof(svm.ASAJoinName), Tooltip = "View ASA Join Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAJoinName}"}, new { Name = nameof(svm.ASAEvalName), Tooltip = "View ASA Policy Evaluation Query", Url = $"https://ms.portal.azure.com/#resource/subscriptions/{svm.AzureSubscriptionId}/resourceGroups/{svm.AzureResourceGroupName}/providers/Microsoft.StreamAnalytics/streamingjobs/{svm.ASAEvalName}"}, new { Name = nameof(svm.OnlineTrainerAddress), Tooltip = "Configure Online Trainer", Url = $"https://manage.windowsazure.com/microsoft.onmicrosoft.com#Workspaces/CloudServicesExtension/CloudService/{svm.OnlineTrainerAddress}/configure"} }; var nameToEditable = new[] { new { Name = nameof(svm.TrainArguments), IsEditable = true }, new { Name = nameof(svm.IsExplorationEnabled), IsEditable = true }, new { Name = nameof(svm.InitialExplorationEpsilon), IsEditable = true }, new { Name = nameof(svm.SelectedModelId), IsEditable = true } }; var nameToSpotLightUrl = new[] { new { Name = nameof(svm.AzureResourceGroupName), IsSplotlightUrl = true } }; var nameToResettable = new[] { new { Name = nameof(svm.OnlineTrainerAddress), Resettable = true } }; var settingItems = from nv in nameToValue from nht in nameToHelpText.Where(n => n.Name == nv.Name).DefaultIfEmpty() from nu in nameToUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty() from ne in nameToEditable.Where(n => n.Name == nv.Name).DefaultIfEmpty() from nsl in nameToSpotLightUrl.Where(n => n.Name == nv.Name).DefaultIfEmpty() from nrs in nameToResettable.Where(n => n.Name == nv.Name).DefaultIfEmpty() select new SettingItemViewModel { Value = nv.Value, DisplayName = nht?.HelpText[0], HelpText = nht?.HelpText[1], IsEditable = ne?.IsEditable, Name = nv.Name, Url = nu?.Url, UrlToolTip = nu?.Tooltip, IsSplotlightUrl = nsl?.IsSplotlightUrl, IsResettable = nrs?.Resettable }; return settingItems.ToList(); }
public static DecisionServiceClient <string> CreateJson(DecisionServiceConfiguration config, ApplicationClientMetadata metaData = null) { return(new DecisionServiceClient <string>( config, DownloadMetadata(config, metaData), new VWJsonExplorer(config.ModelStream, config.DevelopmentMode))); }
public static DecisionServiceClient <TContext> Create <TContext>(DecisionServiceConfiguration config, ITypeInspector typeInspector = null, ApplicationClientMetadata metaData = null) { return(new DecisionServiceClient <TContext>( config, DownloadMetadata(config, metaData), new VWExplorer <TContext>(config.ModelStream, typeInspector, config.DevelopmentMode))); }
private static ApplicationClientMetadata DownloadMetadata(DecisionServiceConfiguration config, ApplicationClientMetadata metaData) { if (!config.OfflineMode || metaData == null) { metaData = ApplicationMetadataUtil.DownloadMetadata <ApplicationClientMetadata>(config.SettingsBlobUri); if (config.LogAppInsights) { Trace.Listeners.Add(new ApplicationInsights.TraceListener.ApplicationInsightsTraceListener(metaData.AppInsightsKey)); } } return(metaData); }
private CollectiveSettingsView CreateCollectiveSettings(ApplicationClientMetadata clientMetadata, ApplicationExtraMetadata extraMetadata, string uniqueStringInUrl) { var svm = new CollectiveSettingsView { ApplicationId = clientMetadata.ApplicationID, AzureSubscriptionId = extraMetadata.SubscriptionId, DecisionType = extraMetadata.DecisionType, TrainFrequency = extraMetadata.TrainFrequency, TrainArguments = clientMetadata.TrainArguments, AzureStorageConnectionString = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKConnectionString], AzureResourceGroupName = extraMetadata.AzureResourceGroupName, ApplicationInsightsInstrumentationKey = ConfigurationManager.AppSettings[ApplicationMetadataStore.AKAppInsightsKey], OnlineTrainerAddress = $"http://{extraMetadata.AzureResourceGroupName}-trainer-{uniqueStringInUrl}", WebApiAddress = $"https://{extraMetadata.AzureResourceGroupName}-webapi-{uniqueStringInUrl}.azurewebsites.net", ASAEvalName = extraMetadata.AzureResourceGroupName + "-eval", ASAJoinName = extraMetadata.AzureResourceGroupName + "-join", EventHubInteractionConnectionString = clientMetadata.EventHubInteractionConnectionString, EventHubObservationConnectionString = clientMetadata.EventHubObservationConnectionString, ExperimentalUnitDuration = extraMetadata.ExperimentalUnitDuration, SelectedModelId = new SettingBlobListViewModel { Items = new List<BlobModelViewModel>() { new BlobModelViewModel { Name = ApplicationSettingConstants.UseLatestModelSetting } }, SelectedItem = extraMetadata.ModelId }, IsExplorationEnabled = clientMetadata.IsExplorationEnabled, InitialExplorationEpsilon = clientMetadata.InitialExplorationEpsilon, SettingsBlobUri = extraMetadata.SettingsTokenUri1 }; return svm; }
public static DecisionServiceClient <TContext> Create <TContext>(DecisionServiceConfiguration config, IContextMapper <TContext, ActionProbability[]> contextMapper, ApplicationClientMetadata metaData = null) { return(new DecisionServiceClient <TContext>( config, DownloadMetadata(config, metaData), contextMapper, // TODO: cleanup. this means that the context mapper passed in needs to be able to score from the beginning contextMapper)); }
public DecisionServiceClient( DecisionServiceConfiguration config, ApplicationClientMetadata metaData, IContextMapper <TContext, ActionProbability[]> internalPolicy, IContextMapper <TContext, ActionProbability[]> initialPolicy = null, IFullExplorer <int[]> initialFullExplorer = null, IInitialExplorer <ActionProbability[], int[]> initialExplorer = null) { if (config == null) { throw new ArgumentNullException("config"); } if (config.InteractionUploadConfiguration == null) { config.InteractionUploadConfiguration = new JoinUploader.BatchingConfiguration(config.DevelopmentMode); } if (config.ObservationUploadConfiguration == null) { config.ObservationUploadConfiguration = new JoinUploader.BatchingConfiguration(config.DevelopmentMode); } this.config = config; string appId = string.Empty; this.metaData = metaData; if (config.OfflineMode) { this.recorder = new OfflineRecorder(); if (config.OfflineApplicationID == null) { throw new ArgumentNullException("OfflineApplicationID", "Offline Application ID must be set explicitly in offline mode."); } appId = config.OfflineApplicationID; } else { if (metaData == null) { throw new Exception("Unable to locate a registered MWT application."); } if (this.recorder == null) { var joinServerLogger = new JoinServiceLogger <TContext, int[]>(metaData.ApplicationID, config.DevelopmentMode); // TODO: check token remove switch (config.JoinServerType) { case JoinServerType.CustomSolution: joinServerLogger.InitializeWithCustomAzureJoinServer( config.LoggingServiceAddress, config.InteractionUploadConfiguration); break; case JoinServerType.AzureStreamAnalytics: default: joinServerLogger.InitializeWithAzureStreamAnalyticsJoinServer( metaData.EventHubInteractionConnectionString, metaData.EventHubObservationConnectionString, config.InteractionUploadConfiguration, config.ObservationUploadConfiguration); break; } this.recorder = (IRecorder <TContext, int[]>)joinServerLogger; } var settingsBlobPollDelay = config.PollingForSettingsPeriod == TimeSpan.Zero ? DecisionServiceConstants.PollDelay : config.PollingForSettingsPeriod; if (settingsBlobPollDelay != TimeSpan.MinValue) { this.settingsDownloader = new AzureBlobBackgroundDownloader(config.SettingsBlobUri, settingsBlobPollDelay, downloadImmediately: false, storageConnectionString: config.AzureStorageConnectionString); this.settingsDownloader.Downloaded += this.UpdateSettings; this.settingsDownloader.Failed += settingsDownloader_Failed; } var modelBlobPollDelay = config.PollingForModelPeriod == TimeSpan.Zero ? DecisionServiceConstants.PollDelay : config.PollingForModelPeriod; if (modelBlobPollDelay != TimeSpan.MinValue) { this.modelDownloader = new AzureBlobBackgroundDownloader(metaData.ModelBlobUri, modelBlobPollDelay, downloadImmediately: true, storageConnectionString: config.AzureStorageConnectionString); this.modelDownloader.Downloaded += this.UpdateContextMapper; this.modelDownloader.Failed += modelDownloader_Failed; } appId = metaData.ApplicationID; } this.logger = this.recorder as ILogger; this.internalPolicy = internalPolicy; this.initialPolicy = initialPolicy; if (initialExplorer != null && initialPolicy != null) { throw new Exception("Initial Explorer and Default Policy are both specified but only one can be used."); } var explorer = new GenericTopSlotExplorer(); // explorer used if model not ready and defaultAction provided if (initialExplorer == null) { initialExplorer = new EpsilonGreedyInitialExplorer(this.metaData.InitialExplorationEpsilon); } // explorer used if model not ready and no default action provided if (initialFullExplorer == null) { initialFullExplorer = new PermutationExplorer(1); } var match = Regex.Match(metaData.TrainArguments ?? string.Empty, @"--cb_explore\s+(?<numActions>\d+)"); if (match.Success) { var numActions = int.Parse(match.Groups["numActions"].Value); this.numActionsProvider = new ConstantNumActionsProvider(numActions); this.mwtExplorer = MwtExplorer.Create(appId, numActions, this.recorder, explorer, initialPolicy, initialFullExplorer, initialExplorer); } else { if (initialExplorer != null || metaData.InitialExplorationEpsilon == 1f) // only needed when full exploration { numActionsProvider = internalPolicy as INumberOfActionsProvider <TContext>; if (numActionsProvider == null) { numActionsProvider = explorer as INumberOfActionsProvider <TContext>; } if (numActionsProvider == null) { throw new ArgumentException("Explorer must implement INumberOfActionsProvider interface"); } } this.mwtExplorer = MwtExplorer.Create(appId, numActionsProvider, this.recorder, explorer, initialPolicy, initialFullExplorer, initialExplorer); } }