public double Evaluate(Array arguments)
        {
            var obj = TypedModel.Activate();

            TypedModel.TypedParameters.ForEach((p, i) => p.SetValue(obj, arguments.GetValue(i)));
            return(Eval(obj));
        }
Exemple #2
0
        /// <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);
        }