public double Evaluate(Array arguments) { var obj = TypedModel.Activate(); TypedModel.TypedParameters.ForEach((p, i) => p.SetValue(obj, arguments.GetValue(i))); return(Eval(obj)); }
/// <summary> /// Try analyze a type as a Model /// </summary> /// <param name="type">Type</param> /// <returns>a Model instance if success, or null</returns> public static TypedModel Analyze(Type type) { var tAttr = type.GetCustomAttribute <ModelAttribute>(); if (tAttr == null) { return(null); } var name = tAttr.Name ?? type.Name; var model = new TypedModel { Type = type, Name = name }; var members = type.GetMembers(); foreach (var member in members) { if (member.GetCustomAttribute <ParameterAttribute>() != null) { var p = TypedParameter.Create(model, member); if (p != null) { model._parameters.Add(p); } } if (member.GetCustomAttribute <ConstraintAttribute>() != null) { var c = MemberTypedConstraint.Create(model, member); if (c != null) { model._constraints.Add(c); } } if (member.GetCustomAttribute <ObjectiveAttribute>() != null) { var o = MethodTypedObjective.Create(model, member); if (o != null) { model._objectives.Add(o); } } } model._parameters.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal)); model._constraints.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal)); model._objectives.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal)); return(model); }