public IVariable Calculate(IMilpManager milpManager, OperationType type, params IVariable[] arguments)
        {
            if (!SupportsOperation(type, arguments))
            {
                throw new NotSupportedException(SolverUtilities.FormatUnsupportedMessage(type, arguments));
            }
            if (arguments.Length == 1)
            {
                return(arguments[0]);
            }
            if (MultiplyOnlyConstants(arguments))
            {
                var result = arguments.Select(a => a.ConstantValue.Value).Aggregate((a, b) => a * b);
                if (arguments.All(a => a.IsInteger()))
                {
                    return(milpManager.FromConstant((int)result));
                }
                else
                {
                    return(milpManager.FromConstant(result));
                }
            }

            var domain = CalculateDomain(arguments);

            if (MultiplyAtMostOneNonconstant(arguments))
            {
                return(arguments.Aggregate((x, y) =>
                {
                    var result = y.IsConstant()
                        ? milpManager.MultiplyVariableByConstant(x, y, domain)
                        : milpManager.MultiplyVariableByConstant(y, x, domain);
                    result.ConstantValue = x.ConstantValue * y.ConstantValue;
                    result.Expression = $"{x.FullExpression()} * {y.FullExpression()}";
                    return result;
                }));
            }

            if (MultiplyBinaryVariables(arguments))
            {
                return(milpManager.Operation(OperationType.Conjunction, arguments));
            }

            return(MultiplyIntegers(milpManager, domain, arguments));
        }
        public IVariable Calculate(IMilpManager milpManager, OperationType type, params IVariable[] arguments)
        {
            if (!SupportsOperation(type, arguments)) throw new NotSupportedException(SolverUtilities.FormatUnsupportedMessage(type, arguments));
            if (arguments.Length == 1)
            {
                return arguments[0];
            }
            if (MultiplyOnlyConstants(arguments))
            {
                var result = arguments.Select(a => a.ConstantValue.Value).Aggregate((a, b) => a*b);
                if (arguments.All(a => a.IsInteger()))
                {
                    return milpManager.FromConstant((int) result);
                }
                else
                {
                    return milpManager.FromConstant(result);
                }
            }

            var domain = CalculateDomain(arguments);

            if (MultiplyAtMostOneNonconstant(arguments))
            {
                return arguments.Aggregate((x, y) =>
                {
                    var result = y.IsConstant()
                        ? milpManager.MultiplyVariableByConstant(x, y, domain)
                        : milpManager.MultiplyVariableByConstant(y, x, domain);
                    result.ConstantValue = x.ConstantValue*y.ConstantValue;
                    result.Expression = $"{x.FullExpression()} * {y.FullExpression()}";
                    return result;
                });
            }

            if (MultiplyBinaryVariables(arguments))
            {
                return milpManager.Operation(OperationType.Conjunction, arguments);
            }

            return MultiplyIntegers(milpManager, domain, arguments);
        }