public ProcessConfiguration GetConfiguration(PipelineContext context) { var pc = new ProcessConfiguration(); pc["Recommender"] = _recommender.GetType().Name; pc["TrainFile"] = context.GetAsString("TrainFile"); pc["TestFile"] = context.GetAsString("TestFile"); return(pc); }
public override void Setup() { try { // build recommender object Type mmlRecommenderType = Helpers.ResolveType(SetupParameters["ml-class"]); MmlRecommenderInstance = (IRecommender)mmlRecommenderType.GetConstructor(Type.EmptyTypes).Invoke(null); if (typeof(ITimeAwareRatingPredictor).IsAssignableFrom(mmlRecommenderType)) { DataType = DataType.TimeAwareRating; } else if (typeof(IRatingPredictor).IsAssignableFrom(mmlRecommenderType)) { DataType = DataType.Ratings; } else if (typeof(ItemRecommender).IsAssignableFrom(mmlRecommenderType)) { DataType = DataType.PosFeedback; } else { throw new WrapRecException(string.Format("Unknown MmlRecommender class: {0}", SetupParameters["ml-class"])); } // Set properties foreach (var param in SetupParameters.Where(kv => kv.Key != "ml-class" && kv.Key != "numGroups" && kv.Key != "ingoreFeatures")) { PropertyInfo pi = MmlRecommenderInstance.GetType().GetProperty(param.Key); // in case the value of attribute is empty ignore // empty attributes are only used for logging purposes if (string.IsNullOrEmpty(param.Value)) { continue; } object paramVal; if (pi.PropertyType.IsEnum) { paramVal = Enum.Parse(pi.PropertyType, param.Value); } else { paramVal = param.Value; } pi.SetValue(MmlRecommenderInstance, Convert.ChangeType(paramVal, pi.PropertyType)); } } catch (Exception ex) { throw new WrapRecException(string.Format("Cannot resolve MmlRecommender: {0}\n{1}", ex.Message, ex.StackTrace)); } }
/// <summary>Sets a property of a MyMediaLite recommender</summary> /// <param name="recommender">An <see cref="IRecommender"/></param> /// <param name="key">the name of the property (case insensitive)</param> /// <param name="val">the string representation of the value</param> public static void SetProperty(IRecommender recommender, string key, string val) { Type type = recommender.GetType(); var property_names = new List <string>(); foreach (var p in type.GetProperties()) { property_names.Add(p.Name); } property_names.Sort(); key = NormalizeName(key); foreach (string property_name in property_names) { if (NormalizeName(property_name).StartsWith(key)) { var property = type.GetProperty(property_name); if (property.GetSetMethod() == null) { throw new ArgumentException(string.Format("Parameter '{0}' has no setter", key)); } switch (property.PropertyType.ToString()) { case "System.Double": property.GetSetMethod().Invoke(recommender, new Object[] { double.Parse(val, CultureInfo.InvariantCulture) }); break; case "System.Single": property.GetSetMethod().Invoke(recommender, new Object[] { float.Parse(val, CultureInfo.InvariantCulture) }); break; case "System.Int32": property.GetSetMethod().Invoke(recommender, new Object[] { int.Parse(val) }); break; case "System.UInt32": property.GetSetMethod().Invoke(recommender, new Object[] { uint.Parse(val) }); break; case "System.Boolean": property.GetSetMethod().Invoke(recommender, new Object[] { bool.Parse(val) }); break; default: throw new ArgumentException(string.Format("Parameter '{0}' has unknown type '{1}'", key, property.PropertyType)); } } } }