public async Task CreateAsyncAddsEntity() { var dbContext = ApplicationDbContextInMemoryFactory.InitializeContext(); var recommendationsRepository = new EfDeletableEntityRepository <Recommendation>(dbContext); var service = new RecommendationsService(recommendationsRepository); await service.CreateAsync("TestUser1", "TestUser8", "Recommendation"); Assert.Equal(1, recommendationsRepository.All().Count()); }
public static BrowseRecommendationsResults Run(Configuration config = null) { if (config == null) { Config = new Configuration(); } else { Config = config; } var stopwatch = System.Diagnostics.Stopwatch.StartNew(); results.Add($"Building test {Config.TestNumber} directories..."); if (!Directory.Exists(Configuration.BaseDirectory)) { Directory.CreateDirectory(Configuration.BaseDirectory); } if (!Directory.Exists($"{Configuration.BaseDirectory}/{Config.TestNumber}")) { Directory.CreateDirectory($"{Configuration.BaseDirectory}/{Config.TestNumber}"); } if (!Directory.Exists($"{Configuration.BaseDirectory}/dependencies")) { Directory.CreateDirectory($"{Configuration.BaseDirectory}/dependencies"); } if (!File.Exists(Config.AgentsFile)) { results.Add("Generating agents file..."); Generators.GenerateAgentsFile(Config); } if (!File.Exists(Config.SitesFile)) { results.Add("Generating sites file..."); Generators.GenerateSitesFile(Config); } if (!File.Exists(Config.InputFilePref) || !File.Exists(Config.InputFileRand)) { results.Add("Generating browse history files..."); Generators.GenerateNewBrowseFiles(Config); } var typesToProcess = new[] { "pref", "rand" }; foreach (var typeToProcess in typesToProcess) { Config.CurrentType = typeToProcess; results.Add($"Initializing {Config.CurrentType}..."); results.Add("Extracting test file..."); if (!File.Exists(Config.TestFile)) { //build test file from input var lines = File.ReadAllLines(Config.InputFile); var numberForTest = (lines.Length * Config.PercentOfDataIsTest); var linesToRemove = new List <int>(); using (StreamWriter w = File.AppendText(Config.TestFile)) { w.WriteLine("user_id,item_id,rating,timestamp,iteration".ToLower()); int recordsCopied = 0; while (recordsCopied < numberForTest) { var r = new Random(); var randomLineNumber = r.Next(1, lines.Length - 1); while (linesToRemove.Contains(randomLineNumber)) { randomLineNumber = r.Next(1, lines.Length - 1); } var line = lines[randomLineNumber]; w.WriteLine(line); linesToRemove.Add(randomLineNumber); recordsCopied++; } } //remove test data from input file if (File.Exists(Config.InputFile + ".backup")) { File.Delete(Config.InputFile + ".backup"); } File.Move(Config.InputFile, Config.InputFile + ".backup"); using (StreamWriter w = File.AppendText(Config.InputFile)) { w.WriteLine("user_id,item_id,rating,timestamp,iteration".ToLower()); int i = -1; foreach (var line in lines) { i++; if (i == 0 || linesToRemove.Contains(i)) { continue; } w.WriteLine(line); } } } MLContext mlContext = new MLContext(); (IDataView trainingDataView, IDataView testDataView) = LoadData(mlContext); Agents = new List <Agent>(); using (var fileStream = File.OpenRead(Config.AgentsFile)) { using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, 128)) { var i = -1; String line; while ((line = streamReader.ReadLine()) != null) { i++; if (i == 0) { continue; } var o = line.Split(Convert.ToChar(",")); Agents.Add(new Agent(Convert.ToInt32(o[0]), o[1], Convert.ToInt32(Convert.ToDouble(o[2])))); } } } Sites = new List <Site>(); using (var fileStream = File.OpenRead(Config.SitesFile)) { using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, 128)) { String line; while ((line = streamReader.ReadLine()) != null) { var o = line.Split(Convert.ToChar(",")); try { Sites.Add(new Site(Convert.ToInt32(o[0]), o[1])); } catch { } //lazy, don't @ me } } } results.Add($"Initializing model and associated requirements..."); if (!File.Exists(Config.ModelFile)) { ITransformer model = BuildAndTrainModel(mlContext, trainingDataView); EvaluateModel(mlContext, testDataView, model); UseModelForSinglePrediction(mlContext, model); SaveModel(mlContext, trainingDataView.Schema, model); } /* * results.Add("=============== Running Experiment ==============="); * var experimentSettings = new RecommendationExperimentSettings(); * experimentSettings.MaxExperimentTimeInSeconds = 3600; * experimentSettings.OptimizingMetric = RegressionMetric.MeanSquaredError; * var experiment = mlContext.Auto().CreateRecommendationExperiment(experimentSettings); * ExperimentResult<RegressionMetrics> experimentResult = mlContext.Auto() * .CreateRecommendationExperiment(new RecommendationExperimentSettings() { MaxExperimentTimeInSeconds = 3600 }) * .Execute(trainingDataView, testDataView, * new ColumnInformation() * { * LabelColumnName = "Label", * UserIdColumnName = "userId", * ItemIdColumnName = "itemId" * }); * // STEP 3: Print metric from best model * RunDetail<RegressionMetrics> bestRun = experimentResult.BestRun; * results.Add($"Total models produced: {experimentResult.RunDetails.Count()}"); * results.Add($"Best model's trainer: {bestRun.TrainerName}"); * results.Add($"Metrics of best model from validation data --"); * PrintMetrics(bestRun.ValidationMetrics); * Environment.Exit(1); */ //now that we have a model, we'll loop through that model x times - same model, growing dataset over iteration for (var i = 1; i < Config.Iterations; i++) { Config.CurrentIteration = i; //Define DataViewSchema for data preparation pipeline and trained model DataViewSchema modelSchema; // Load trained model var trainedModel = mlContext.Model.Load(Config.ModelFile, out modelSchema); // Load data preparation pipeline and trained model UseModelForSinglePrediction(mlContext, trainedModel); } results.Add("Generating final reports..."); Generators.GenerateReportFile(Config); results.Add($"{Config.CurrentType} completed in {stopwatch.ElapsedMilliseconds} ms"); } stopwatch.Stop(); results.Add($"Test completed in {stopwatch.ElapsedMilliseconds} ms"); //load result file var recommendations = RecommendationsService.Load(config.ResultFileOut); var browseRecommendationsResults = new BrowseRecommendationsResults { JobOutput = results, Recommendations = recommendations }; return(browseRecommendationsResults); }