public void Visit(FuncExpression <T> expression) { if (_random.NextDouble() < _mutationRate.GetValue()) { MutateFuncExpression(expression); } }
public void Evaluate_WhenCalled_ReturnsExpected() { var expression = new FuncExpression <SomeClass>() { Left = new ValueExpression <SomeClass>(5.0), Right = new ValueExpression <SomeClass>(9.0), Operation = new Operation((a, b) => a + b, "+"), }; var someClass = new SomeClass(); Assert.That(expression.Evaluate(someClass), Is.EqualTo(14.0)); }
private void MutateFuncExpression(FuncExpression <T> expression) { var rand = _random.NextDouble(); if (rand < 0.33) { expression.Left = _expressionGenerator.GetRandomExpression(); } else if (rand < 0.67) { expression.Right = _expressionGenerator.GetRandomExpression(); } else { expression.Operation = _expressionGenerator.GetRandomOperation(); } }
public void Evaluate_WhenClonedAndCloneHasRightChanged_Unchanged() { var expression = new FuncExpression <SomeClass>() { Left = new ValueExpression <SomeClass>(5.0), Right = new ValueExpression <SomeClass>(9.0), Operation = new Operation((a, b) => a + b, "+"), }; var clone = (FuncExpression <SomeClass>)expression.Clone(); clone.Right = new ValueExpression <SomeClass>(3.0); var someClass = new SomeClass(); Assert.That(expression.Evaluate(someClass), Is.EqualTo(14.0)); Assert.That(clone.Evaluate(someClass), Is.EqualTo(8.0)); }
/// <summary> /// Creates an expression from a 2-argument function delegate /// </summary> /// <typeparam name="X1">The type of the delegate's first argument</typeparam> /// <typeparam name="X2">The type of the delegate's second argument</typeparam> /// <typeparam name="Y">The delegate return type</typeparam> /// <param name="f"></param> /// <returns></returns> public static Expression <Func <X1, X2, Y> > funcx <X1, X2, Y>(Func <X1, X2, Y> f) => FuncExpression.make(f);
//public static Converter converter(MethodInfo m) //{ // var src = Expression.Parameter(typeof(object), "src"); // var convert = Expression.Convert(src, m.GetParameters()[0].ParameterType); // var callResult = Expression.Call(null, m, convert); // var result = Expression.Convert(callResult, typeof(object)); // return Expression.Lambda<Converter>(result, src).Compile(); //} //public static Converter<TDst> converter<TDst>(MethodInfo m) //{ // var src = Expression.Parameter(typeof(object), "src"); // var convert = Expression.Convert(src, m.GetParameters()[0].ParameterType); // var callResult = Expression.Call(null, m, convert); // return Expression.Lambda<Converter<TDst>>(callResult, src).Compile(); //} /// <summary> /// Creates an expression from a parameterless function delegate delegate /// </summary> /// <typeparam name="T">The delegate return type</typeparam> /// <param name="f"></param> /// <returns></returns> public static Expression <Func <T> > funcx <T>(Func <T> f) => FuncExpression.make(f);
static FuncExpression <X, Y> Converter() => FuncExpression.make((X x) => (Y)Convert.ChangeType(x, typeof(Y)));