Ejemplo n.º 1
0
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var     operation     = (EquationBinaryOperationBase)term;
            decimal constantValue = ((EquationConstant)operation.Right).Value;

            return(new AdditionOperation(operation.Left, new EquationConstant(constantValue * decimal.MinusOne)));
        }
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var operation = (EquationBinaryOperationBase)term;

            EquationTermBase result;

            if (MatchShiftRight(operation))
            {
                var leftOperation = (EquationBinaryOperationBase)operation.Left;

                decimal multiplier = ((EquationConstant)leftOperation.Left).Value;

                leftOperation.Left = CreateConstant(multiplier + decimal.One);

                result = leftOperation;
            }
            else
            {
                var rightOperation = (EquationBinaryOperationBase)operation.Right;

                decimal multiplier = ((EquationConstant)rightOperation.Left).Value;
                rightOperation.Left = CreateConstant(multiplier + decimal.One);

                result = rightOperation;
            }

            return(result);
        }
        public bool TermMatchRule(EquationTermBase term)
        {
            bool matched = term is EquationBinaryOperationBase operation &&
                           operation.Type == OperationsEnum.Subtraction &&
                           operation.Right is EquationVariable;

            return(matched);
        }
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var operation = (EquationBinaryOperationBase)term;

            return(new AdditionOperation(
                       left: operation.Left,
                       right: new MultiplicationOperation(CreateConstant(decimal.MinusOne), operation.Right)));
        }
Ejemplo n.º 5
0
        public bool TermMatchRule(EquationTermBase term)
        {
            bool matched =
                term is EquationBinaryOperationBase operation &&
                operation.Left is EquationConstant &&
                operation.Right is EquationConstant;

            return(matched);
        }
Ejemplo n.º 6
0
        public override bool TermMatchRule(EquationTermBase term)
        {
            bool matched = term is EquationBinaryOperationBase operation &&
                           operation.Type == OperationsEnum.Multiplication &&
                           operation.Left is EquationVariable &&
                           operation.Right is EquationConstant;

            return(matched);
        }
 public bool TermMatchRule(EquationTermBase term)
 {
     bool matched = term is EquationBinaryOperationBase operation &&
                    operation.Type == OperationsEnum.Addition &&
                    (
         MatchShiftRight(operation) ||
         MatchShiftLeft(operation)
                    );
 }
Ejemplo n.º 8
0
        public bool TermMatchRule(EquationTermBase term)
        {
            if (!(term is EquationBinaryOperationBase operation))
            {
                return false;
            }

            return operation.Right.IsZero() || operation.Left.IsZero();
        }
Ejemplo n.º 9
0
        public bool TermMatchRule(EquationTermBase term)
        {
            bool matched = term is EquationBinaryOperationBase operation &&
                           operation.Type == OperationsEnum.Multiplication &&
                           operation.Left is EquationVariable left &&
                           operation.Right is EquationVariable right &&
                           left.Name.CompareTo(right.Name) > 0;

            return(matched);
        }
Ejemplo n.º 10
0
        public bool TermMatchRule(EquationTermBase term)
        {
            bool matched = term is EquationBinaryOperationBase operation &&
                           (
                MatchShiftRight(operation) ||
                MatchShiftLeft(operation)
                           );

            return(matched);
        }
Ejemplo n.º 11
0
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var operation = (EquationBinaryOperationBase)term;
            var buffer    = operation.Left;

            operation.Left  = operation.Right;
            operation.Right = buffer;

            return(term);
        }
Ejemplo n.º 12
0
        public bool TermMatchRule(EquationTermBase term)
        {
            bool matched =
                term is EquationBinaryOperationBase operation &&
                operation.Type == OperationsEnum.Addition &&
                operation.Left is EquationVariable left &&
                operation.Right is EquationVariable right &&
                left.Name == right.Name;

            return(matched);
        }
Ejemplo n.º 13
0
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var operation = (EquationBinaryOperationBase) term;

            return operation.Type switch
            {
                OperationsEnum.Addition       => ProcessAddition(operation),
                OperationsEnum.Subtraction    => ProcessSubtraction(operation),
                OperationsEnum.Multiplication => ProcessMultiplication(operation),
                OperationsEnum.Division       => ProcessDivision(operation),
                OperationsEnum.Exponentiation => ProcessExponentiation(operation),
                _                             => throw new InvalidEnumArgumentException(nameof(operation.Type), (int) operation.Type, typeof(OperationsEnum))
            };
        }
Ejemplo n.º 14
0
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var operation = (EquationBinaryOperationBase)term;

            decimal value = operation.Type switch
            {
                OperationsEnum.Addition => Left(operation) + Right(operation),
                OperationsEnum.Subtraction => Left(operation) - Right(operation),
                OperationsEnum.Multiplication => Left(operation) * Right(operation),
                OperationsEnum.Division => Left(operation) / Right(operation),
                //теряется разрядность, в случае требования к большей точности - переработать
                OperationsEnum.Exponentiation => (decimal)Math.Pow((double)Left(operation), (double)Right(operation)),
                _ => throw new InvalidEnumArgumentException(nameof(operation.Type))
            };

            return(new EquationConstant(value));
        }
Ejemplo n.º 15
0
        public EquationTermBase Invoke(EquationTermBase term)
        {
            var operation = (EquationBinaryOperationBase)term;

            AdditionOperation result;

            if (MatchShiftRight(operation))
            {
                var leftOperation = (EquationBinaryOperationBase)operation.Left;

                result = new AdditionOperation(leftOperation.Right, new AdditionOperation(leftOperation.Left, operation.Right));
            }
            else
            {
                var rightOperation = (EquationBinaryOperationBase)operation.Right;
                result = new AdditionOperation(rightOperation.Right, new AdditionOperation(rightOperation.Left, operation.Left));
            }

            return(result);
        }
Ejemplo n.º 16
0
        public EquationTermBase Simplify(EquationTermBase term)
        {
            var simplified = false;

            do
            {
                foreach (var rule in _rules)
                {
                    simplified = TrySimplify(rule, term, out var simplifiedTerm);
                    if (!simplified)
                    {
                        continue;
                    }

                    term = simplifiedTerm;
                    break;
                }
            } while (simplified);

            return(term);
        }
Ejemplo n.º 17
0
        private static bool TrySimplify(IRule rule, EquationTermBase term, out EquationTermBase simplified)
        {
            if (!(term is EquationBinaryOperationBase operation))
            {
                simplified = term;
                return(false);
            }

            var termSimplified = false;

            bool leftSimplified = TrySimplify(rule, operation.Left, out var simplifiedLeft);

            if (leftSimplified)
            {
                operation.Left = simplifiedLeft;
            }

            bool rightSimplified = TrySimplify(rule, operation.Right, out var simplifiedRight);

            if (rightSimplified)
            {
                operation.Right = simplifiedRight;
            }

            termSimplified |= leftSimplified;
            termSimplified |= rightSimplified;

            if (rule.TermMatchRule(operation))
            {
                simplified = rule.Invoke(operation);
                return(true);
            }

            simplified = operation;
            return(termSimplified);
        }
Ejemplo n.º 18
0
 public static bool IsZero(this EquationTermBase term) =>
 term is EquationConstant constant &&
Ejemplo n.º 19
0
 public DivisionOperation(EquationTermBase left, EquationTermBase right) : base(OperationsEnum.Division, left, right)
 {
 }
 public EquationTermBase Invoke(EquationTermBase term)
 {
     throw new System.NotImplementedException();
 }
Ejemplo n.º 21
0
 public EquationTermBase SwapSides(EquationTermBase left, EquationTermBase right)
 {
     return(new SubtractionOperation(left, right));
 }
Ejemplo n.º 22
0
 public AdditionOperation(EquationTermBase left, EquationTermBase right) : base(OperationsEnum.Addition, left, right)
 {
 }
Ejemplo n.º 23
0
 protected EquationBinaryOperationBase(OperationsEnum type, EquationTermBase left, EquationTermBase right) : base(type)
 {
     this.Left  = left;
     this.Right = right;
 }
Ejemplo n.º 24
0
 public abstract bool TermMatchRule(EquationTermBase term);
Ejemplo n.º 25
0
 public EquationTermBase Invoke(EquationTermBase term)
 {
     return(CreateZero());
 }
Ejemplo n.º 26
0
 public MultiplicationOperation(EquationTermBase left, EquationTermBase right) : base(OperationsEnum.Multiplication, left, right)
 {
 }
Ejemplo n.º 27
0
 private static decimal Value(EquationTermBase term) =>
 term is EquationConstant constant ? constant.Value : throw new ArgumentException("Unsupported type");
Ejemplo n.º 28
0
 public string Display(EquationTermBase term) =>
 term switch
 {
Ejemplo n.º 29
0
 public ExponentiationOperation(EquationTermBase left, EquationTermBase right) : base(OperationsEnum.Exponentiation, left, right)
 {
 }
Ejemplo n.º 30
0
        public EquationTermBase Invoke(EquationTermBase term)
        {
            char variableName = ((EquationVariable)((EquationBinaryOperationBase)term).Left).Name;

            return(new MultiplicationOperation(new EquationConstant(2), new EquationVariable(variableName)));
        }