public List <ExpressionInfo> GenerateOptionals(List <ExpressionInfo> predicates, int numOptionals, int minClause, int maxClause)
        {
            var optionals = new List <ExpressionInfo>();

            for (var i = 0; i < numOptionals; ++i)
            {
                var clauses     = minClause + Rand.Next(maxClause - minClause);
                var expressions = new List <ExpressionInfo>();
                var used        = new List <int>();
                for (var j = 0; j < clauses; ++j)
                {
                    int choice;
                    do
                    {
                        choice = Rand.Next(predicates.Count);
                    }while (used.Contains(choice));

                    var predicate = predicates[choice];
                    if (j == 0)
                    {
                        var optional = Expression.MakeExpression(ExpressionFunctions.Lookup(ExpressionType.Optional), predicate.Expression);
                        if (Rand.NextDouble() < 0.25)
                        {
                            optional = Expression.NotExpression(optional);
                        }

                        expressions.Add(new ExpressionInfo(optional, predicate.Bindings));
                    }
                    else
                    {
                        expressions.Add(predicate);
                    }

                    used.Add(choice);
                }

                var conjunction = Binary(ExpressionType.And, expressions, out var bindings);
                optionals.Add(new ExpressionInfo(conjunction, bindings));
            }

            return(optionals);
        }
示例#2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Expression"/> class.
 /// Built-in expression constructor.
 /// </summary>
 /// <param name="type">Type of built-in expression from <see cref="ExpressionType"/>.</param>
 /// <param name="children">Child expressions.</param>
 public Expression(string type, params Expression[] children)
 {
     Evaluator = ExpressionFunctions.Lookup(type);
     Children  = children;
 }