private Expression ConvertDiffExpression(Cherimoya.Expressions.FunctionCallExpression e) { Expression f = Convert(e.Parameters[0]); return(new DiffExpression( e.MethodName == "pdiff", f is BinaryExpression ? new ParantheseExpression() { Body = f } : f, new TextExpression((string)(e.Parameters[1] as Cherimoya.Expressions.ConstantExpression).Value, false))); }
private Expression ConvertFunctionCallExpression(Cherimoya.Expressions.FunctionCallExpression e, int parantheseLevel) { if (e.Method.Name == "root") { if ((e.Parameters[1] is Cherimoya.Expressions.ConstantExpression) && Types.ConvertValue <int>((e.Parameters[1] as Cherimoya.Expressions.ConstantExpression).Value) == 2) { return(new RootExpression() { X = Convert(e.Parameters[0], parantheseLevel) }); } else { return(new RootExpression() { X = Convert(e.Parameters[0], parantheseLevel), Root = Convert(e.Parameters[1], parantheseLevel) }); } } else if (e.Method.Name == "abs") { return(new AbsExpression() { Operand = Convert(e.Parameters[0], parantheseLevel) }); } else if (e.Method.Name == "pow") { bool hasParanthese = e.Parameters[0] is Cherimoya.Expressions.BinaryExpression; Expression operand = Convert(e.Parameters[0], parantheseLevel + (hasParanthese ? 1 : 0)); if (hasParanthese) { operand = new ParantheseExpression() { Body = operand }; } return(new PowExpression() { X = operand, Pow = Convert(e.Parameters[1], parantheseLevel) }); } else if (e.Method.Name == "sum") { Cherimoya.Expressions.Expression right = e.Parameters[0]; bool hasParanthese = right is Cherimoya.Expressions.BinaryExpression; Expression operand = Convert(right, parantheseLevel + (hasParanthese ? 1 : 0)); if (hasParanthese) { operand = new ParantheseExpression() { Body = operand }; } return(new SumExpression() { Sigmas = new SigmaConfig[] { new SigmaConfig() }, Operand = operand }); } else if (e.Method.Name == "lg" || e.Method.Name == "ln" || e.Method.Name == "log") { Cherimoya.Expressions.Expression xExpr = e.Method.Name == "log" ? e.Parameters[1] : e.Parameters[0]; bool hasParanthese = xExpr is Cherimoya.Expressions.BinaryExpression && (xExpr as Cherimoya.Expressions.BinaryExpression).Operator != Cherimoya.Expressions.BinaryOperator.Divide; Expression b = e.Method.Name == "log" ? Convert(e.Parameters[0], parantheseLevel) : null; Expression x = hasParanthese ? new ParantheseExpression() { Body = Convert(xExpr, parantheseLevel + 1) } : Convert(xExpr, parantheseLevel); return(new LogExpression(e.Method.Name, b, x)); } else if (e.Method.Name == "transpose") { return(new SuperscriptExpression() { Body = Convert(e.Parameters[0], parantheseLevel), Superscript = new TextExpression("T", false), HasBracket = true }); } else if (e.Method.Name == "stdvar") { return(new SubscriptExpression() { Body = new TextExpression("σ", false), Subscript = Convert(e.Parameters[0], parantheseLevel), ShiftOffset = 10 }); } else if (e.Method.Name == "average") { return(new UpperlineExpression() { Body = Convert(e.Parameters[0], parantheseLevel) }); } else if (e.Method.Name == "diff" || e.Method.Name == "pdiff") { return(ConvertDiffExpression(e)); } else { return(new FunctionExpression() { Name = e.MethodName, Operands = e.Parameters.Select(i => Convert(i, parantheseLevel + 1)).ToArray(), ParantheseLevel = parantheseLevel }); } }