Сгенерированные методы для полиномиальной оценки

Никогда. Когда-либо. Если у Вас есть переменное затенение, Ваши соглашения о присвоении имен находятся на трещине. Я не имею в виду, действительно, именования различения для членских переменных? Фейспалм

5
задан Sam Harwell 27 October 2009 в 14:54
поделиться

1 ответ

Zenity работает под Linux и Windows и может быть вызван напрямую из Python:

import os
os.system('zenity --info --text="Stuff"')

Необходимо захватить возвращаемые значения из ящиков вопросов. для действий, однако, что является более сложным, и вам нужно научиться взаимодействовать с подпроцессами и т. д.

Его также можно использовать с интерфейсом PyZenity , который упрощает захват возвращаемых значений :

from PyZenity import InfoMessage
InfoMessage('Stuff')

Я тестировал PyZenity как в Ubuntu, так и в Windows XP, и он работает в обоих.

Zenity looks pretty good in Gnome Zenity looks good in KDE, too, suprisingly Zenity in Windows has the wrong GTK theme

Я читал, что Zenity - это только GTK +, но я пробовал его в Gnome и KDE, и он выглядит нативно в обоих. Однако порт на Windows не выглядит родным, потому что он использует неправильную тему GTK?

Существуют также другие программы, такие как KDialog и Xdialog , которые могут быть связаны с аналогичным интерфейсом Python, который может проверять и видеть, какие исполняемые файлы доступны чтобы он обо всем автоматически позаботился? (Для KDialog также существует внешний интерфейс Ruby.)

Я также не знаю, работает ли PyZenity под OS X.

и PartialDerivative
  • ExpandVisitor - это внутренний вспомогательный тип, расширяющий выражения.
  • SimplifyVisitor - это внутренний вспомогательный тип, упрощающий выражения.
  • DerivativeVisitor - это внутренний вспомогательный тип, который принимает производная от выражения
  • ListPrintVisitor - это внутренний вспомогательный тип, который преобразует Expression в префиксную нотацию с синтаксисом Lisp
  • Symbolic

    public static class Symbolic
    {
        public static Expression Expand(Expression expression)
        {
            return new ExpandVisitor().Visit(expression);
        }
    
        public static Expression Simplify(Expression expression)
        {
            return new SimplifyVisitor().Visit(expression);
        }
    
        public static Expression PartialDerivative(Expression expression, ParameterExpression parameter)
        {
            bool totalDerivative = false;
            return new DerivativeVisitor(parameter, totalDerivative).Visit(expression);
        }
    
        public static string ToString(Expression expression)
        {
            ConstantExpression result = (ConstantExpression)new ListPrintVisitor().Visit(expression);
            return result.Value.ToString();
        }
    }
    

    Расширение выражений с помощью ExpandVisitor

    internal class ExpandVisitor : ExpressionVisitor
    {
        protected override Expression VisitBinary(BinaryExpression node)
        {
            var left = Visit(node.Left);
            var right = Visit(node.Right);
    
            if (node.NodeType == ExpressionType.Multiply)
            {
                Expression[] leftNodes = GetAddedNodes(left).ToArray();
                Expression[] rightNodes = GetAddedNodes(right).ToArray();
                var result =
                    leftNodes
                    .SelectMany(x => rightNodes.Select(y => Expression.Multiply(x, y)))
                    .Aggregate((sum, term) => Expression.Add(sum, term));
    
                return result;
            }
    
            if (node.Left == left && node.Right == right)
                return node;
    
            return Expression.MakeBinary(node.NodeType, left, right, node.IsLiftedToNull, node.Method, node.Conversion);
        }
    
        /// <summary>
        /// Treats the <paramref name="node"/> as the sum (or difference) of one or more child nodes and returns the
        /// the individual addends in the sum.
        /// </summary>
        private static IEnumerable<Expression> GetAddedNodes(Expression node)
        {
            BinaryExpression binary = node as BinaryExpression;
            if (binary != null)
            {
                switch (binary.NodeType)
                {
                case ExpressionType.Add:
                    foreach (var n in GetAddedNodes(binary.Left))
                        yield return n;
    
                    foreach (var n in GetAddedNodes(binary.Right))
                        yield return n;
    
                    yield break;
    
                case ExpressionType.Subtract:
                    foreach (var n in GetAddedNodes(binary.Left))
                        yield return n;
    
                    foreach (var n in GetAddedNodes(binary.Right))
                        yield return Expression.Negate(n);
    
                    yield break;
    
                default:
                    break;
                }
            }
    
            yield return node;
        }
    }
    

    Получение производной с помощью DerivativeVisitor

    internal class DerivativeVisitor : ExpressionVisitor
    {
        private ParameterExpression _parameter;
        private bool _totalDerivative;
    
        public DerivativeVisitor(ParameterExpression parameter, bool totalDerivative)
        {
            if (_totalDerivative)
                throw new NotImplementedException();
    
            _parameter = parameter;
            _totalDerivative = totalDerivative;
        }
    
        protected override Expression VisitBinary(BinaryExpression node)
        {
            switch (node.NodeType)
            {
            case ExpressionType.Add:
            case ExpressionType.Subtract:
                return Expression.MakeBinary(node.NodeType, Visit(node.Left), Visit(node.Right));
    
            case ExpressionType.Multiply:
                return Expression.Add(Expression.Multiply(node.Left, Visit(node.Right)), Expression.Multiply(Visit(node.Left), node.Right));
    
            case ExpressionType.Divide:
                return Expression.Divide(Expression.Subtract(Expression.Multiply(Visit(node.Left), node.Right), Expression.Multiply(node.Left, Visit(node.Right))), Expression.Power(node.Right, Expression.Constant(2)));
    
            case ExpressionType.Power:
                if (node.Right is ConstantExpression)
                {
                    return Expression.Multiply(node.Right, Expression.Multiply(Visit(node.Left), Expression.Subtract(node.Right, Expression.Constant(1))));
                }
                else if (node.Left is ConstantExpression)
                {
                    return Expression.Multiply(node, MathExpressions.Log(node.Left));
                }
                else
                {
                    return Expression.Multiply(node, Expression.Add(
                        Expression.Multiply(Visit(node.Left), Expression.Divide(node.Right, node.Left)),
                        Expression.Multiply(Visit(node.Right), MathExpressions.Log(node.Left))
                        ));
                }
    
            default:
                throw new NotImplementedException();
            }
        }
    
        protected override Expression VisitConstant(ConstantExpression node)
        {
            return MathExpressions.Zero;
        }
    
        protected override Expression VisitInvocation(InvocationExpression node)
        {
            MemberExpression memberExpression = node.Expression as MemberExpression;
            if (memberExpression != null)
            {
                var member = memberExpression.Member;
                if (member.DeclaringType != typeof(Math))
                    throw new NotImplementedException();
    
                switch (member.Name)
                {
                case "Log":
                    return Expression.Divide(Visit(node.Expression), node.Expression);
    
                case "Log10":
                    return Expression.Divide(Visit(node.Expression), Expression.Multiply(Expression.Constant(Math.Log(10)), node.Expression));
    
                case "Exp":
                case "Sin":
                case "Cos":
                default:
                    throw new NotImplementedException();
                }
            }
    
            throw new NotImplementedException();
        }
    
        protected override Expression VisitParameter(ParameterExpression node)
        {
            if (node == _parameter)
                return MathExpressions.One;
    
            return MathExpressions.Zero;
        }
    }
    

    Упрощение выражений с помощью SimplifyVisitor

    internal class SimplifyVisitor : ExpressionVisitor
    {
        protected override Expression VisitBinary(BinaryExpression node)
        {
            var left = Visit(node.Left);
            var right = Visit(node.Right);
    
            ConstantExpression leftConstant = left as ConstantExpression;
            ConstantExpression rightConstant = right as ConstantExpression;
            if (leftConstant != null && rightConstant != null
                && (leftConstant.Value is double) && (rightConstant.Value is double))
            {
                double leftValue = (double)leftConstant.Value;
                double rightValue = (double)rightConstant.Value;
    
                switch (node.NodeType)
                {
                case ExpressionType.Add:
                    return Expression.Constant(leftValue + rightValue);
                case ExpressionType.Subtract:
                    return Expression.Constant(leftValue - rightValue);
                case ExpressionType.Multiply:
                    return Expression.Constant(leftValue * rightValue);
                case ExpressionType.Divide:
                    return Expression.Constant(leftValue / rightValue);
                default:
                    throw new NotImplementedException();
                }
            }
    
            switch (node.NodeType)
            {
            case ExpressionType.Add:
                if (IsZero(left))
                    return right;
                if (IsZero(right))
                    return left;
                break;
    
            case ExpressionType.Subtract:
                if (IsZero(left))
                    return Expression.Negate(right);
                if (IsZero(right))
                    return left;
                break;
    
            case ExpressionType.Multiply:
                if (IsZero(left) || IsZero(right))
                    return MathExpressions.Zero;
                if (IsOne(left))
                    return right;
                if (IsOne(right))
                    return left;
                break;
    
            case ExpressionType.Divide:
                if (IsZero(right))
                    throw new DivideByZeroException();
                if (IsZero(left))
                    return MathExpressions.Zero;
                if (IsOne(right))
                    return left;
                break;
    
            default:
                throw new NotImplementedException();
            }
    
            return Expression.MakeBinary(node.NodeType, left, right);
        }
    
        protected override Expression VisitUnary(UnaryExpression node)
        {
            var operand = Visit(node.Operand);
    
            ConstantExpression operandConstant = operand as ConstantExpression;
            if (operandConstant != null && (operandConstant.Value is double))
            {
                double operandValue = (double)operandConstant.Value;
    
                switch (node.NodeType)
                {
                case ExpressionType.Negate:
                    if (operandValue == 0.0)
                        return MathExpressions.Zero;
    
                    return Expression.Constant(-operandValue);
    
                default:
                    throw new NotImplementedException();
                }
            }
    
            switch (node.NodeType)
            {
            case ExpressionType.Negate:
                if (operand.NodeType == ExpressionType.Negate)
                {
                    return ((UnaryExpression)operand).Operand;
                }
    
                break;
    
            default:
                throw new NotImplementedException();
            }
    
            return Expression.MakeUnary(node.NodeType, operand, node.Type);
        }
    
        private static bool IsZero(Expression expression)
        {
            ConstantExpression constant = expression as ConstantExpression;
            if (constant != null)
            {
                if (constant.Value.Equals(0.0))
                    return true;
            }
    
            return false;
        }
    
        private static bool IsOne(Expression expression)
        {
            ConstantExpression constant = expression as ConstantExpression;
            if (constant != null)
            {
                if (constant.Value.Equals(1.0))
                    return true;
            }
    
            return false;
        }
    }
    

    Форматирование выражений для отображения с помощью ListPrintVisitor

    internal class ListPrintVisitor : ExpressionVisitor
    {
        protected override Expression VisitBinary(BinaryExpression node)
        {
            string op = null;
    
            switch (node.NodeType)
            {
            case ExpressionType.Add:
                op = "+";
                break;
            case ExpressionType.Subtract:
                op = "-";
                break;
            case ExpressionType.Multiply:
                op = "*";
                break;
            case ExpressionType.Divide:
                op = "/";
                break;
            default:
                throw new NotImplementedException();
            }
    
            var left = Visit(node.Left);
            var right = Visit(node.Right);
            string result = string.Format("({0} {1} {2})", op, ((ConstantExpression)left).Value, ((ConstantExpression)right).Value);
            return Expression.Constant(result);
        }
    
        protected override Expression VisitConstant(ConstantExpression node)
        {
            if (node.Value is string)
                return node;
    
            return Expression.Constant(node.Value.ToString());
        }
    
        protected override Expression VisitParameter(ParameterExpression node)
        {
            return Expression.Constant(node.Name);
        }
    }
    

    Проверка результатов

    [TestMethod]
    public void BasicSymbolicTest()
    {
        ParameterExpression x = Expression.Parameter(typeof(double), "x");
        Expression linear = Expression.Add(Expression.Constant(3.0), x);
        Assert.AreEqual("(+ 3 x)", Symbolic.ToString(linear));
    
        Expression quadratic = Expression.Multiply(linear, Expression.Add(Expression.Constant(2.0), x));
        Assert.AreEqual("(* (+ 3 x) (+ 2 x))", Symbolic.ToString(quadratic));
    
        Expression expanded = Symbolic.Expand(quadratic);
        Assert.AreEqual("(+ (+ (+ (* 3 2) (* 3 x)) (* x 2)) (* x x))", Symbolic.ToString(expanded));
        Assert.AreEqual("(+ (+ (+ 6 (* 3 x)) (* x 2)) (* x x))", Symbolic.ToString(Symbolic.Simplify(expanded)));
    
        Expression derivative = Symbolic.PartialDerivative(expanded, x);
        Assert.AreEqual("(+ (+ (+ (+ (* 3 0) (* 0 2)) (+ (* 3 1) (* 0 x))) (+ (* x 0) (* 1 2))) (+ (* x 1) (* 1 x)))", Symbolic.ToString(derivative));
    
        Expression simplified = Symbolic.Simplify(derivative);
        Assert.AreEqual("(+ 5 (+ x x))", Symbolic.ToString(simplified));
    }
    
    6
    ответ дан 14 December 2019 в 13:40
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: