public void TestProductMatchRunner() { var cfg = new DefaultProductMatchConfig(); var pmr = new ProductMatchRunner(cfg); var pid = VMDPIDFactory.GetVmdPid(PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.PersistentPid).Result; var ap = new SoldProduct { TargetSpecies = new[] { "cattle" }, Product = new Product { Name = "metacam" }, ActionDate = DateTime.Now }; var res = pmr.GetMatch(ap, pid.RealProducts); Assert.IsNotNull(res); Assert.IsTrue(res.ReferenceProduct.Name.StartsWith("metacam", StringComparison.InvariantCultureIgnoreCase)); Assert.IsTrue(res.ReferenceProduct.TargetSpecies.Any(ts => ts.Equals("cattle", StringComparison.InvariantCultureIgnoreCase))); }
public double Evaluate(IChromosome chromosome) { var correctCount = 0; var pid = VMDPIDFactory.GetVmdPid( PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.PersistentPid ).Result; var cfg = (FloatingPointChromosome)chromosome; var threshold = cfg.ToFloatingPoints()[3]; var pmr = new ProductMatchRunner(cfg.GetMatchConfig()); var toMatch = new ConcurrentDictionary <string, string[]>(TruthFactory.GetTruth()); Parallel.ForEach(toMatch, tm => { var ap = new ActionedProduct { Product = new Product { Name = tm.Key }, TargetSpecies = new[] { "cattle" } }; ReferenceProduct[] rp; lock (pid) { rp = pid.RealProducts.ToArray(); } var res = pmr.GetMatch(ap, rp); if ((tm.Value.Contains(res.ReferenceProduct.VMNo) && res.ProductNameSimilarity > threshold) || (tm.Value.All(string.IsNullOrEmpty) && res.ProductNameSimilarity < threshold) ) { Interlocked.Increment(ref correctCount); } }); return((double)correctCount / toMatch.Count); }
private static void Main(string[] args) { if (args.Length > 0 && File.Exists(args[0])) { var sb = new StringBuilder("\"Input Name\",\"Matched Name\",\"VM Number\",\"Similarity Score\"" + Environment.NewLine); var pid = VMDPIDFactory.GetVmdPid(PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.PersistentPid).Result; var cfg = new DefaultProductMatchConfig(); var pmr = new ProductMatchRunner(cfg); var sw = Stopwatch.StartNew(); var inputStrings = new BlockingCollection <string>(); using (var fs = File.OpenText(args[0])) { while (!fs.EndOfStream) { inputStrings.Add(fs.ReadLine()?.ToLowerInvariant().Trim()); } } sw.Restart(); Parallel.ForEach(inputStrings.Where(s => !string.IsNullOrEmpty(s)), inputString => { var ap = new SoldProduct { TargetSpecies = new[] { "cattle" }, Product = new Product { Name = inputString }, ActionDate = DateTime.Now }; var res = pmr.GetMatch(ap, pid.RealProducts); lock (sb) { sb.AppendJoin(',', $"\"{res.InputProduct.Product.Name}\"", $"\"{res.ReferenceProduct.Name}\"", $"\"{res.ReferenceProduct.VMNo}\"", res.ProductNameSimilarity.ToString(CultureInfo.InvariantCulture), Environment.NewLine); } }); Console.WriteLine(sb.ToString()); } else if (args.Length > 0 && args[0].Equals("print", StringComparison.InvariantCultureIgnoreCase)) { var propName = args[1]; var pidProperties = typeof(VMDPID).GetProperties(); try { var prop = pidProperties.Single( p => p.Name.Equals(propName, StringComparison.InvariantCultureIgnoreCase)); var pid = VMDPIDFactory.GetVmdPid(PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.PersistentPid).Result; var values = (IEnumerable <string>)prop.GetValue(pid); foreach (var value in values.Distinct().OrderBy(s => s)) { Console.WriteLine(value); } } catch (Exception) { Console.WriteLine($"Property {propName} not found in VMDPID"); } } else if (args.Length > 1 && args[0].Equals("explainmatch")) { var pid = VMDPIDFactory.GetVmdPid(PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.PersistentPid).Result; var cfg = new DefaultProductMatchConfig(); var pmr = new ProductMatchRunner(cfg); var name = args[1]; var ap = new ActionedProduct { Product = new Product { Name = name }, }; var refprod = pid.AllProducts.Single(p => p.VMNo.Equals(args[2])); var foo = ap.GetMatchingResult(refprod, cfg); Console.WriteLine(foo); } else if (args.Length > 2 && args[0].Equals("explain")) { var pid = VMDPIDFactory.GetVmdPid(PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.PersistentPid).Result; var cfg = new DefaultProductMatchConfig(); var pmr = new ProductMatchRunner(cfg); var species = args[2].Split(','); var name = args[1]; var ap = new ActionedProduct { Product = new Product { Name = name }, TargetSpecies = species }; var mr = pmr.GetMatchResults(ap, pid.RealProducts).ToArray(); var dc = pmr.GetDisambiguationCandidates(mr).ToArray(); var res = pmr.GetMatch(ap, pid.RealProducts); Console.WriteLine("Matched product:"); Console.WriteLine(string.Join('\t', res.ReferenceProduct.Name, res.ReferenceProduct.VMNo, res.ProductNameSimilarity.ToString(CultureInfo.InvariantCulture))); Console.WriteLine(); Console.WriteLine("All products:"); foreach (var matchResult in mr) { Console.WriteLine(string.Join('\t', matchResult.ReferenceProduct.Name, matchResult.ReferenceProduct.VMNo, matchResult.ProductNameSimilarity.ToString(CultureInfo.InvariantCulture))); } Console.WriteLine(); Console.WriteLine("Disambiguation Candidates:"); foreach (var productSimilarityResult in dc) { Console.WriteLine(string.Join('\t', productSimilarityResult.ReferenceProduct.Name, productSimilarityResult.ReferenceProduct.VMNo, productSimilarityResult.ProductNameSimilarity.ToString(CultureInfo.InvariantCulture))); } var disambiguationConfig = ((HierarchicalFilterWithRandomFinalSelect)cfg.Disambiguator)._cfg; foreach (var disambiguationFilter in disambiguationConfig.Filters) { Console.WriteLine($"Filter: {disambiguationFilter.GetType().Name}"); foreach (var filterResult in disambiguationFilter.FilterResults(dc)) { Console.WriteLine(string.Join('\t', filterResult.ReferenceProduct.Name, filterResult.ReferenceProduct.VMNo, filterResult.ProductNameSimilarity.ToString(CultureInfo.InvariantCulture))); } } } else if (args.Length > 1 && args[0].Equals("optimise", StringComparison.InvariantCultureIgnoreCase)) { TruthFactory.SetPath(args[1]); var pid = VMDPIDFactory.GetVmdPid( PidFactoryOptions.GetTargetSpeciesForExpiredEmaProduct | PidFactoryOptions.GetTargetSpeciesForExpiredVmdProduct | PidFactoryOptions.PersistentPid ).Result; var ga = GaRunner.GetGeneticAlgorithm(); Console.WriteLine("Generation, ABWeightRatio, AWeight, BWeight, Threshold, SuccessRate"); var latestFitness = 0.0; ga.GenerationRan += (sender, e) => { var bestChromosome = ga.BestChromosome as FloatingPointChromosome; var bestFitness = bestChromosome.Fitness.Value; if (bestFitness != latestFitness) { latestFitness = bestFitness; var phenotype = bestChromosome.ToFloatingPoints(); Console.WriteLine( "{0,2},{1},{2},{3},{4},{5}", ga.GenerationsNumber, phenotype[0], phenotype[1], phenotype[2], phenotype[3], bestFitness ); } }; ga.Start(); } else { Console.WriteLine("Requires path to file to process as first argument."); Console.ReadLine(); } }